From 7e2cf0c9c865fbdcbd5ef460822295fc22cc676b Mon Sep 17 00:00:00 2001 From: vladtechno Date: Wed, 20 May 2026 11:16:21 +1000 Subject: [PATCH] wip(mechanic): inflight damage-flow + vendor scheme + PhotoAnnotate + TT views MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Маркер «вот где остановилась mechanic-сессия» — не разбито по логическим коммитам, зафиксировано целиком чтобы не потерять при отвлечении/чекаутах. Modified: - pages/InspectionEditor.tsx — расширение damage-flow внутри редактора - pages/VehicleCard.tsx — vendor data + расширение карточки - pages/InspectionReview.tsx — обновлённый review - api/{auth,inspections,photos,vehicles}.ts — новые endpoints для TT + photo flow - components/damage-flow/DamageClassifyDialog.tsx — multi-step UI - components/vehicle-scheme/VendorVehicleScheme.tsx — SVG zone interaction - data/damageVocabulary.ts — обновлённый словарь повреждений - frontend index.html/manifest/icons — PWA-метаданные New (untracked): - components/damage-flow/PhotoAnnotateStep.tsx — новый шаг flow'а - components/tt/ — vendor TT-state UI - pages/TtStateDetail.tsx — экран осмотра вендора - recon/findings/damage_model.md + damage_vocabulary.json + scheme/ — recon docs Cleanup: удалены bash-garbage 'Last' и 'dict[str' из frontend/. --- mechanic-pwa/frontend/index.html | 10 +- mechanic-pwa/frontend/public/favicon.svg | 11 +- .../public/icons/apple-touch-icon.png | Bin 0 -> 8495 bytes .../frontend/public/icons/favicon-16.png | Bin 0 -> 410 bytes .../frontend/public/icons/favicon-32.png | Bin 0 -> 889 bytes .../frontend/public/icons/favicon-48.png | Bin 0 -> 1494 bytes .../frontend/public/icons/icon-192.png | Bin 2326 -> 9454 bytes .../frontend/public/icons/icon-512.png | Bin 6201 -> 88303 bytes .../public/icons/icon-maskable-512.png | Bin 0 -> 57876 bytes .../frontend/public/manifest.webmanifest | 9 +- mechanic-pwa/frontend/src/App.tsx | 2 + mechanic-pwa/frontend/src/api/auth.ts | 4 +- mechanic-pwa/frontend/src/api/inspections.ts | 10 + mechanic-pwa/frontend/src/api/photos.ts | 15 + mechanic-pwa/frontend/src/api/vehicles.ts | 73 ++ .../damage-flow/DamageClassifyDialog.tsx | 8 +- .../damage-flow/PhotoAnnotateStep.tsx | 247 ++++++ .../src/components/tt/TtDamageMap.tsx | 157 ++++ .../vehicle-scheme/VendorVehicleScheme.tsx | 72 ++ .../frontend/src/data/damageVocabulary.ts | 39 + .../frontend/src/pages/InspectionEditor.tsx | 181 +++- .../frontend/src/pages/InspectionReview.tsx | 95 ++- .../frontend/src/pages/TtStateDetail.tsx | 394 +++++++++ .../frontend/src/pages/VehicleCard.tsx | 159 ++-- recon/findings/damage_model.md | 79 ++ recon/findings/damage_vocabulary.json | 90 ++ recon/findings/scheme/api_endpoints.txt | 38 + recon/findings/scheme/circle_marker.txt | 6 + .../scheme/circle_template_context.txt | 30 + recon/findings/scheme/detail_parts/README.md | 76 ++ recon/findings/scheme/detail_svg_context.txt | 15 + .../scheme/exterior_scheme_complete.svg | 1 + recon/findings/scheme/salon_scheme.svg | 58 ++ recon/findings/scheme/strings_heap_damage.txt | 795 ++++++++++++++++++ recon/findings/scheme/svg_context.txt | 37 + .../scheme/touch_and_circle_context.txt | 58 ++ .../findings/scheme/us_large_0_offset2515.txt | 1 + .../scheme/us_large_10_offset109159.txt | 1 + .../scheme/us_large_11_offset111910.txt | 1 + .../scheme/us_large_12_offset114753.txt | 1 + .../scheme/us_large_13_offset118420.txt | 1 + .../scheme/us_large_14_offset120501.txt | 1 + .../scheme/us_large_15_offset122306.txt | 1 + .../scheme/us_large_16_offset124063.txt | 1 + .../scheme/us_large_17_offset125816.txt | 1 + .../scheme/us_large_18_offset127623.txt | 1 + .../scheme/us_large_19_offset132972.txt | 1 + .../scheme/us_large_1_offset84620.txt | 1 + .../scheme/us_large_20_offset137887.txt | 1 + .../scheme/us_large_21_offset138994.txt | 1 + .../scheme/us_large_22_offset140865.txt | 1 + .../scheme/us_large_23_offset142834.txt | 1 + .../scheme/us_large_24_offset144333.txt | 1 + .../scheme/us_large_25_offset147262.txt | 1 + .../scheme/us_large_26_offset153870.txt | 1 + .../scheme/us_large_27_offset155413.txt | 1 + .../scheme/us_large_28_offset156808.txt | 1 + .../scheme/us_large_29_offset158325.txt | 1 + .../scheme/us_large_2_offset89239.txt | 1 + .../scheme/us_large_30_offset159392.txt | 1 + .../scheme/us_large_31_offset160685.txt | 1 + .../scheme/us_large_32_offset162068.txt | 1 + .../scheme/us_large_33_offset167361.txt | 1 + .../scheme/us_large_34_offset172712.txt | 1 + .../scheme/us_large_35_offset183329.txt | 1 + .../scheme/us_large_36_offset184873.txt | 1 + .../scheme/us_large_37_offset187098.txt | 1 + .../scheme/us_large_38_offset188581.txt | 1 + .../scheme/us_large_39_offset190360.txt | 1 + .../scheme/us_large_3_offset90846.txt | 1 + .../scheme/us_large_40_offset197560.txt | 1 + .../scheme/us_large_41_offset202063.txt | 1 + .../scheme/us_large_42_offset210660.txt | 1 + .../scheme/us_large_43_offset212935.txt | 1 + .../scheme/us_large_44_offset221532.txt | 1 + .../scheme/us_large_45_offset223807.txt | 1 + .../scheme/us_large_46_offset232404.txt | 1 + .../scheme/us_large_47_offset234679.txt | 1 + .../scheme/us_large_48_offset243276.txt | 1 + .../scheme/us_large_49_offset245551.txt | 1 + .../scheme/us_large_4_offset92714.txt | 1 + .../scheme/us_large_50_offset324540.txt | 1 + .../scheme/us_large_51_offset330189.txt | 1 + .../scheme/us_large_52_offset332198.txt | 1 + .../scheme/us_large_53_offset333995.txt | 1 + .../scheme/us_large_54_offset338054.txt | 1 + .../scheme/us_large_55_offset342429.txt | 1 + .../scheme/us_large_56_offset344372.txt | 1 + .../scheme/us_large_57_offset348151.txt | 1 + .../scheme/us_large_58_offset353102.txt | 1 + .../scheme/us_large_59_offset358861.txt | 1 + .../scheme/us_large_5_offset94700.txt | 1 + .../scheme/us_large_60_offset363706.txt | 1 + .../scheme/us_large_61_offset369021.txt | 1 + .../scheme/us_large_62_offset376392.txt | 1 + .../scheme/us_large_63_offset378635.txt | 1 + .../scheme/us_large_64_offset380136.txt | 1 + .../scheme/us_large_65_offset383275.txt | 1 + .../scheme/us_large_66_offset386232.txt | 1 + .../scheme/us_large_67_offset391601.txt | 1 + .../scheme/us_large_68_offset397462.txt | 1 + .../scheme/us_large_69_offset403197.txt | 1 + .../scheme/us_large_6_offset95957.txt | 1 + .../scheme/us_large_70_offset408296.txt | 1 + .../scheme/us_large_71_offset413105.txt | 1 + .../scheme/us_large_72_offset420252.txt | 1 + .../scheme/us_large_73_offset428239.txt | 1 + .../scheme/us_large_74_offset436258.txt | 1 + .../scheme/us_large_75_offset441025.txt | 1 + .../scheme/us_large_76_offset446910.txt | 1 + .../scheme/us_large_77_offset452178.txt | 1 + .../scheme/us_large_78_offset453991.txt | 1 + .../scheme/us_large_79_offset456242.txt | 1 + .../scheme/us_large_7_offset99572.txt | 1 + .../scheme/us_large_80_offset458765.txt | 1 + .../scheme/us_large_81_offset462090.txt | 1 + .../scheme/us_large_82_offset465285.txt | 1 + .../scheme/us_large_83_offset468722.txt | 1 + .../scheme/us_large_84_offset470095.txt | 1 + .../scheme/us_large_85_offset473760.txt | 1 + .../scheme/us_large_86_offset475107.txt | 1 + .../scheme/us_large_87_offset478024.txt | 1 + .../scheme/us_large_88_offset479597.txt | 1 + .../scheme/us_large_89_offset482566.txt | 1 + .../scheme/us_large_8_offset103281.txt | 1 + .../scheme/us_large_90_offset483689.txt | 1 + .../scheme/us_large_91_offset488898.txt | 1 + .../scheme/us_large_92_offset494107.txt | 1 + .../scheme/us_large_93_offset509661.txt | 1 + .../scheme/us_large_9_offset106364.txt | 1 + recon/findings/scheme/us_strings_near_svg.txt | Bin 0 -> 3863 bytes recon/findings/scheme/zone_labels.json | 66 ++ 132 files changed, 2823 insertions(+), 106 deletions(-) create mode 100644 mechanic-pwa/frontend/public/icons/apple-touch-icon.png create mode 100644 mechanic-pwa/frontend/public/icons/favicon-16.png create mode 100644 mechanic-pwa/frontend/public/icons/favicon-32.png create mode 100644 mechanic-pwa/frontend/public/icons/favicon-48.png create mode 100644 mechanic-pwa/frontend/public/icons/icon-maskable-512.png create mode 100644 mechanic-pwa/frontend/src/components/damage-flow/PhotoAnnotateStep.tsx create mode 100644 mechanic-pwa/frontend/src/components/tt/TtDamageMap.tsx create mode 100644 mechanic-pwa/frontend/src/pages/TtStateDetail.tsx create mode 100644 recon/findings/damage_model.md create mode 100644 recon/findings/damage_vocabulary.json create mode 100644 recon/findings/scheme/api_endpoints.txt create mode 100644 recon/findings/scheme/circle_marker.txt create mode 100644 recon/findings/scheme/circle_template_context.txt create mode 100644 recon/findings/scheme/detail_parts/README.md create mode 100644 recon/findings/scheme/detail_svg_context.txt create mode 100644 recon/findings/scheme/exterior_scheme_complete.svg create mode 100644 recon/findings/scheme/salon_scheme.svg create mode 100644 recon/findings/scheme/strings_heap_damage.txt create mode 100644 recon/findings/scheme/svg_context.txt create mode 100644 recon/findings/scheme/touch_and_circle_context.txt create mode 100644 recon/findings/scheme/us_large_0_offset2515.txt create mode 100644 recon/findings/scheme/us_large_10_offset109159.txt create mode 100644 recon/findings/scheme/us_large_11_offset111910.txt create mode 100644 recon/findings/scheme/us_large_12_offset114753.txt create mode 100644 recon/findings/scheme/us_large_13_offset118420.txt create mode 100644 recon/findings/scheme/us_large_14_offset120501.txt create mode 100644 recon/findings/scheme/us_large_15_offset122306.txt create mode 100644 recon/findings/scheme/us_large_16_offset124063.txt create mode 100644 recon/findings/scheme/us_large_17_offset125816.txt create mode 100644 recon/findings/scheme/us_large_18_offset127623.txt create mode 100644 recon/findings/scheme/us_large_19_offset132972.txt create mode 100644 recon/findings/scheme/us_large_1_offset84620.txt create mode 100644 recon/findings/scheme/us_large_20_offset137887.txt create mode 100644 recon/findings/scheme/us_large_21_offset138994.txt create mode 100644 recon/findings/scheme/us_large_22_offset140865.txt create mode 100644 recon/findings/scheme/us_large_23_offset142834.txt create mode 100644 recon/findings/scheme/us_large_24_offset144333.txt create mode 100644 recon/findings/scheme/us_large_25_offset147262.txt create mode 100644 recon/findings/scheme/us_large_26_offset153870.txt create mode 100644 recon/findings/scheme/us_large_27_offset155413.txt create mode 100644 recon/findings/scheme/us_large_28_offset156808.txt create mode 100644 recon/findings/scheme/us_large_29_offset158325.txt create mode 100644 recon/findings/scheme/us_large_2_offset89239.txt create mode 100644 recon/findings/scheme/us_large_30_offset159392.txt create mode 100644 recon/findings/scheme/us_large_31_offset160685.txt create mode 100644 recon/findings/scheme/us_large_32_offset162068.txt create mode 100644 recon/findings/scheme/us_large_33_offset167361.txt create mode 100644 recon/findings/scheme/us_large_34_offset172712.txt create mode 100644 recon/findings/scheme/us_large_35_offset183329.txt create mode 100644 recon/findings/scheme/us_large_36_offset184873.txt create mode 100644 recon/findings/scheme/us_large_37_offset187098.txt create mode 100644 recon/findings/scheme/us_large_38_offset188581.txt create mode 100644 recon/findings/scheme/us_large_39_offset190360.txt create mode 100644 recon/findings/scheme/us_large_3_offset90846.txt create mode 100644 recon/findings/scheme/us_large_40_offset197560.txt create mode 100644 recon/findings/scheme/us_large_41_offset202063.txt create mode 100644 recon/findings/scheme/us_large_42_offset210660.txt create mode 100644 recon/findings/scheme/us_large_43_offset212935.txt create mode 100644 recon/findings/scheme/us_large_44_offset221532.txt create mode 100644 recon/findings/scheme/us_large_45_offset223807.txt create mode 100644 recon/findings/scheme/us_large_46_offset232404.txt create mode 100644 recon/findings/scheme/us_large_47_offset234679.txt create mode 100644 recon/findings/scheme/us_large_48_offset243276.txt create mode 100644 recon/findings/scheme/us_large_49_offset245551.txt create mode 100644 recon/findings/scheme/us_large_4_offset92714.txt create mode 100644 recon/findings/scheme/us_large_50_offset324540.txt create mode 100644 recon/findings/scheme/us_large_51_offset330189.txt create mode 100644 recon/findings/scheme/us_large_52_offset332198.txt create mode 100644 recon/findings/scheme/us_large_53_offset333995.txt create mode 100644 recon/findings/scheme/us_large_54_offset338054.txt create mode 100644 recon/findings/scheme/us_large_55_offset342429.txt create mode 100644 recon/findings/scheme/us_large_56_offset344372.txt create mode 100644 recon/findings/scheme/us_large_57_offset348151.txt create mode 100644 recon/findings/scheme/us_large_58_offset353102.txt create mode 100644 recon/findings/scheme/us_large_59_offset358861.txt create mode 100644 recon/findings/scheme/us_large_5_offset94700.txt create mode 100644 recon/findings/scheme/us_large_60_offset363706.txt create mode 100644 recon/findings/scheme/us_large_61_offset369021.txt create mode 100644 recon/findings/scheme/us_large_62_offset376392.txt create mode 100644 recon/findings/scheme/us_large_63_offset378635.txt create mode 100644 recon/findings/scheme/us_large_64_offset380136.txt create mode 100644 recon/findings/scheme/us_large_65_offset383275.txt create mode 100644 recon/findings/scheme/us_large_66_offset386232.txt create mode 100644 recon/findings/scheme/us_large_67_offset391601.txt create mode 100644 recon/findings/scheme/us_large_68_offset397462.txt create mode 100644 recon/findings/scheme/us_large_69_offset403197.txt create mode 100644 recon/findings/scheme/us_large_6_offset95957.txt create mode 100644 recon/findings/scheme/us_large_70_offset408296.txt create mode 100644 recon/findings/scheme/us_large_71_offset413105.txt create mode 100644 recon/findings/scheme/us_large_72_offset420252.txt create mode 100644 recon/findings/scheme/us_large_73_offset428239.txt create mode 100644 recon/findings/scheme/us_large_74_offset436258.txt create mode 100644 recon/findings/scheme/us_large_75_offset441025.txt create mode 100644 recon/findings/scheme/us_large_76_offset446910.txt create mode 100644 recon/findings/scheme/us_large_77_offset452178.txt create mode 100644 recon/findings/scheme/us_large_78_offset453991.txt create mode 100644 recon/findings/scheme/us_large_79_offset456242.txt create mode 100644 recon/findings/scheme/us_large_7_offset99572.txt create mode 100644 recon/findings/scheme/us_large_80_offset458765.txt create mode 100644 recon/findings/scheme/us_large_81_offset462090.txt create mode 100644 recon/findings/scheme/us_large_82_offset465285.txt create mode 100644 recon/findings/scheme/us_large_83_offset468722.txt create mode 100644 recon/findings/scheme/us_large_84_offset470095.txt create mode 100644 recon/findings/scheme/us_large_85_offset473760.txt create mode 100644 recon/findings/scheme/us_large_86_offset475107.txt create mode 100644 recon/findings/scheme/us_large_87_offset478024.txt create mode 100644 recon/findings/scheme/us_large_88_offset479597.txt create mode 100644 recon/findings/scheme/us_large_89_offset482566.txt create mode 100644 recon/findings/scheme/us_large_8_offset103281.txt create mode 100644 recon/findings/scheme/us_large_90_offset483689.txt create mode 100644 recon/findings/scheme/us_large_91_offset488898.txt create mode 100644 recon/findings/scheme/us_large_92_offset494107.txt create mode 100644 recon/findings/scheme/us_large_93_offset509661.txt create mode 100644 recon/findings/scheme/us_large_9_offset106364.txt create mode 100644 recon/findings/scheme/us_strings_near_svg.txt create mode 100644 recon/findings/scheme/zone_labels.json diff --git a/mechanic-pwa/frontend/index.html b/mechanic-pwa/frontend/index.html index 0919561..1f1da65 100644 --- a/mechanic-pwa/frontend/index.html +++ b/mechanic-pwa/frontend/index.html @@ -3,8 +3,16 @@ + + + + + - + + + + Premium Механик diff --git a/mechanic-pwa/frontend/public/favicon.svg b/mechanic-pwa/frontend/public/favicon.svg index 6893eb1..fb2b1b7 100644 --- a/mechanic-pwa/frontend/public/favicon.svg +++ b/mechanic-pwa/frontend/public/favicon.svg @@ -1 +1,10 @@ - \ No newline at end of file + + + + + + + diff --git a/mechanic-pwa/frontend/public/icons/apple-touch-icon.png b/mechanic-pwa/frontend/public/icons/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b601f7382821658dbec39dba424295991fbe663f GIT binary patch literal 8495 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�nYxbFlJr>2k=kf8&VBbKXVZu7@DO<@UZQ;PPlg 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 literal 0 HcmV?d00001 diff --git a/mechanic-pwa/frontend/public/icons/favicon-16.png b/mechanic-pwa/frontend/public/icons/favicon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..e54ce0cf9203a056a1089e9107614a7b3b70c374 GIT binary patch literal 410 zcmV;L0cHM)P)*aD802D<@>cwJF*Y!BWm^GVC z(=_wBd=y29h=@d#$z{Fl^yCPOVm(OecjxfryAGo6U~LV@=a++uo0}XF`1V zexq?ao6T~$+(kM)olIMIE#LEnz;6shB>9 zDJhDE#;DWnR&FZwy4LA-hQkpPNh#wpHMRyp;JR+=JY_vuz1}?tVOdtGRB}Bp*aUHz znp`;%6A>bsi^X;=%q##PaSSD9Qp(r&x0lsQ1_3GxATm)%WUtrD<+JNLyS_(9Oaq*$ z>M0@sY=}O?&^vmC7lAxMlK=n! literal 0 HcmV?d00001 diff --git a/mechanic-pwa/frontend/public/icons/favicon-32.png b/mechanic-pwa/frontend/public/icons/favicon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..e8e217949c18ec3aa1ff7e4d01a4395b49c76e99 GIT binary patch literal 889 zcmV-<1BU#GP))mD7Gt*twRXL1|{4)#eA&L*KxlC7AecyC_rRo9rYG0;lt^f0su@c5ZFMU%g zm&;dA%frg$a;a3hBvdH{0M^>Qy}jk-WdMkx=;D+-pjxdq{%%Z8PM(8YM4**!G#Y`Z zTCHBpk#Eh;&SqKGYPF0pS0ad_Xm@v)kdh=>T3P~tJhKqJQmG8i2839zzl`H}41(lc z((CrpG+kL)`J5v%1_0*1n;Q%U{a$}K7}j6b3kiy4{i73rd77ig4m$A?rLLed*an2#)=KW2r)E`ft7-N)DM6|H5@cZM(nRAGw z6c7>xD(e`vfk-QG&Jht2jdKDbBJ$pE zJ$UfLjT|Y*SmKK@oX^IyuUdd4z0DPuV4T5>{+e0I$`ao5~)u_7Lh25UhM2# zzg}kH@8{+ygzfF^si`US-r5NkCL*JCmbsftH$&hTJI}Q-CnqPBN(B*fkjqL$gorN7 zzMY;vK0dD1YMnP70ChGv8xDuU-0gK&e_U-go7b*QXU=)&5pfI+Jfim=5fM>qy}!SI zYyDQc-Bth~@}|>SU;n9IuWPLlk@APe5g9!?mpSi6gqhp6;1#W02cWleo)j^_C^KCXD?svOSFFhL{}J*K@`d_ P00000NkvXXu0mjfa@U+j literal 0 HcmV?d00001 diff --git a/mechanic-pwa/frontend/public/icons/favicon-48.png b/mechanic-pwa/frontend/public/icons/favicon-48.png new file mode 100644 index 0000000000000000000000000000000000000000..19c30a50a1c7b64e2fb14068f9b57bf6c65d6332 GIT binary patch literal 1494 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 diff --git a/mechanic-pwa/frontend/public/icons/icon-512.png b/mechanic-pwa/frontend/public/icons/icon-512.png index 946d039fd9964ced15dae62bb18828a3b41208ce..29da25a7e0a6d1fa3bf3f517bb3593a2a397358d 100644 GIT binary patch literal 88303 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 Dc9OAb diff --git a/mechanic-pwa/frontend/public/icons/icon-maskable-512.png b/mechanic-pwa/frontend/public/icons/icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d6cfa551666f59191cca1d90e2b2b3ca7c6f7a30 GIT binary patch literal 57876 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⋒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 s.token); @@ -22,6 +23,7 @@ export default function App() { } /> } /> } /> + } /> } /> ); diff --git a/mechanic-pwa/frontend/src/api/auth.ts b/mechanic-pwa/frontend/src/api/auth.ts index 7cad487..2d1c152 100644 --- a/mechanic-pwa/frontend/src/api/auth.ts +++ b/mechanic-pwa/frontend/src/api/auth.ts @@ -23,6 +23,8 @@ export async function login(input: LoginInput): Promise { const body = new URLSearchParams(); body.set("username", input.username); body.set("password", input.password); + // PWA — длинная сессия (30 дней) чтобы механики не вводили пароль каждые 8 ч. + body.set("long_session", "true"); const res = await fetch("/api/auth/login", { method: "POST", @@ -42,7 +44,7 @@ export async function login2fa(input: TwoFactorInput): Promise { const res = await fetch("/api/auth/2fa", { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify(input), + body: JSON.stringify({ ...input, long_session: true }), credentials: "include", // accept the trusted_device cookie on Set-Cookie }); if (!res.ok) { diff --git a/mechanic-pwa/frontend/src/api/inspections.ts b/mechanic-pwa/frontend/src/api/inspections.ts index a921650..b933f09 100644 --- a/mechanic-pwa/frontend/src/api/inspections.ts +++ b/mechanic-pwa/frontend/src/api/inspections.ts @@ -27,6 +27,7 @@ export interface PhotoSummary { slot_index: number; storage_key: string; thumb_key?: string | null; + annotated_key?: string | null; width?: number | null; height?: number | null; status: string; @@ -37,6 +38,7 @@ export interface MarkerSummary { id: number; inspection_id: number; photo_id?: number | null; + tt_image_id?: string | null; side?: string | null; x?: number | null; y?: number | null; @@ -103,4 +105,12 @@ export async function createMarker( .json(); } +export async function deleteInspection(inspectionId: number): Promise { + await api.delete(`inspections/${inspectionId}`); +} + +export async function deleteMarker(markerId: number): Promise { + await api.delete(`markers/${markerId}`); +} + export type { InspectionSummary }; diff --git a/mechanic-pwa/frontend/src/api/photos.ts b/mechanic-pwa/frontend/src/api/photos.ts index bf3b570..87b790a 100644 --- a/mechanic-pwa/frontend/src/api/photos.ts +++ b/mechanic-pwa/frontend/src/api/photos.ts @@ -14,12 +14,27 @@ export interface PhotoConfirmResponse { slot_index: number; storage_key: string; thumb_key?: string | null; + annotated_key?: string | null; width?: number | null; height?: number | null; status: string; taken_at: string; } +export async function uploadPhotoAnnotation( + inspectionId: number, + photoId: number, + blob: Blob, +): Promise { + const form = new FormData(); + form.append("file", blob, "annotation.jpg"); + return api + .post(`inspections/${inspectionId}/photos/${photoId}/annotation`, { + body: form, + }) + .json(); +} + export async function requestUploadUrl( inspectionId: number, args: { side: string; slot_index: number; content_type: string; size: number } diff --git a/mechanic-pwa/frontend/src/api/vehicles.ts b/mechanic-pwa/frontend/src/api/vehicles.ts index 80fb5a7..bf2fb89 100644 --- a/mechanic-pwa/frontend/src/api/vehicles.ts +++ b/mechanic-pwa/frontend/src/api/vehicles.ts @@ -12,6 +12,8 @@ export interface VehicleSummary { export interface VehicleDetail extends VehicleSummary { recent_inspections: InspectionSummary[]; + starline_mileage?: number | null; + starline_mileage_at?: string | null; } export interface InspectionSummary { @@ -36,3 +38,74 @@ export async function listVehicles(q?: string): Promise { export async function getVehicle(id: number): Promise { return api.get(`vehicles/${id}`).json(); } + +// ── TT-Control vendor archive (Element Mechanic) ─────────────────────────── + +export interface TtStateSummary { + id: number; + vendor_state_id: string; + unix_time: number | null; + mechanic_name: string | null; + mileage: number | null; + photos_count: number; + damages_count: number; +} + +export interface TtHistory { + vendor_vehicle_id: string | null; + plate?: string | null; + brand?: string | null; + model?: string | null; + states: TtStateSummary[]; +} + +export interface TtPhotoRef { + image_id: string; + image_with_lines_id: string | null; + unix_time: number | null; + guid: string | null; +} + +export interface TtDamage { + damage_type_id: number | null; + degree: number | null; + points: { x: number; y: number }[]; + guid: string | null; + unix_time: number | null; +} + +export interface TtSidePhoto { + image_id: string; + miniature_id: string | null; + photo_type: number | null; +} + +export interface TtStateDetail { + id: number; + vendor_state_id: string; + unix_time: number | null; + mechanic_name: string | null; + mileage: number | null; + side_photos: TtSidePhoto[]; + photos_by_zone: Record; + damages_by_zone: Record; +} + +export async function getTtHistory(vehicleId: number): Promise { + return api.get(`vehicles/${vehicleId}/tt-history`).json(); +} + +export async function getTtState(stateId: number): Promise { + return api.get(`tt-states/${stateId}`).json(); +} + +export async function deleteTtState(stateId: number): Promise { + await api.delete(`tt-states/${stateId}`); +} + +export function ttImageUrl(imageId: string, withLines: boolean = false): string { + // tt-image endpoint без auth-guard'а (vendor сам публично отдаёт эти JPEG'и), + // поэтому подходит для прямого . + const base = import.meta.env.VITE_API_BASE ?? "/api/v1/mechanic"; + return `${base}/tt-image/${imageId}${withLines ? "?lines=true" : ""}`; +} diff --git a/mechanic-pwa/frontend/src/components/damage-flow/DamageClassifyDialog.tsx b/mechanic-pwa/frontend/src/components/damage-flow/DamageClassifyDialog.tsx index 588cc33..5826abe 100644 --- a/mechanic-pwa/frontend/src/components/damage-flow/DamageClassifyDialog.tsx +++ b/mechanic-pwa/frontend/src/components/damage-flow/DamageClassifyDialog.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from "react"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { cn } from "@/lib/utils"; -import { loadDamageVocabulary } from "@/data/damageVocabulary"; +import { loadDamageVocabulary, damageTypeRuToEnum } from "@/data/damageVocabulary"; interface Props { open: boolean; @@ -29,8 +29,12 @@ export function DamageClassifyDialog({ open, zoneId, zoneLabel, pointsCount, onC // Salon zones (44=водительское сидение, 45=пассажирское, 46=задний диван) use salon_selectable; else exterior const isSalon = zoneId === 44 || zoneId === 45 || zoneId === 46; + // Фильтруем типы для которых нет соответствия в backend DamageType enum — + // иначе backend вернёт 422 на createMarker. const list = vocab - ? (isSalon ? vocab.salon_selectable : vocab.exterior_selectable) + ? (isSalon ? vocab.salon_selectable : vocab.exterior_selectable).filter( + (dt) => damageTypeRuToEnum(dt) != null, + ) : []; return ( diff --git a/mechanic-pwa/frontend/src/components/damage-flow/PhotoAnnotateStep.tsx b/mechanic-pwa/frontend/src/components/damage-flow/PhotoAnnotateStep.tsx new file mode 100644 index 0000000..0ca66cc --- /dev/null +++ b/mechanic-pwa/frontend/src/components/damage-flow/PhotoAnnotateStep.tsx @@ -0,0 +1,247 @@ +import { useEffect, useRef, useState } from "react"; +import { Button } from "@/components/ui/button"; + +interface Props { + photoFile: File; + zoneLabel: string; + /** Called when user submits. annotated=null если "без линий". */ + onSubmit: (annotated: Blob | null) => void | Promise; + onCancel: () => void; +} + +interface Stroke { + pts: { x: number; y: number }[]; // in image-space pixels +} + +/** Pen-on-photo step: показывает только что снятое фото, даёт обвести + * пальцем красным. Flatten в JPEG при submit. Координаты strokes в native + * пикселях фото — canvas resize'нут на тот же размер. */ +export function PhotoAnnotateStep({ photoFile, zoneLabel, onSubmit, onCancel }: Props) { + const canvasRef = useRef(null); + const imgRef = useRef(null); + const [imgLoaded, setImgLoaded] = useState(false); + const [strokes, setStrokes] = useState([]); + const currentStroke = useRef(null); + const [submitting, setSubmitting] = useState(false); + + // Load image once + useEffect(() => { + const url = URL.createObjectURL(photoFile); + const img = new Image(); + img.onload = () => { + imgRef.current = img; + const canvas = canvasRef.current; + if (canvas) { + canvas.width = img.naturalWidth; + canvas.height = img.naturalHeight; + } + setImgLoaded(true); + URL.revokeObjectURL(url); + redraw([]); + }; + img.onerror = () => URL.revokeObjectURL(url); + img.src = url; + return () => { + URL.revokeObjectURL(url); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [photoFile]); + + function redraw(allStrokes: Stroke[]) { + const canvas = canvasRef.current; + const img = imgRef.current; + if (!canvas || !img) return; + const ctx = canvas.getContext("2d"); + if (!ctx) return; + ctx.drawImage(img, 0, 0, canvas.width, canvas.height); + // Linewidth scaled to image — на 4К фото 4px тонко смотрится + const lw = Math.max(6, Math.round(canvas.width / 250)); + ctx.strokeStyle = "rgb(220, 38, 38)"; + ctx.lineWidth = lw; + ctx.lineCap = "round"; + ctx.lineJoin = "round"; + for (const s of allStrokes) { + if (s.pts.length < 2) { + // single tap → dot + if (s.pts.length === 1) { + ctx.fillStyle = "rgb(220, 38, 38)"; + ctx.beginPath(); + ctx.arc(s.pts[0].x, s.pts[0].y, lw / 2, 0, Math.PI * 2); + ctx.fill(); + } + continue; + } + ctx.beginPath(); + ctx.moveTo(s.pts[0].x, s.pts[0].y); + for (let i = 1; i < s.pts.length; i++) { + ctx.lineTo(s.pts[i].x, s.pts[i].y); + } + ctx.stroke(); + } + } + + // Re-draw whenever strokes change + useEffect(() => { + if (imgLoaded) redraw(strokes); + }, [strokes, imgLoaded]); + + function pointFromEvent(e: React.PointerEvent): { x: number; y: number } | null { + const canvas = canvasRef.current; + if (!canvas) return null; + const rect = canvas.getBoundingClientRect(); + if (rect.width === 0 || rect.height === 0) return null; + // CSS px → canvas px + const x = ((e.clientX - rect.left) / rect.width) * canvas.width; + const y = ((e.clientY - rect.top) / rect.height) * canvas.height; + return { x, y }; + } + + function onPointerDown(e: React.PointerEvent) { + e.preventDefault(); + (e.target as HTMLCanvasElement).setPointerCapture(e.pointerId); + const pt = pointFromEvent(e); + if (!pt) return; + currentStroke.current = { pts: [pt] }; + // Immediate visual feedback: draw a partial stroke without setState + drawPartialStroke(currentStroke.current); + } + + function onPointerMove(e: React.PointerEvent) { + if (!currentStroke.current) return; + const pt = pointFromEvent(e); + if (!pt) return; + currentStroke.current.pts.push(pt); + drawPartialStroke(currentStroke.current); + } + + function onPointerUp(e: React.PointerEvent) { + if (!currentStroke.current) return; + try { + (e.target as HTMLCanvasElement).releasePointerCapture(e.pointerId); + } catch { + // ignore — pointer wasn't captured + } + const finished = currentStroke.current; + currentStroke.current = null; + if (finished.pts.length > 0) { + setStrokes((s) => [...s, finished]); + } + } + + /** Avoid re-running full redraw on every move — just append last segment. */ + function drawPartialStroke(s: Stroke) { + const canvas = canvasRef.current; + if (!canvas || s.pts.length < 2) return; + const ctx = canvas.getContext("2d"); + if (!ctx) return; + const lw = Math.max(6, Math.round(canvas.width / 250)); + ctx.strokeStyle = "rgb(220, 38, 38)"; + ctx.lineWidth = lw; + ctx.lineCap = "round"; + ctx.lineJoin = "round"; + const a = s.pts[s.pts.length - 2]; + const b = s.pts[s.pts.length - 1]; + ctx.beginPath(); + ctx.moveTo(a.x, a.y); + ctx.lineTo(b.x, b.y); + ctx.stroke(); + } + + function clearAll() { + setStrokes([]); + } + + function undoLast() { + setStrokes((s) => s.slice(0, -1)); + } + + async function finishWithAnnotation() { + const canvas = canvasRef.current; + if (!canvas) return; + setSubmitting(true); + try { + const blob = await new Promise((resolve) => + canvas.toBlob(resolve, "image/jpeg", 0.85) + ); + await onSubmit(blob); + } finally { + setSubmitting(false); + } + } + + async function finishWithoutAnnotation() { + setSubmitting(true); + try { + await onSubmit(null); + } finally { + setSubmitting(false); + } + } + + return ( +
+
+
+
Обведите повреждение
+

{zoneLabel}

+
+
+ + +
+
+ +
+ +
+ +
+ + + +
+
+ ); +} diff --git a/mechanic-pwa/frontend/src/components/tt/TtDamageMap.tsx b/mechanic-pwa/frontend/src/components/tt/TtDamageMap.tsx new file mode 100644 index 0000000..2d4a494 --- /dev/null +++ b/mechanic-pwa/frontend/src/components/tt/TtDamageMap.tsx @@ -0,0 +1,157 @@ +import { useEffect, useRef, useState } from "react"; + +interface Point { + x: number; + y: number; +} + +interface DamageOverlay { + zoneId: number; + points: Point[]; +} + +interface Props { + damagedZoneIds: number[]; + /** Координаты точек повреждений в композитной SVG-системе (827×1209). */ + damages?: DamageOverlay[]; + onZoneClick?: (zoneId: number) => void; +} + +const SVG_NS = "http://www.w3.org/2000/svg"; +const POINT_RADIUS = 9; + +/** Композитная SVG-схема экстерьера машины с подсветкой зон + точками + * повреждений. Координаты точек в системе 827×1209 (та же что у vendor). */ +export function TtDamageMap({ damagedZoneIds, damages, onZoneClick }: Props) { + const containerRef = useRef(null); + const [svgText, setSvgText] = useState(null); + const damagedSet = new Set(damagedZoneIds.map(String)); + + useEffect(() => { + let cancelled = false; + fetch("/scheme/exterior.svg") + .then((r) => r.text()) + .then((text) => { + if (cancelled) return; + let mut = text; + mut = mut.replace(//gi, ""); + mut = mut.replace( + /(]*?)\s(?:width|height)\s*=\s*"[^"]*"/gi, + "$1" + ); + mut = mut.replace( + / { + cancelled = true; + }; + }, []); + + // Tinting + cursors + useEffect(() => { + if (!svgText) return; + const el = containerRef.current; + if (!el) return; + const svg = el.querySelector("svg") as SVGSVGElement | null; + if (!svg) return; + + svg.querySelectorAll("path[class]").forEach((p) => { + const cls = p.getAttribute("class") ?? ""; + if (damagedSet.has(cls)) { + p.setAttribute("fill", "rgba(239, 68, 68, 0.35)"); + p.setAttribute("stroke", "rgb(239, 68, 68)"); + p.setAttribute("stroke-width", "2"); + (p as SVGElement).style.cursor = onZoneClick ? "pointer" : "default"; + } else { + p.setAttribute("fill", "rgba(0,0,0,0.04)"); + p.setAttribute("stroke", "rgba(0,0,0,0.25)"); + p.setAttribute("stroke-width", "0.5"); + (p as SVGElement).style.cursor = "default"; + } + }); + svg.querySelectorAll("path:not([class])").forEach((p) => { + (p as SVGElement).style.opacity = "0.4"; + (p as SVGElement).style.pointerEvents = "none"; + }); + }, [svgText, damagedSet, onZoneClick]); + + // Point overlay — рисуем поверх SVG в его user-space (827×1209) чтобы + // точки идеально совмещались с подсвеченными зонами при любом масштабе. + useEffect(() => { + if (!svgText) return; + const el = containerRef.current; + if (!el) return; + const svg = el.querySelector("svg") as SVGSVGElement | null; + if (!svg) return; + + const existing = svg.querySelector("g[data-tt-damage-points]"); + if (existing) existing.remove(); + + if (!damages || damages.length === 0) return; + + const group = document.createElementNS(SVG_NS, "g"); + group.setAttribute("data-tt-damage-points", "1"); + + let counter = 1; + for (const dmg of damages) { + for (const pt of dmg.points || []) { + if ( + typeof pt.x !== "number" || + typeof pt.y !== "number" || + !Number.isFinite(pt.x) || + !Number.isFinite(pt.y) + ) { + continue; + } + const circle = document.createElementNS(SVG_NS, "circle"); + circle.setAttribute("cx", String(pt.x)); + circle.setAttribute("cy", String(pt.y)); + circle.setAttribute("r", String(POINT_RADIUS)); + circle.setAttribute("fill", "rgb(220, 38, 38)"); + circle.setAttribute("stroke", "white"); + circle.setAttribute("stroke-width", "2"); + (circle as SVGElement).style.pointerEvents = "none"; + group.appendChild(circle); + + const text = document.createElementNS(SVG_NS, "text"); + text.setAttribute("x", String(pt.x)); + text.setAttribute("y", String(pt.y)); + text.setAttribute("text-anchor", "middle"); + text.setAttribute("dominant-baseline", "central"); + text.setAttribute("fill", "white"); + text.setAttribute("font-size", "11"); + text.setAttribute("font-weight", "bold"); + (text as SVGElement).style.pointerEvents = "none"; + (text as SVGElement).style.userSelect = "none"; + text.textContent = String(counter); + group.appendChild(text); + counter += 1; + } + } + + svg.appendChild(group); + }, [svgText, damages]); + + function handleClick(e: React.MouseEvent) { + if (!onZoneClick) return; + const target = e.target as Element; + const cls = target.getAttribute?.("class"); + if (cls && damagedSet.has(cls)) { + const zoneId = Number(cls); + if (Number.isFinite(zoneId)) onZoneClick(zoneId); + } + } + + return ( +
+ ); +} diff --git a/mechanic-pwa/frontend/src/components/vehicle-scheme/VendorVehicleScheme.tsx b/mechanic-pwa/frontend/src/components/vehicle-scheme/VendorVehicleScheme.tsx index d74e319..2c5bbee 100644 --- a/mechanic-pwa/frontend/src/components/vehicle-scheme/VendorVehicleScheme.tsx +++ b/mechanic-pwa/frontend/src/components/vehicle-scheme/VendorVehicleScheme.tsx @@ -14,8 +14,17 @@ export interface SchemeMarker { damage_type?: string | null; severity?: string | null; resolved: boolean; + /** Координаты точек повреждения в композитной SVG-системе (827×1209). */ + polygon?: { x: number; y: number }[] | null; } +const SVG_NS = "http://www.w3.org/2000/svg"; +const POINT_RADIUS = 9; +const POINT_FILL_ACTIVE = "rgb(220, 38, 38)"; +const POINT_FILL_RESOLVED = "rgb(107, 114, 128)"; +const COMPOSITE_W = 827; +const COMPOSITE_H = 1209; + interface Props { markers: SchemeMarker[]; onZoneTap?: (zoneId: number) => void; @@ -110,6 +119,69 @@ export function VendorVehicleScheme({ }); }, [svgText, zoneStats, hoverZone, editable]); + // Overlay точек повреждений (multi-point координаты в композитной 827×1209) + useEffect(() => { + if (!svgText) return; + const el = containerRef.current; + if (!el) return; + const svg = el.querySelector("svg") as SVGSVGElement | null; + if (!svg) return; + + // Удаляем предыдущий overlay + const existing = svg.querySelector("g[data-damage-points]"); + if (existing) existing.remove(); + + const group = document.createElementNS(SVG_NS, "g"); + group.setAttribute("data-damage-points", "1"); + + let counter = 1; + for (const m of markers) { + const pts = m.polygon || []; + if (pts.length === 0) continue; + const fill = m.resolved ? POINT_FILL_RESOLVED : POINT_FILL_ACTIVE; + + for (const pt of pts) { + if ( + typeof pt.x !== "number" || + typeof pt.y !== "number" || + !Number.isFinite(pt.x) || + !Number.isFinite(pt.y) + ) { + continue; + } + // Polygon хранится в normalised 0..1 (см. ZoneDetailView). SVG viewBox + // в композитной 827×1209, поэтому умножаем перед отрисовкой. + const cx = pt.x * COMPOSITE_W; + const cy = pt.y * COMPOSITE_H; + const circle = document.createElementNS(SVG_NS, "circle"); + circle.setAttribute("cx", String(cx)); + circle.setAttribute("cy", String(cy)); + circle.setAttribute("r", String(POINT_RADIUS)); + circle.setAttribute("fill", fill); + circle.setAttribute("stroke", "white"); + circle.setAttribute("stroke-width", "2"); + (circle as SVGElement).style.pointerEvents = "none"; + group.appendChild(circle); + + const text = document.createElementNS(SVG_NS, "text"); + text.setAttribute("x", String(cx)); + text.setAttribute("y", String(cy)); + text.setAttribute("text-anchor", "middle"); + text.setAttribute("dominant-baseline", "central"); + text.setAttribute("fill", "white"); + text.setAttribute("font-size", "11"); + text.setAttribute("font-weight", "bold"); + (text as SVGElement).style.pointerEvents = "none"; + (text as SVGElement).style.userSelect = "none"; + text.textContent = String(counter); + group.appendChild(text); + counter += 1; + } + } + + svg.appendChild(group); + }, [svgText, markers]); + // Walk up from event.target to find a path[class="N"] (numeric zone id) function zoneFromEvent(e: React.MouseEvent | React.TouchEvent): number | null { let node = e.target as Element | null; diff --git a/mechanic-pwa/frontend/src/data/damageVocabulary.ts b/mechanic-pwa/frontend/src/data/damageVocabulary.ts index 8fd784b..7619470 100644 --- a/mechanic-pwa/frontend/src/data/damageVocabulary.ts +++ b/mechanic-pwa/frontend/src/data/damageVocabulary.ts @@ -24,3 +24,42 @@ export async function loadDamageVocabulary(): Promise { }; return cache; } + +/** + * Mapping русского названия из damage_vocabulary.json в DamageType enum + * нашего backend'а (см. mechanic_schemas.DamageType Literal). + * Возвращает null для типов которым нет точного соответствия — + * вызывающий код должен такие отфильтровать из UI. + */ +export const DAMAGE_RU_TO_ENUM: Record = { + "Вмятина": "dent", + "Царапина": "scratch", + "Трещина": "crack", + "Повреждено": "damaged", + "Скол": "chip", + "Отсутствует": "missing", + "Прожжено": "burn", + "Погнуто": "bent", + "Требуется мойка": null, + "Не работает": "not-working", + "Порез": "cut", + "Прокол": "puncture", + "Порвано": "torn", + "Пятна": "stain", + "Грязный салон": "stain", + "Запах табака": null, + "Повреждение салонных ковриков": "damaged", + "Повреждение обшивки дверей": "damaged", + "Сломанные ручки": "damaged", + "Установлено": "removed", + "Снято": "removed", + "Контроль": null, + "Требуется химчистка": "stain", + "Затертость": "scuff", + "Грыжа": "bulge", + "Штат": null, +}; + +export function damageTypeRuToEnum(ru: string): string | null { + return DAMAGE_RU_TO_ENUM[ru] ?? null; +} diff --git a/mechanic-pwa/frontend/src/pages/InspectionEditor.tsx b/mechanic-pwa/frontend/src/pages/InspectionEditor.tsx index eb51a29..04bcb06 100644 --- a/mechanic-pwa/frontend/src/pages/InspectionEditor.tsx +++ b/mechanic-pwa/frontend/src/pages/InspectionEditor.tsx @@ -6,9 +6,10 @@ import { getInspection, patchInspection, createMarker, + deleteMarker, type MarkerSummary, } from "@/api/inspections"; -import { uploadPhoto } from "@/api/photos"; +import { uploadPhoto, uploadPhotoAnnotation } from "@/api/photos"; import { PhotoSlot } from "@/components/camera/PhotoSlot"; import { CameraCapture } from "@/components/camera/CameraCapture"; import { VendorVehicleScheme } from "@/components/vehicle-scheme/VendorVehicleScheme"; @@ -16,12 +17,15 @@ import { TireWearDialog } from "@/components/inspection/TireWearDialog"; import { ZoneConfirmDialog } from "@/components/damage-flow/ZoneConfirmDialog"; import { ZoneDetailView } from "@/components/damage-flow/ZoneDetailView"; import { DamageClassifyDialog } from "@/components/damage-flow/DamageClassifyDialog"; +import { PhotoAnnotateStep } from "@/components/damage-flow/PhotoAnnotateStep"; import { AuthImg } from "@/components/AuthImg"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; import { loadZoneLabels } from "@/data/zoneLabels"; +import { damageTypeRuToEnum } from "@/data/damageVocabulary"; +import { ttImageUrl } from "@/api/vehicles"; -const SLOTS: { side: string; label: string }[] = [ +const SLOTS_GENERAL: { side: string; label: string }[] = [ { side: "front", label: "Перед" }, { side: "rear", label: "Зад" }, { side: "left", label: "Левый бок" }, @@ -32,6 +36,15 @@ const SLOTS: { side: string; label: string }[] = [ { side: "free", label: "Свободное" }, ]; +const SLOT_JACK = { side: "jack", label: "Домкрат" }; + +/** На приёмке (return) общие ракурсы не нужны — машина уже знакома, фокус + * на проверке повреждений и комплектации. Домкрат остаётся всегда. */ +function slotsForType(type: string): typeof SLOTS_GENERAL { + if (type === "return") return [SLOT_JACK]; + return [...SLOTS_GENERAL, SLOT_JACK]; +} + const SEVERITY_LABELS: Record = { cosmetic: "косметика", minor: "лёгкое", @@ -61,11 +74,18 @@ const DAMAGE_TYPE_LABELS: Record = { // Vendor 3-position severity index → backend literal const SEVERITY_MAP = ["minor", "moderate", "severe"] as const; -function humanizeMarkerSide(side: string | null | undefined): string { +function humanizeMarkerSide( + side: string | null | undefined, + zoneLabels?: Record | null, +): string { if (!side) return "—"; if (side === "tires") return "Резина"; const zm = /^zone-(\d+)$/.exec(side); - if (zm) return `Зона ${zm[1]}`; + if (zm) { + const label = zoneLabels?.[zm[1]]; + if (label) return label; + return `Зона ${zm[1]}`; + } const map: Record = { top: "Сверху", front: "Перед", @@ -93,7 +113,8 @@ type DamageFlow = | { kind: "confirm"; zoneId: number; zoneLabel: string } | { kind: "placePoints"; zoneId: number; zoneLabel: string } | { kind: "classify"; zoneId: number; zoneLabel: string; points: { x: number; y: number }[] } - | { kind: "capture"; zoneId: number; zoneLabel: string; points: { x: number; y: number }[]; damageType: string; severity: 0 | 1 | 2 }; + | { kind: "capture"; zoneId: number; zoneLabel: string; points: { x: number; y: number }[]; damageType: string; severity: 0 | 1 | 2 } + | { kind: "annotate"; zoneId: number; zoneLabel: string; points: { x: number; y: number }[]; damageType: string; severity: 0 | 1 | 2; photoFile: File }; export default function InspectionEditor() { const { id } = useParams<{ id: string }>(); @@ -121,6 +142,15 @@ export default function InspectionEditor() { onError: () => toast.error("Не удалось завершить"), }); + const removeMarker = useMutation({ + mutationFn: (markerId: number) => deleteMarker(markerId), + onSuccess: () => { + void qc.invalidateQueries({ queryKey: ["inspection", insId] }); + toast.success("Метка удалена"); + }, + onError: () => toast.error("Не удалось удалить"), + }); + if (isLoading) return
Загружаю…
; if (isError || !ins) return
Осмотр не найден.
; @@ -128,6 +158,9 @@ export default function InspectionEditor() { // Photos lookup by side+slot for initialPhotoId const photosBySide = new Map(); for (const p of ins.photos) photosBySide.set(`${p.side}-${p.slot_index}`, p); + // Photos lookup by id — нужен для marker thumb (annotated vs original) + const photosById = new Map(); + for (const p of ins.photos) photosById.set(p.id, p); const editable = ins.status === "in_progress"; @@ -166,6 +199,7 @@ export default function InspectionEditor() { damage_type: m.damage_type, severity: m.severity, resolved: m.resolved, + polygon: m.polygon, }))} onZoneTap={editable ? handleZoneTap : undefined} onTireWearClick={editable ? () => setTireWearOpen(true) : undefined} @@ -221,21 +255,64 @@ export default function InspectionEditor() { {flow.kind === "capture" && ( setFlow({ kind: "idle" })} - onPhotoUploaded={async (photoId) => { + onPhotoCaptured={(file) => + setFlow({ + kind: "annotate", + zoneId: flow.zoneId, + zoneLabel: flow.zoneLabel, + points: flow.points, + damageType: flow.damageType, + severity: flow.severity, + photoFile: file, + }) + } + /> + )} + + {flow.kind === "annotate" && ( + + setFlow({ + kind: "capture", + zoneId: flow.zoneId, + zoneLabel: flow.zoneLabel, + points: flow.points, + damageType: flow.damageType, + severity: flow.severity, + }) + } + onSubmit={async (annotated) => { try { + const damageEnum = damageTypeRuToEnum(flow.damageType); + if (!damageEnum) { + toast.error(`Не поддерживается: ${flow.damageType}`); + setFlow({ kind: "idle" }); + return; + } + const result = await uploadPhoto(insId, "free", 0, flow.photoFile); + if (annotated) { + try { + await uploadPhotoAnnotation(insId, result.id, annotated); + } catch (err) { + // Аннотация — best-effort. Фото оригинал уже сохранилось. + console.warn("annotation upload failed (non-fatal)", err); + } + } await createMarker(insId, { side: `zone-${flow.zoneId}`, polygon: flow.points, - damage_type: flow.damageType, + damage_type: damageEnum, severity: SEVERITY_MAP[flow.severity], - photo_id: photoId, + photo_id: result.id, }); void qc.invalidateQueries({ queryKey: ["inspection", insId] }); toast.success("Повреждение записано"); - } catch { + } catch (err) { + console.error("save failed", err); toast.error("Не удалось сохранить"); } finally { setFlow({ kind: "idle" }); @@ -258,7 +335,7 @@ export default function InspectionEditor() {

Фото

- {SLOTS.map((s) => ( + {slotsForType(ins.type).map((s) => (
- - {humanizeMarkerSide(m.side)} + + {humanizeMarkerSide(m.side, zoneLabels)} {" — "} @@ -303,26 +380,64 @@ export default function InspectionEditor() { )}
- {m.carried_over_from_id && ( - - перенесено - - )} +
+ {m.carried_over_from_id && ( + + перенесено + + )} + {!m.carried_over_from_id && + m.description?.startsWith("Перенесено из Element Mechanic") && ( + + из Element Mechanic + + )} + {editable && ( + + )} +
{m.description && (
{m.description}
)} - {m.photo_id && ( + {m.photo_id ? (
- )} + ) : m.tt_image_id ? ( +
+ Фото из Element Mechanic +
+ ) : null} ))} @@ -344,29 +459,14 @@ export default function InspectionEditor() { } function CapturePhotoStep({ - inspectionId, zoneLabel, onCancel, - onPhotoUploaded, + onPhotoCaptured, }: { - inspectionId: number; zoneLabel: string; onCancel: () => void; - onPhotoUploaded: (photoId: number) => void | Promise; + onPhotoCaptured: (file: File) => void; }) { - const [uploading, setUploading] = useState(false); - - async function handleFile(file: File) { - setUploading(true); - try { - const result = await uploadPhoto(inspectionId, "free", 0, file); - await onPhotoUploaded(result.id); - } catch { - toast.error("Ошибка загрузки фото"); - setUploading(false); - } - } - return (
@@ -375,13 +475,12 @@ function CapturePhotoStep({
+
+ )}
); } diff --git a/mechanic-pwa/frontend/src/pages/TtStateDetail.tsx b/mechanic-pwa/frontend/src/pages/TtStateDetail.tsx new file mode 100644 index 0000000..54563b8 --- /dev/null +++ b/mechanic-pwa/frontend/src/pages/TtStateDetail.tsx @@ -0,0 +1,394 @@ +import { useState, useMemo, useRef, useEffect } from "react"; +import { useParams, useNavigate } from "react-router-dom"; +import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; +import { toast } from "sonner"; +import { + getTtState, + deleteTtState, + ttImageUrl, + type TtPhotoRef, + type TtSidePhoto, +} from "@/api/vehicles"; +import { getMe } from "@/api/me"; +import { Card } from "@/components/ui/card"; +import { TtDamageMap } from "@/components/tt/TtDamageMap"; + +interface ZoneLabels { + [zoneId: string]: string; +} + +interface DamageVocabulary { + damage_types_ordered: string[]; + [k: string]: unknown; +} + +let zoneLabelsCache: ZoneLabels | null = null; +let damageVocabCache: DamageVocabulary | null = null; + +async function loadZoneLabels(): Promise { + if (zoneLabelsCache) return zoneLabelsCache; + const res = await fetch("/data/zone_labels.json"); + zoneLabelsCache = await res.json(); + return zoneLabelsCache!; +} + +async function loadDamageVocabulary(): Promise { + if (damageVocabCache) return damageVocabCache; + const res = await fetch("/data/damage_vocabulary.json"); + damageVocabCache = await res.json(); + return damageVocabCache!; +} + +const DEGREE_LABELS: Record = { + 0: "Лёгкое", + 1: "Среднее", + 2: "Тяжёлое", +}; + +function damageTypeName( + id: number | null, + vocab: DamageVocabulary | undefined, +): string { + if (id == null) return "Без типа"; + // Vendor enum is 1-based: type=1 → damage_types_ordered[0] ("Вмятина"). + const idx = id - 1; + const arr = vocab?.damage_types_ordered; + if (arr && idx >= 0 && idx < arr.length) return arr[idx]; + return `Тип ${id}`; +} + +const SIDE_LABELS: Record = { + 1: "Перед", + 2: "Зад", + 3: "Левый борт", + 4: "Правый борт", + 5: "Сверху", + 6: "Передний угол", + 7: "Задний угол", + 8: "Салон", + 9: "Дополнительно", +}; + +type PreviewItem = + | { kind: "zone"; photo: TtPhotoRef } + | { kind: "side"; photo: TtSidePhoto }; + +export default function TtStateDetail() { + const { id } = useParams<{ id: string }>(); + const navigate = useNavigate(); + const stateId = Number(id); + const zoneRefs = useRef>({}); + + const { data: state, isLoading, isError } = useQuery({ + queryKey: ["tt-state", stateId], + queryFn: () => getTtState(stateId), + enabled: Number.isFinite(stateId), + }); + + const { data: labels } = useQuery({ + queryKey: ["zone-labels"], + queryFn: loadZoneLabels, + staleTime: Infinity, + }); + + const { data: vocab } = useQuery({ + queryKey: ["damage-vocabulary"], + queryFn: loadDamageVocabulary, + staleTime: Infinity, + }); + + const { data: me } = useQuery({ + queryKey: ["me"], + queryFn: getMe, + staleTime: 5 * 60_000, + }); + const isAdmin = me?.permissions?.includes("admin") ?? false; + + const queryClient = useQueryClient(); + const deleteMutation = useMutation({ + mutationFn: () => deleteTtState(stateId), + onSuccess: () => { + toast.success("Осмотр удалён"); + // Drop any cached tt-history for vehicle list so новый рендер не покажет удалённый. + queryClient.invalidateQueries({ queryKey: ["vehicle"] }); + navigate(-1); + }, + onError: () => toast.error("Не удалось удалить осмотр"), + }); + + const [preview, setPreview] = useState(null); + const [showLines, setShowLines] = useState(false); + + const damagedZoneIds = useMemo(() => { + if (!state) return []; + return Object.keys(state.damages_by_zone).map((k) => Number(k)); + }, [state]); + + const damageOverlays = useMemo(() => { + if (!state) return []; + return Object.entries(state.damages_by_zone).flatMap(([zid, dmgs]) => + dmgs.map((d) => ({ zoneId: Number(zid), points: d.points || [] })) + ); + }, [state]); + + // Reset refs when state changes + useEffect(() => { + zoneRefs.current = {}; + }, [stateId]); + + if (isLoading) + return
Загружаю…
; + if (isError || !state) + return
Осмотр не найден.
; + + const date = state.unix_time + ? new Date(state.unix_time * 1000).toLocaleString("ru-RU") + : "—"; + + const zoneIds = Array.from( + new Set([ + ...Object.keys(state.photos_by_zone), + ...Object.keys(state.damages_by_zone), + ]) + ).sort((a, b) => Number(a) - Number(b)); + + function scrollToZone(zoneId: number) { + const el = zoneRefs.current[String(zoneId)]; + if (el) { + el.scrollIntoView({ behavior: "smooth", block: "start" }); + } + } + + return ( +
+ + + +
Element Mechanic
+
+ {state.mechanic_name || "Осмотр"} +
+
+ {date} + {state.mileage != null && ( + <> · {state.mileage.toLocaleString("ru-RU")} км + )} +
+
+ + {/* Общие 9 ракурсов */} + {state.side_photos.length > 0 && ( +
+

+ Общие фото +

+
+ {state.side_photos.map((p) => { + const label = p.photo_type + ? SIDE_LABELS[p.photo_type] || `Ракурс ${p.photo_type}` + : "Ракурс"; + const thumbSrc = p.miniature_id + ? ttImageUrl(p.miniature_id) + : ttImageUrl(p.image_id); + return ( + + ); + })} +
+
+ )} + + {/* Карта повреждений */} + {damagedZoneIds.length > 0 && ( +
+

+ Карта повреждений + + {damagedZoneIds.length}{" "} + {damagedZoneIds.length === 1 ? "зона" : "зон"} + +

+ +
+ Тап на зону — прокрутка к деталям +
+
+ )} + + {/* Детали по зонам с повреждениями */} + {zoneIds.length === 0 ? ( + + В осмотре нет ни фото, ни повреждений. + + ) : ( + zoneIds.map((zid) => { + const photos = state.photos_by_zone[zid] || []; + const damages = state.damages_by_zone[zid] || []; + const label = labels?.[zid] || `Зона ${zid}`; + return ( +
{ + zoneRefs.current[zid] = el; + }} + className="scroll-mt-4" + > +

+ {label} + {damages.length > 0 && ( + + ⚠ {damages.length}{" "} + {damages.length === 1 ? "повреждение" : "повреждений"} + + )} +

+ {damages.length > 0 && ( +
+ {damages.map((d, idx) => { + const tname = damageTypeName(d.damage_type_id, vocab); + const dname = + d.degree != null ? DEGREE_LABELS[d.degree] : null; + return ( + + {tname} + {dname && ( + <> + · + {dname} + + )} + + ); + })} +
+ )} + {photos.length > 0 ? ( +
+ {photos.map((p, idx) => ( + + ))} +
+ ) : ( + + Фото нет — только координаты повреждений + + )} +
+ ); + }) + )} + + {isAdmin && ( +
+ +
+ )} + + {preview && ( +
setPreview(null)} + > +
+ + {preview.kind === "zone" && + preview.photo.image_with_lines_id && ( + + )} +
+
e.stopPropagation()} + > + Просмотр +
+
+ )} +
+ ); +} diff --git a/mechanic-pwa/frontend/src/pages/VehicleCard.tsx b/mechanic-pwa/frontend/src/pages/VehicleCard.tsx index 7cb34ff..41bf162 100644 --- a/mechanic-pwa/frontend/src/pages/VehicleCard.tsx +++ b/mechanic-pwa/frontend/src/pages/VehicleCard.tsx @@ -2,7 +2,7 @@ import { useState } from "react"; import { useParams, useNavigate, useSearchParams } from "react-router-dom"; import { useQuery, useMutation } from "@tanstack/react-query"; import { toast } from "sonner"; -import { getVehicle } from "@/api/vehicles"; +import { getVehicle, getTtHistory } from "@/api/vehicles"; import { createInspection, type InspectionType } from "@/api/inspections"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; @@ -10,7 +10,7 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; const INSPECTION_TYPE_LABELS: Record = { - handover: "Передача", + handover: "Выдача", return: "Приёмка", periodic: "Плановый", "ad-hoc": "Свободный", @@ -27,6 +27,18 @@ const STATUS_LABELS: Record = { cancelled: "Отменён", }; +function timeAgo(iso: string): string { + const sec = Math.max(0, (Date.now() - new Date(iso).getTime()) / 1000); + if (sec < 60) return "только что"; + const min = Math.floor(sec / 60); + if (min < 60) return `${min} мин назад`; + const h = Math.floor(min / 60); + if (h < 24) return `${h} ч назад`; + const d = Math.floor(h / 24); + if (d < 30) return `${d} дн назад`; + return new Date(iso).toLocaleDateString("ru-RU"); +} + export default function VehicleCard() { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); @@ -37,12 +49,24 @@ export default function VehicleCard() { const [pendingType, setPendingType] = useState(null); const [mileageInput, setMileageInput] = useState(""); + const [mileageSource, setMileageSource] = useState< + "starline" | "last-inspection" | null + >(null); const { data: v, isLoading, isError } = useQuery({ queryKey: ["vehicle", vehicleId], queryFn: () => getVehicle(vehicleId), }); + // История из vendor (Element Mechanic). Молча возвращает пустой список + // если машина ещё не синхронизирована — секцию просто скрываем. + const { data: tt } = useQuery({ + queryKey: ["vehicle", vehicleId, "tt-history"], + queryFn: () => getTtHistory(vehicleId), + enabled: Number.isFinite(vehicleId), + staleTime: 5 * 60_000, + }); + const startInspection = useMutation({ mutationFn: (input: { type: InspectionType; mileage: number | undefined }) => createInspection({ vehicle_id: vehicleId, type: input.type, mileage: input.mileage }), @@ -54,8 +78,21 @@ export default function VehicleCard() { const handleStartClick = (type: InspectionType) => { setPendingType(type); + // Приоритет: 1) StarLine OBD (свежий одометр), 2) пробег прошлого + // осмотра. Менеджер всегда может скорректировать. + if (v?.starline_mileage != null) { + setMileageInput(String(v.starline_mileage)); + setMileageSource("starline"); + return; + } const lastWithMileage = v?.recent_inspections.find((i) => i.mileage != null); - setMileageInput(lastWithMileage?.mileage ? String(lastWithMileage.mileage) : ""); + if (lastWithMileage?.mileage != null) { + setMileageInput(String(lastWithMileage.mileage)); + setMileageSource("last-inspection"); + return; + } + setMileageInput(""); + setMileageSource(null); }; if (isLoading) @@ -91,7 +128,7 @@ export default function VehicleCard() { onClick={() => handleStartClick("handover")} disabled={startInspection.isPending} > - Передача + Выдача - - - - - -
@@ -202,6 +198,53 @@ export default function VehicleCard() { )} + {tt && tt.states.length > 0 && ( +
+

+ История осмотров (Element Mechanic) +

+
+ {tt.states.map((s) => { + const date = s.unix_time + ? new Date(s.unix_time * 1000).toLocaleString("ru-RU") + : "—"; + return ( + navigate(`/tt-states/${s.id}`)} + > +
+
+
+ {s.mechanic_name || "Осмотр"} +
+
+ {date} + {s.mileage != null && ( + <> + · + {s.mileage.toLocaleString("ru-RU")} км + + )} +
+
+
+
📷 {s.photos_count}
+ {s.damages_count > 0 && ( +
+ ⚠ {s.damages_count} +
+ )} +
+
+
+ ); + })} +
+
+ )} + {pendingType && (
setMileageInput(e.target.value.replace(/\D/g, ""))} + onChange={(e) => { + setMileageInput(e.target.value.replace(/\D/g, "")); + setMileageSource(null); + }} placeholder="123456" autoFocus /> + {mileageSource === "starline" && ( +
+ + + Из StarLine + {v?.starline_mileage_at && ( + <> · {timeAgo(v.starline_mileage_at)} + )} + + + · скорректируйте если надо + +
+ )} + {mileageSource === "last-inspection" && ( +
+ Из прошлого осмотра · скорректируйте если надо +
+ )}
diff --git a/recon/findings/damage_model.md b/recon/findings/damage_model.md new file mode 100644 index 0000000..58de5bb --- /dev/null +++ b/recon/findings/damage_model.md @@ -0,0 +1,79 @@ +# Vendor Damage Data Model — Extraction Notes + +Source: `Ttc.dll` (Xamarin Android app, reverse-engineered from `assemblies.blob`) +Date: 2026-05-17 + +## Core Objects + +### DetailDamageCoordinate +A single tap-point placed by the mechanic on the enlarged part SVG. + +| Field | Type | Notes | +|-------|------|-------| +| `Id` | int/Guid | PK | +| `X` | float | Relative X on the part SVG canvas | +| `Y` | float | Relative Y on the part SVG canvas | +| `InspectionGuid` | Guid | Ties this point to an inspection session | +| `MetaId` | int | Zone ID (0..56) — which part this point belongs to | +| `GroupId` | int | Groups multiple points belonging to ONE damage annotation | +| `ImageWithLinesId` | int | FK → the photo with polyline annotation | +| `LinesId` | int | FK → the DrawingLines set | + +Evidence: backing fields `k__BackingField`, `k__BackingField`, `k__BackingField`, `k__BackingField`, `k__BackingField`, `k__BackingField`, `k__BackingField` all found in contiguous block at 0x3baa0–0x3bd50 in Strings heap. `GetByGroupId` method confirms group-based querying. + +### DetailDamageCoordinateContract (API wire format) +Same fields as above, serialized as JSON. The JSON property for severity is `"degree"` (lowercase, confirmed at 0x3d752 in Strings heap alongside `"damageDegree"` widget name). + +### DetailDamageDrawPointContract +A single vertex in the finger-drawn polyline annotation on a photo. + +| Field | Type | Notes | +|-------|------|-------| +| `X` | float | Point X on the photo canvas | +| `Y` | float | Point Y on the photo canvas | + +The polyline is a **list** of `DetailDamageDrawPointContract` objects. The parent container is `DrawingLines` (backing field `k__BackingField` at 0x3cade). Method `DrawLine` (0x3e3c9) draws each segment. `StrokeWidth` (0x3f59a) controls line thickness. + +The photo itself is stored as `Image64StringWithLines` (base64 JPEG) and `ImageBase64StringWithLines` (alternate field). The link between a damage group and its annotated photo is: `DetailDamageCoordinate.ImageWithLinesId → VehicleStatePhotoInspection.Id`. + +## Multi-Point Damage Grouping + +**Yes, multi-point damages are grouped via `GroupId`.** The mechanic taps N spots on the part SVG — each tap creates a `DetailDamageCoordinate` with the same `GroupId`. All points in a group share: +- One `damage_type` (the vertical list selection) +- One `degree` (severity: 0=Легкое, 1=Среднее, 2=Тяжелое) +- One `ImageWithLinesId` (one photo with optional polyline) + +The `GetByGroupId` method (found in Strings heap at 0x394c0) fetches all coordinates for a group. `SaveByParts` (0x42f4f) persists the full group in one call. + +## Photo + Polyline Link + +``` +Inspection + └─ DetailDamageCoordinate[] (grouped by GroupId) + ├─ GroupId = 42 (e.g.) + ├─ MetaId = 0 (front bumper) + ├─ [X1,Y1], [X2,Y2], [X3,Y3] ← multiple tap points + ├─ ImageWithLinesId = 7 ← FK → photo record + └─ degree = 1 (Среднее) + +VehicleStatePhotoInspection (id=7) + ├─ Image64StringWithLines ← base64 JPEG (the photo) + ├─ DrawingLines[] ← list of DetailDamageDrawPointContract + │ └─ [{X:0.2, Y:0.4}, {X:0.5, Y:0.6}, ...] ← polyline vertices + └─ HistoryLines[] ← read-only history of old polylines +``` + +## Our Implementation Recommendation + +1. **DamageGroup** table: `{ id, inspection_id, zone_id, damage_type, severity(0-2), photo_id, created_at }` +2. **DamagePoint** table: `{ id, group_id, x REAL, y REAL, seq_order INT }` — multiple rows per group +3. **DamagePhoto** table: `{ id, image_b64, polyline JSONB }` where `polyline` is `[[x,y], ...]` +4. Severity stored as integer 0/1/2, displayed as Легкое/Среднее/Тяжелое + +This mirrors the vendor model exactly while using a standard relational schema. + +## Known Unknowns + +- The exact JSON shape returned by `damage/details` endpoint (API not captured live) +- Whether `GroupId` is a local UUID or server-assigned int +- Whether `DrawingLines` coordinates are normalized (0..1) or absolute pixels diff --git a/recon/findings/damage_vocabulary.json b/recon/findings/damage_vocabulary.json new file mode 100644 index 0000000..97b4526 --- /dev/null +++ b/recon/findings/damage_vocabulary.json @@ -0,0 +1,90 @@ +{ + "_meta": { + "source": "Ttc.dll #US heap, contiguous block at offsets 0xc2e24–0xc3084", + "confidence": "HIGH — full block scanned; order is the binary storage order which matches app display order (repository pattern typically loads in definition order)", + "notes": [ + "Items 0–12 are general exterior damage types (user-selectable for any zone)", + "Items 13–18 appear to be salon-specific (Грязный салон, Запах табака, etc.) — shown only for interior zones (44–46 seats, salon)", + "Установлено/Снято (19–20) and Контроль (21) are semi-system states used for equipment completeness zones (33–48 area)", + "Штат (25) appears to be a system/staff marker, not user-selectable", + "Порез, Прокол, Порвано are tire-specific damage types for zones 17–20", + "Есть/Нет повреждений found in binary (0x4599a/0x4597a) — likely used for salon damage yes/no toggle, not in the standard list" + ] + }, + "damage_types_ordered": [ + "Вмятина", + "Царапина", + "Трещина", + "Повреждено", + "Скол", + "Отсутствует", + "Прожжено", + "Погнуто", + "Требуется мойка", + "Не работает", + "Порез", + "Прокол", + "Порвано", + "Пятна", + "Грязный салон", + "Запах табака", + "Повреждение салонных ковриков", + "Повреждение обшивки дверей", + "Сломанные ручки", + "Установлено", + "Снято", + "Контроль", + "Требуется химчистка", + "Затертость", + "Грыжа", + "Штат" + ], + "exterior_selectable": [ + "Вмятина", + "Царапина", + "Трещина", + "Повреждено", + "Скол", + "Отсутствует", + "Прожжено", + "Погнуто", + "Требуется мойка", + "Не работает", + "Порез", + "Прокол", + "Порвано", + "Пятна", + "Затертость", + "Грыжа" + ], + "salon_selectable": [ + "Вмятина", + "Царапина", + "Трещина", + "Повреждено", + "Скол", + "Отсутствует", + "Прожжено", + "Погнуто", + "Требуется мойка", + "Не работает", + "Пятна", + "Грязный салон", + "Запах табака", + "Повреждение салонных ковриков", + "Повреждение обшивки дверей", + "Сломанные ручки", + "Требуется химчистка", + "Затертость", + "Грыжа" + ], + "severity_scale": { + "positions": 3, + "labels": ["Легкое", "Среднее", "Тяжелое"], + "values": [0, 1, 2], + "widget": "SeekBar (vehicleInspectionDegreeSelect / newDamageSeekBarDamageDegree)", + "api_field": "degree (lowercase, in JSON contract)", + "default": "Легкое (index 0)", + "source_note": "Легкое found at 0x59d79 (adjacent to 'Добавить повреждение' button label = default/initial value); Среднее+Тяжелое found together at 0xc39e8–0xc39f8 (loading state transitions)" + } +} diff --git a/recon/findings/scheme/api_endpoints.txt b/recon/findings/scheme/api_endpoints.txt new file mode 100644 index 0000000..5a22ac0 --- /dev/null +++ b/recon/findings/scheme/api_endpoints.txt @@ -0,0 +1,38 @@ +US+1023: inspectionId +US+2393: )" id="car" xmlns = "http://www.w3.org/2000/svg" viewBox = " +US+81926: inspectionvideo/ +US+83424: vehicle +US+83802: vehicle.json +US+83898: http://ttcontrol.naughtysoft.ru/api/ +US+83972: vehicletechnicalcontrol +US+84020: techinspectionitem +US+84448: vehicle/vehiclelist +US+84488: vehicle/statuses +US+84522: vehiclerepair +US+84550: inspection.json +US+511737: vehiclestatephotoinspection +US+512035: vehicletechinspection +US+512311: inspection +US+512945: customersettings/salondamages +US+513773: damage/details +US+517799: vehicletechnicalcontrol/driver?search= +US+517877: vehicletechnicalcontrol/driverinspection?vehicleNumber= +US+517989: driver/state?vehicleNum={0}&reason={1} +US+518099: inspectionvideo?vehicleId= +US+518153: inspectionvideo +US+518323: vehicle?id= +US+518347: vehicle/vehiclemeta?id= +US+518395: damage/damagescard?id= +US+518441: vehicle/ +US+518493: vehiclerepair/byvehicle?vehicleId= +US+518563: vehiclestate/history?id= +US+518613: vehiclestate/mileage +US+518655: vehiclestate/new +US+518689: vehiclestate/newpart +US+518731: vehiclestate/new?id= +US+518773: vehiclestatephotoinspection/photohistory?vehicleId={0}&type={1} +US+518901: vehiclestatephotoinspection/photoinspection?vehicleId= +US+519011: vehicletechinspection/byvehicle?vehicleId= +US+519097: inspection/byvehicle?id= +US+519147: inspection/photohistory?vehicleId={0}&type={1} +US+519253: damage diff --git a/recon/findings/scheme/circle_marker.txt b/recon/findings/scheme/circle_marker.txt new file mode 100644 index 0000000..c30a4cc --- /dev/null +++ b/recon/findings/scheme/circle_marker.txt @@ -0,0 +1,6 @@ +US+391601 (2929 chars): ' + +[539] US+513933: '{2}' + +[540] US+514059: '` data is embedded in the DLL binaries. The vendor app fetches detail part SVGs from the server at runtime. + +## How It Works + +### 1. Vehicle Load: `vehicle/vehiclemeta?id=` + +When the mechanic selects a vehicle, the app calls: + +``` +GET {baseUrl}/vehicle/vehiclemeta?id={vehicleId} +Authorization: Bearer {token} +``` + +The response includes a list of `DetailScheme` objects — one per tappable zone. Each `DetailScheme` has at minimum: + +- `Id` — database PK +- `MetaId` — maps to the SVG `class="N"` zone ID (0..56) +- `Scheme` — full SVG string for the enlarged part view +- `ViewBox` — the viewBox string for that part's SVG (e.g. `"0 0 400 300"`) + +### 2. Zone Tap → Detail View + +When user taps zone N on the composite SVG: + +1. `Foo.TouchEnd(N)` fires (JavaScript in WebView) +2. App calls `GetDamagedDetailScheme(metaId: N)` (C# method in `Ttc.dll`) +3. The cached `DetailScheme` for that MetaId is retrieved +4. Its `Scheme` SVG is rendered in a new WebView/Activity (`DetailSchemeActivity`) +5. The scheme has the same ` \ No newline at end of file diff --git a/recon/findings/scheme/salon_scheme.svg b/recon/findings/scheme/salon_scheme.svg new file mode 100644 index 0000000..d4e85d5 --- /dev/null +++ b/recon/findings/scheme/salon_scheme.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/recon/findings/scheme/strings_heap_damage.txt b/recon/findings/scheme/strings_heap_damage.txt new file mode 100644 index 0000000..ef62be8 --- /dev/null +++ b/recon/findings/scheme/strings_heap_damage.txt @@ -0,0 +1,795 @@ ++ 88: __StaticArrayInitTypeSize=40 ++ 158: <>c__DisplayClass10_0 ++ 233: <_vehicleStatusHistoryRepository_CarChanged>b__11_0 ++ 326: b__11_0 ++ 343: <>c__DisplayClass11_0 ++ 395: b__1_0 ++ 419: <>c__DisplayClass1_0 ++ 481: <>c__DisplayClass12_0 ++ 503: <>c__DisplayClass72_0 ++ 606: <>c__DisplayClass2_0 ++ 650: <>c__DisplayClass13_0 ++ 789: b__3_0 ++ 814: <>c__DisplayClass3_0 ++ 887: <>c__DisplayClass14_0 ++ 1114: <>c__DisplayClass4_0 ++ 1168: b__65_0 ++ 1188: <>c__DisplayClass65_0 ++ 1271: b__5_0 ++ 1312: b__5_0 ++ 1337: <>c__DisplayClass5_0 ++ 1452: <>c__DisplayClass66_0 ++ 1483: b__6_0 ++ 1521: b__6_0 ++ 1541: <>c__DisplayClass6_0 ++ 1605: <>c__DisplayClass17_0 ++ 1656: <>c__DisplayClass67_0 ++ 1678: <>c__DisplayClass77_0 ++ 1739: <>c__DisplayClass7_0 ++ 1760: <>c__DisplayClass68_0 ++ 1782: <>c__DisplayClass78_0 ++ 1826: <>c__DisplayClass8_0 ++ 1945: <>c__DisplayClass9_0 ++ 1966: b__0 ++ 1985: b__0 ++ 2003: b__0 ++ 2022: b__0 ++ 2045: b__0 ++ 2059: b__0 ++ 2103: b__0 ++ 2357: b__0 ++ 2391: b__0 ++ 2464: b__0 ++ 2480: b__0 ++ 2653: d__11 ++ 2835: b__11_1 ++ 2852: <>c__DisplayClass11_1 ++ 2955: <>c__DisplayClass72_1 ++ 3003: <>c__DisplayClass2_1 ++ 3226: <>c__DisplayClass14_1 ++ 3430: b__5_1 ++ 3807: b__1 ++ 3940: b__1 ++ 3963: b__1 ++ 4014: b__1 ++ 4031: d__1 ++ 4063: d__1 ++ 4132: d__11`1 ++ 4251: AsyncTaskMethodBuilder`1 ++ 4319: ArrayAdapter`1 ++ 4425: __StaticArrayInitTypeSize=12 ++ 4524: d__72 ++ 4689: <>c__DisplayClass14_2 ++ 4763: b__5_2 ++ 4987: 5__2 ++ 5071: 5__2 ++ 5188: d__2 ++ 5378: KeyValuePair`2 ++ 5393: Dictionary`2 ++ 5406: TextAppearance_Compat_Notification_Line2 ++ 5479: text2 ++ 5594: <>c__DisplayClass14_3 ++ 5642: b__5_3 ++ 5908: d__3 ++ 5927: d__3 ++ 5995: d__3 ++ 6034: d__3 ++ 6153: __StaticArrayInitTypeSize=24 ++ 6381: d__4 ++ 6512: d__65 ++ 6777: d__5 ++ 6822: d__5 ++ 6847: d__5 ++ 7066: d__6 ++ 7366: d__7 ++ 7392: __StaticArrayInitTypeSize=28 ++ 7421: __StaticArrayInitTypeSize=48 ++ 7747: d__9 ++ 7992: PointF ++ 8071: System.IO ++ 8104: get_X ++ 8110: set_X ++ 8116: GradientColor_android_endX ++ 8143: GradientColor_android_centerX ++ 8173: GetX ++ 8178: GradientColor_android_startX ++ 8207: _viewX ++ 8214: get_Y ++ 8220: set_Y ++ 8226: GradientColor_android_endY ++ 8253: GradientColor_android_centerY ++ 8283: GetY ++ 8288: GradientColor_android_startY ++ 8423: TextAppearance_Compat_Notification_Line2_Media ++ 8470: TextAppearance_Compat_Notification_Title_Media ++ 8517: TextAppearance_Compat_Notification_Time_Media ++ 8563: TextAppearance_Compat_Notification_Media ++ 8604: TextAppearance_Compat_Notification_Info_Media ++ 8792: newDamageTextureCamera ++ 8815: inspectionTextureCamera ++ 8847: GetStringExtra ++ 8862: GetBooleanExtra ++ 8878: GetIntExtra ++ 8890: PutExtra ++ 9059: System.Collections.Generic ++ 9086: GetResponseAsync ++ 9103: DownloadDataTaskAsync ++ 9125: GetRequestStreamAsync ++ 9147: async ++ 9157: <b__11_0>d ++ 9448: textViewResourceId ++ 9613: get_PhotoTypeId ++ 9629: set_PhotoTypeId ++ 10003: GetByGroupId ++ 10221: GetMetaById ++ 10233: GetImageById ++ 10246: GetImagePathById ++ 10263: GetById ++ 10271: FindViewById ++ 10347: detailhistoryadd ++ 10427: _damageAdded ++ 10614: _vehicleStatusHistoryRepository_CarChanged ++ 10694: DamageDegreeOnProgressChanged ++ 10791: _vehicleStatusHistoryRepository_ApprovedListChanged ++ 10872: add_TextChanged ++ 10888: SearchText_TextChanged ++ 10950: get_SalonChecked ++ 10967: set_SalonChecked ++ 11026: get_ComplecityChecked ++ 11048: set_ComplecityChecked ++ 11601: System.Collections.Specialized ++ 11770: k__BackingField ++ 11789: k__BackingField ++ 12000: k__BackingField ++ 12516: k__BackingField ++ 12580: k__BackingField ++ 13005: k__BackingField ++ 13282: k__BackingField ++ 13306: k__BackingField ++ 13335: k__BackingField ++ 13367: k__BackingField ++ 13397: k__BackingField ++ 13435: k__BackingField ++ 13631: k__BackingField ++ 13657: k__BackingField ++ 13829: k__BackingField ++ 13853: k__BackingField ++ 13883: k__BackingField ++ 13909: k__BackingField ++ 13946: k__BackingField ++ 14009: k__BackingField ++ 14031: k__BackingField ++ 14056: k__BackingField ++ 14100: k__BackingField ++ 14128: k__BackingField ++ 14155: k__BackingField ++ 14190: k__BackingField ++ 14241: k__BackingField ++ 15546: k__BackingField ++ 15586: k__BackingField ++ 15770: k__BackingField ++ 15795: k__BackingField ++ 15939: k__BackingField ++ 15969: k__BackingField ++ 15998: k__BackingField ++ 16025: k__BackingField ++ 16143: k__BackingField ++ 16779: k__BackingField ++ 16804: k__BackingField ++ 16837: k__BackingField ++ 16874: k__BackingField ++ 16909: k__BackingField ++ 16963: k__BackingField ++ 17001: k__BackingField ++ 17058: k__BackingField ++ 17096: k__BackingField ++ 17135: k__BackingField ++ 17188: k__BackingField ++ 17236: k__BackingField ++ 17273: k__BackingField ++ 17311: k__BackingField ++ 17357: k__BackingField ++ 17403: k__BackingField ++ 17441: k__BackingField ++ 17483: k__BackingField ++ 17538: k__BackingField ++ 17582: k__BackingField ++ 17625: k__BackingField ++ 17659: k__BackingField ++ 17700: k__BackingField ++ 17744: k__BackingField ++ 17789: k__BackingField ++ 17824: k__BackingField ++ 17861: k__BackingField ++ 17909: k__BackingField ++ 17941: textField ++ 18071: CoordinatorLayout_statusBarBackground ++ 18392: GetSystemService ++ 18875: get_DamageDegree ++ 18892: set_DamageDegree ++ 18909: newDamageSeekBarDamageDegree ++ 18938: _newDamageTextViewDamageDegree ++ 18969: _damageDegree ++ 18983: vehicleInspectionDamagesDegree ++ 19235: techinspectionHistoryTiMileage ++ 19266: CustomHistoryInspectionItemMileage ++ 19587: FontFamily_fontProviderPackage ++ 19862: get_Damage ++ 19873: set_Damage ++ 19884: detailPreviewAddDamage ++ 19907: SelectedDamage ++ 19922: get_ImageDamage ++ 19938: set_ImageDamage ++ 19954: DrawingImageDamage ++ 19973: DetailDamage ++ 19986: currentDamage ++ 20000: get_SalonGotDamage ++ 20019: set_SalonGotDamage ++ 20038: get_GotNewDamage ++ 20055: set_GotNewDamage ++ 20072: damage ++ 20144: CoordinatorLayout_Layout_layout_insetEdge ++ 20206: get_ReadyForStatusChange ++ 20231: set_ReadyForStatusChange ++ 20256: CompareExchange ++ 20272: get_ReadyForDischarge ++ 20294: set_ReadyForDischarge ++ 20454: Styleable ++ 20507: add_SurfaceTextureAvailable ++ 20535: TextureViewOnSurfaceTextureAvailable ++ 20807: GetByVehicle ++ 20847: RuntimeTypeHandle ++ 20865: GetTypeFromHandle ++ 21038: TextAppearance_Compat_Notification_Title ++ 21295: ProgressDialogStyle ++ 21315: SetProgressStyle ++ 21332: FontFamilyFont_android_fontStyle ++ 21365: FontFamilyFont_fontStyle ++ 21390: coordinatorLayoutStyle ++ 21507: _contextFileName ++ 21534: get_TypeName ++ 21547: set_TypeName ++ 21560: get_TiTypeName ++ 21575: set_TiTypeName ++ 21590: set_DefaultTextEncodingName ++ 21845: library_name ++ 21882: get_Scheme ++ 21893: set_Scheme ++ 21904: get_DetailScheme ++ 21921: set_DetailScheme ++ 21938: GetDamagedDetailScheme ++ 21961: TextAppearance_Compat_Notification_Time ++ 22010: get_UnixTime ++ 22023: set_UnixTime ++ 22036: get_LastServiceUnixTime ++ 22060: set_LastServiceUnixTime ++ 22084: get_LastServiceGasUnixTime ++ 22111: set_LastServiceGasUnixTime ++ 22222: IAsyncStateMachine ++ 22304: CoordinatorLayout_Layout_layout_keyline ++ 22410: get_Type ++ 22419: set_Type ++ 22428: get_SubType ++ 22440: set_SubType ++ 22452: methodType ++ 22463: VehicleType ++ 22475: _vehicleType ++ 22488: ValueType ++ 22498: get_VehicleRepairMetalWorkType ++ 22529: set_VehicleRepairMetalWorkType ++ 22560: ChangeDiskType ++ 22575: get_DetailType ++ 22590: set_DetailType ++ 22605: ApprovedCustomItemType ++ 22628: get_PhotoType ++ 22642: set_PhotoType ++ 22656: get_VehicleRepairType ++ 22678: set_VehicleRepairType ++ 22700: set_ContentType ++ 22716: get_AccountType ++ 22732: set_AccountType ++ 22748: InspectionPartType ++ 22767: GenerateDiskByType ++ 22786: GradientColor_android_type ++ 22854: System.Core ++ 22969: get_SurfaceTexture ++ 22988: completenessPhotoTexture ++ 23013: SetPreviewTexture ++ 23381: InspectionVideoHistoryResponse ++ 23420: TryParse ++ 23455: get_ExpectedDate ++ 23472: set_ExpectedDate ++ 23623: techinspectionHistoryTiDate ++ 23691: CustomHistoryInspectionItemDate ++ 23976: DetailDamageCoordinate ++ 24064: GetCurrentSalonDamageState ++ 24579: AssemblyTitleAttribute ++ 24602: AsyncStateMachineAttribute ++ 24629: AssemblyTrademarkAttribute ++ 24728: AssemblyFileVersionAttribute ++ 24757: AssemblyConfigurationAttribute ++ 24788: AssemblyDescriptionAttribute ++ 24866: CompilationRelaxationsAttribute ++ 24898: AssemblyProductAttribute ++ 24923: AssemblyCopyrightAttribute ++ 24950: ExportAttribute ++ 24966: AssemblyCompanyAttribute ++ 24991: RuntimeCompatibilityAttribute ++ 25021: ActivityAttribute ++ 25039: Byte ++ 25123: TrySave ++ 25173: newDamageRemove ++ 25189: vehicleInspectionDamageAprove ++ 25369: notification_action_text_size ++ 25399: notification_subtext_size ++ 25425: IndexOf ++ 25433: Exif ++ 25505: notify_panel_notification_icon_bg ++ 25737: System.Threading ++ 25844: ThenByDescending ++ 25861: OrderByDescending ++ 25946: System.Runtime.Versioning ++ 26831: compat_notification_large_icon_max_width ++ 26901: dayOfMonth ++ 26939: taxi ++ 26993: damageTypeGoBack ++ 27010: metalWorkTypeGoBack ++ 27030: detailTypeGoBack ++ 27047: repairTypeGoBack ++ 27141: vehicleRepairTypeSelectGoBack ++ 27229: damageViewGoBack ++ 27320: AsyncCallback ++ 27444: inspectionSalonGoback ++ 27604: videoplaybackgoback ++ 27784: techinspectiontypesgoback ++ 28100: inspectionHistorygoback ++ 28124: inspectionTakePhotoHistorygoback ++ 28157: detailhistorygoback ++ 28177: detailhistoryhistorygoback ++ 28245: GetDamagedDetailSchemeWithStack ++ 28277: GenerateDamagesFromStack ++ 28433: GoNextButton_Click ++ 28452: GoToNextButton_Click ++ 28650: customDamageItemCheckMark ++ 28676: customSalonItemCheckMark ++ 28701: secondary_text_default_material_dark ++ 28738: primary_text_default_material_dark ++ 29728: MemoryStream ++ 29947: InspectionVideoHistoryResponseItem ++ 30246: CustomDamageListViewItem ++ 30271: CustomSalonDamageListViewItem ++ 30569: CustomInspectionHistoryListViewItem ++ 30667: System ++ 30980: status_bar_notification_info_maxnum ++ 31258: notification_big_circle_margin ++ 31466: TextAppearance_Compat_Notification ++ 31608: SetCameraDisplayOrientation ++ 31636: SetDisplayOrientation ++ 31693: System.Globalization ++ 31861: System.Reflection ++ 32120: WebException ++ 32133: AggregateException ++ 32152: CustomApiException ++ 32171: InvalidOperationException ++ 32197: SetException ++ 32210: ContextException ++ 32227: IdsForSalon ++ 32239: GetForSalon ++ 32478: newDamageButton ++ 32546: damageTypeButton ++ 32925: salonApproveButton ++ 33279: newDamagePhotoButton ++ 33356: inspectionNextPhotoButton ++ 33607: tiGoNextButton ++ 33622: repairGoNextButton ++ 33641: sparePartGoNextButton ++ 33663: inspectionHistoryGoNextButton ++ 33693: _goToNextButton ++ 33709: inspectionPhotoHistoryButton ++ 33742: CopyTo ++ 33787: TextAppearance_Compat_Notification_Info ++ 33943: detailHistoryMakePhoto ++ 33966: newDamageTakePhoto ++ 34032: newDamageRetakePhoto ++ 34128: newDamageApprovePhoto ++ 34314: HistoryPhoto ++ 34327: detailhistoryPhoto ++ 34765: System.Linq ++ 34889: get_Year ++ 34898: monthOfYear ++ 34916: year ++ 35188: CustomDamageItemHeader ++ 35367: CustomSalonItemHeader ++ 35479: TextReader ++ 35617: inspectionHistoryheader ++ 35641: detailhistoryheader ++ 35733: ContextProvider ++ 35749: _contextProvider ++ 35775: AsyncVoidMethodBuilder ++ 36058: tag_unhandled_key_event_manager ++ 36234: System.CodeDom.Compiler ++ 36510: videoplaybackOpenInBrowser ++ 36558: get_LayoutInflater ++ 36666: TextWriter ++ 36886: CustomSalonDamageListViewAdapter ++ 37174: CustomTechInspectionHistoryListViewAdapter ++ 37217: CustomInspectionHistoryListViewAdapter ++ 37256: CustomArrayAdapter ++ 37401: get_ApprovedBySecondDriver ++ 37428: set_ApprovedBySecondDriver ++ 37527: get_ApprovedByDriver ++ 37548: set_ApprovedByDriver ++ 37621: CamelCasePropertyNamesContractResolver ++ 37688: get_MediaPlayer ++ 37704: set_MediaPlayer ++ 37720: _mediaPlayer ++ 37890: CoordinatorLayout_Layout_layout_anchor ++ 37929: CoordinatorLayout_Layout_layout_behavior ++ 38128: SetTextColor ++ 38506: get_Extras ++ 38517: extras ++ 38574: System.Diagnostics ++ 38604: FromUnixTimeSeconds ++ 38744: System.Runtime.InteropServices ++ 38775: System.Runtime.CompilerServices ++ 38914: get_Damages ++ 38926: set_Damages ++ 38938: GenerateDamages ++ 38954: DetailSchemeWithDamages ++ 38978: vehicleInspectionDamages ++ 39003: get_SalonDamages ++ 39020: set_SalonDamages ++ 39037: GetSalonDamages ++ 39053: GetDamages ++ 39064: _damages ++ 39073: CoordinatorLayout_Layout_layout_dodgeInsetEdges ++ 39147: QueryIntentActivities ++ 39221: damageNames ++ 39233: DetailSchemes ++ 39397: get_HistoryLines ++ 39414: set_HistoryLines ++ 39431: CoordinatorLayout_keylines ++ 39458: get_DamageTypes ++ 39474: set_DamageTypes ++ 39490: get_TireTypes ++ 39504: set_TireTypes ++ 39518: GetTiTypes ++ 39529: get_DiskTypes ++ 39543: set_DiskTypes ++ 39557: GetPhotoControlTypes ++ 39578: GetInspectionTypes ++ 39777: get_DamageCoordinates ++ 39799: set_DamageCoordinates ++ 39832: GetBytes ++ 39841: bytes ++ 39979: FontFamilyFont_android_fontVariationSettings ++ 40024: FontFamilyFont_fontVariationSettings ++ 40134: TextChangedEventArgs ++ 40180: SurfaceTextureAvailableEventArgs ++ 40213: surfaceTextureAvailableEventArgs ++ 40367: Microsoft.CodeAnalysis ++ 40390: System.Threading.Tasks ++ 40519: LayoutParams ++ 40865: System.Collections ++ 41022: GetHistoryPhotos ++ 41092: tag_unhandled_key_listeners ++ 41276: _damageColors ++ 41539: SaveByParts ++ 41572: FontFamily_fontProviderCerts ++ 41601: CheckDetailExists ++ 41755: ChangeSalonDamageStatus ++ 41950: AddDays ++ 42021: Xamarin.Android.Support.Compat ++ 42052: ContextCompat ++ 42066: ActivityCompat ++ 42146: DamageContract ++ 42219: DetailDamageCoordinateContract ++ 42426: DetailDamageDrawPointContract ++ 42632: System.Net ++ 42753: KeySet ++ 42904: FontFamilyFont_android_fontWeight ++ 42938: FontFamilyFont_fontWeight ++ 42995: compat_notification_large_icon_max_height ++ 43059: secondary_text_default_material_light ++ 43144: _commentTextEdit ++ 43161: textEdit ++ 43196: Exit ++ 43201: exit ++ 43261: IAsyncResult ++ 43274: StartActivityForResult ++ 43317: OnActivityResult ++ 43468: newDamageComment ++ 43485: _damageComment ++ 43795: DrawingPoint ++ 43808: FontFamilyFont ++ 43823: FontFamilyFont_android_font ++ 43851: FontFamilyFont_font ++ 43896: maxAttemptCount ++ 43937: SyncRoot ++ 44176: newDamageCoast ++ 44191: _damageCoast ++ 44236: salonDamageList ++ 44252: damageTypeList ++ 44452: detailhistoryDamagesList ++ 44477: techinspectiontypesList ++ 44581: inspectionHistoryList ++ 44603: videoHistoryList ++ 44620: inspectionTakePhotoHistoryList ++ 44651: detailhistoryhistorylist ++ 44730: FontFamily_fontProviderFetchTimeout ++ 44766: CoordinatorLayout_Layout ++ 44791: SignatureSecondLayout ++ 44813: VehicleInspectionDetailDamageLayout ++ 44849: InspectionRepairMetalWorkTypeLayout ++ 44885: InspectionRepairTypeLayout ++ 44912: InspectionReasonsMoreLayout ++ 44940: SignatureLayout ++ 44956: VehicleTechControlApproveLayout ++ 44988: VehicleInspectionDetailDrawingLayout ++ 45025: LoadingDialogLayout ++ 45045: VehicleInspectionVideoPlaybackLayout ++ 45082: InspectionRepairAdditionalLayout ++ 45115: VehicleInspectionCustomFuelLayout ++ 45149: VehicleInspectionFuelLayout ++ 45177: VehicleInspectionTierLevelLayout ++ 45210: VehicleTechControlLayout ++ 45235: vehicleTechControlLayout ++ 45260: VehicleInspectionLayout ++ 45284: VehicleInspectionSalonLayout ++ 45313: VehicleInspectionVideoLayout ++ 45342: VehicleInspectionCompletenessTakePhotoLayout ++ 45387: LinearLayout ++ 45400: Widget_Support_CoordinatorLayout ++ 45433: VehicleTechControlVehiclesLayout ++ 45466: VehicleStatusesLayout ++ 45488: DriverDischargeReasonsLayout ++ 45517: InspectionReasonsLayout ++ 45541: SpareGroupsLayout ++ 45559: VehicleTechControlDriversLayout ++ 45591: VehicleInspectionCompletenessLayout ++ 45627: VehicleInspectionDraftsLayout ++ 45657: VehicleInspectionDocumentsLayout ++ 45690: VehicleForRejectLayout ++ 45713: InspectionReasonsAfterAccidentLayout ++ 45750: VehicleInspectionCommentLayout ++ 45781: VehicleRepairCommentLayout ++ 45808: SparePartLayout ++ 45824: VehicleTechInspectionTypeListLayout ++ 45860: VehicleTechInspectionWorkListLayout ++ 45896: ImageViewLayout ++ 45912: imageViewLayout ++ 45928: ParkViewLayout ++ 45943: SignaturePreviewLayout ++ 45966: VehicleInspectionDetailPreviewLayout ++ 46003: VehicleInspectionDetailPhotoPreviewLayout ++ 46045: VehicleInspectionChangeHistoryLayout ++ 46082: VehicleInspectionDetailHistoryLayout ++ 46119: VehicleInspectionHistoryLayout ++ 46150: VehicleTechInspectionHistoryLayout ++ 46185: InspectionTakePhotoHistoryLayout ++ 46218: VehicleInspectionDetailHistoryHistoryLayout ++ 46262: videolayout ++ 46284: MoveNext ++ 46293: repairAditionaGoNext ++ 46314: inspectionDetailGoNext ++ 46337: detailPreviewGoNext ++ 46357: newDamageGoToNext ++ 46375: isNext ++ 46382: Android.Text ++ 46395: System.Text ++ 46407: get_Text ++ 46416: set_Text ++ 46425: vehicleTechControlMileageText ++ 46455: inspectionChangeNewMileageText ++ 46486: inspectionHistoryMileageText ++ 46515: _mileageText ++ 46528: MakeText ++ 46537: _titleText ++ 46548: vehicleRepairTypeText ++ 46570: _searchText ++ 46582: vehicleInspectionCustomFuelText ++ 46614: tierLevelText ++ 46628: Widget_Compat_NotificationActionText ++ 46665: customApprovedHeaderText ++ 46690: _headerText ++ 46702: _passwordEditText ++ 46720: _mileagEditText ++ 46736: driverSecondSearchEditText ++ 46763: vehicleSearchEditText ++ 46785: techcotroldriverSearchEditText ++ 46816: sparePartSearchEditText ++ 46840: _loginEditText ++ 46855: _stoEditText ++ 46868: vehicleInspectionCommentText ++ 46897: vehicleRepairCommentText ++ 46922: vehicleRejectCommentText ++ 46947: detailHistoryCommentText ++ 46972: progressViewText ++ 46989: next ++ 46994: notification_top_pad_large_text ++ 47026: action_text ++ 47038: inspectionsecondsignaturetext ++ 47068: inspectionsignaturetext ++ 47092: get_Context ++ 47104: SaveVehicleContext ++ 47123: GetVehicleContext ++ 47141: SaveAccountContext ++ 47160: GetAccountContext ++ 47178: context ++ 47186: txt ++ 47196: NewDamageMenu ++ 47210: NewDamagePhotoMenu ++ 47364: inspectionHistoryImageView ++ 47391: NewDamageView ++ 47416: DamageTypeView ++ 47431: DetailTypeView ++ 47446: TextureView ++ 47458: _textureView ++ 47602: VehicleRepairTypeSelectView ++ 47775: metalWorkTypeListView ++ 47797: detailTypeListView ++ 47816: vehicleRepairTypeListView ++ 47842: repairTypeListView ++ 48005: _headerTextView ++ 48021: textView ++ 48158: newDamagePhotoPreview ++ 48481: Max ++ 48485: FontFamilyFont_android_ttcIndex ++ 48517: FontFamilyFont_ttcIndex ++ 48541: Matrix ++ 48548: CheckBox ++ 48557: get_ViewBox ++ 48569: set_ViewBox ++ 48581: viewBox ++ 48589: GetItemBy ++ 48599: get_Day ++ 48607: get_Today ++ 48617: Play ++ 48622: get_DefaultDisplay ++ 48641: cm_gray ++ 48649: DecodeByteArray ++ 48665: InitializeArray ++ 48681: ToArray ++ 48689: set_Accuracy ++ 48702: _changeStatusReady ++ 48721: body ++ 48726: get_Key ++ 48734: ContainsKey ++ 48746: FontFamily_fontProviderFetchStrategy ++ 48783: FontFamily ++ 48794: IsReadOnly ++ 48805: _isReadOnly ++ 48817: Any ++ 48821: OnDestroy ++ 48831: Copy ++ 48836: _buttonInfoDictionary ++ 48858: detailPreviewGallery ++ 48879: gallery ++ 48887: FontFamily_fontProviderQuery ++ 48916: BitmapFactory ++ 48930: get_ExternalStorageDirectory ++ 48959: Ttc.Data.Repository ++ 48979: get_ImageRepository ++ 48999: get_NewDamageRepository ++ 49023: _newDamageRepository ++ 49044: _imageRepository ++ 49061: get_VehicleRepository ++ 49083: _vehicleRepository ++ 49102: get_VehicleRepairReferenceTypeRepository ++ 49143: get_DamageTypeRepository ++ 49168: _vehicleDamageTypeRepository ++ 49197: _damageTypeRepository ++ 49219: get_InspectionRepairMetalWorkTypeRepository ++ 49263: get_DetailTypeRepository ++ 49288: get_SetItemTypeRepository ++ 49314: get_VehicleTechInspectionTypeRepository ++ 49354: set_VehicleTechInspectionTypeRepository ++ 49394: _vehicleTechInspectionTypeRepository ++ 49431: get_InspectionReasonTypeRepository ++ 49466: get_PhotoTypeRepository ++ 49490: _photoTypeRepository ++ 49511: get_RepairTypeRepository ++ 49536: _repairTypeRepository ++ 49558: _vehicleDetailStateRepository ++ 49588: get_VehicleTechControlRepository ++ 49621: _vehicleTechControlRepository ++ 49651: get_TechInspectionItemRepository ++ 49684: _techInspectionItemRepository ++ 49714: get_InspectionRepository ++ 49739: get_TechInspectionRepository ++ 49768: _techInspectionRepository ++ 49794: get_VehicleStatePhotoInspectionRepository ++ 49836: _vehicleStatePhotoInspectionRepository ++ 49875: _inspectionRepository ++ 49897: get_InspectionReasonRepository ++ 49928: _inspectionReasonRepository ++ 49956: get_InspectionVideoRepository ++ 49986: _inspectionVideoRepository ++ 50013: get_DriverRepository ++ 50034: get_VehicleRepairRepository ++ 50062: _vehicleRepairRepository ++ 50087: get_CustomerSettingsRepository ++ 50118: _customerSettingsRepository ++ 50146: get_VehicleStateDraftRepository ++ 50178: _vehicleStateDraftRepository ++ 50207: get_AccountRepository ++ 50229: _accountRepository ++ 50248: get_SparePartRepository ++ 50272: RestRepository ++ 50287: get_VehicleStatusHistoryRepository ++ 50322: _vehicleStatusHistoryRepository ++ 50354: GetStateFromHistory ++ 50374: CachedCarHistory ++ 50391: IsHistory ++ 50401: GetHistory ++ 50412: photocarhistory ++ 50428: detailhistoryhistory ++ 50449: Retry ++ 50455: Entry ++ 50461: set_JpegQuality ++ 50477: op_Equality ++ 50489: Availability ++ 50502: get_Visibility ++ 50517: set_Visibility ++ 50532: _extraVisibility ++ 50549: FontFamily_fontProviderAuthority ++ 50582: CoordinatorLayout_Layout_layout_anchorGravity ++ 50628: CoordinatorLayout_Layout_android_layout_gravity ++ 50676: get_Activity ++ 50689: SignatureSecondActivity ++ 50713: VehicleInspectionDetailDamageActivity ++ 50751: VehicleInspectionDetailSchemeActivity ++ 50789: InspectionReasonsMoreActivity ++ 50819: SignatureActivity ++ 50837: BaseActivity ++ 50850: VehicleInspectionVideoPlaybackActivity ++ 50889: InspectionRepairAdditionalActivity ++ 50924: VehicleInspectionCustomFuelActivity ++ 50960: VehicleInspectionFuelActivity ++ 50990: VehicleInspectionCustomGasFuelActivity ++ 51029: VehicleInspectionGasFuelActivity ++ 51062: VehicleInspectionTierLevelActivity ++ 51097: VehicleTechControlActivity ++ 51124: VehicleDriverTechControlActivity ++ 51157: SplashScreenActivity ++ 51178: ManagerMainActivity ++ 51198: VehicleInspectionActivity ++ 51224: VehicleInspectionSalonActivity ++ 51255: VehicleInspectionVideoActivity ++ 51286: NewDamagePhotoActivity ++ 51309: VehicleInspectionDetailTakePhotoActivity ++ 51350: InspectionTakePhotoActivity ++ 51378: VehicleInspectionCompletenessTakePhotoActivity ++ 51425: VehicleRepairActivity ++ 51447: VehicleTechControlVehiclesActivity ++ 51482: VehicleStatusesActivity ++ 51506: DriverDischargeReasonsActivity ++ 51537: InspectionReasonsActivity ++ 51563: VehicleTechControlDriversActivity ++ 51597: VehicleRepairsActivity ++ 51620: VehicleInspectionCompletenessActivity ++ 51658: VehicleInspectionDraftsActivity ++ 51690: VehicleInspectionDocumentsActivity ++ 51725: VehicleForRejectActivity ++ 51750: VehiclesForRejectActivity ++ 51776: VehicleRepairTypeSelectActivity ++ 51808: InspectionReasonsAfterAccidentActivity ++ 51847: VehicleInspectionCommentActivity ++ 51880: VehicleRepairCommentActivity ++ 51909: StartActivity ++ 51923: VehicleTechInspectionTypeListActivity ++ 51961: VehicleTechInspectionWorkListActivity ++ 51999: ImageViewActivity ++ 52017: ParkViewActivity ++ 52034: SignaturePreviewActivity ++ 52059: VehicleInspectionDetailPhotoPreviewActivity ++ 52103: VehicleInspectionChangeHistoryActivity ++ 52142: VehicleTechInspectionHistoryActivity ++ 52179: InspectionTakePhotoHistoryActivity ++ 52214: InspectionPhotoHistoryActivity ++ 52245: activity ++ 52254: get_AccidentGuilty ++ 52273: set_AccidentGuilty ++ 52292: GetAccidentGuilty ++ 52310: IsNullOrEmpty ++ 52324: isEmpty diff --git a/recon/findings/scheme/svg_context.txt b/recon/findings/scheme/svg_context.txt new file mode 100644 index 0000000..d5350e1 --- /dev/null +++ b/recon/findings/scheme/svg_context.txt @@ -0,0 +1,37 @@ +=== Strings BEFORE exterior SVG (idx 391) === +[376] US+201813: 'Левый передний диск ' +[377] US+201855: 'Правый передний диск ' +[378] US+201899: 'Правый задний диск ' +[379] US+201939: 'Левый задний диск ' +[380] US+201977: 'штампованный' +[381] US+202003: 'штампованный с колпаком' +[382] US+202051: 'литой' +[383] US+202063: '' +[393] US+324378: '' +[394] US+324458: '' +[395] US+324540: '' +[401] US+342196: '' +[402] US+342429: ' + +US+151701: + +US+152444: + +US+153157: + +US+198789: " /> + +US+342196: + +US+346287: + +US+347230: + +US+451703: + +US+453461: + +US+453726: + +US+482566: + +US+504522: + +US+505185: + +US+505848: + +US+506515: + +US+507182: + +US+508183: + +US+508758: + +US+509009: + +US+511008: + +US+513813: \ No newline at end of file diff --git a/recon/findings/scheme/us_large_10_offset109159.txt b/recon/findings/scheme/us_large_10_offset109159.txt new file mode 100644 index 0000000..a27704c --- /dev/null +++ b/recon/findings/scheme/us_large_10_offset109159.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_11_offset111910.txt b/recon/findings/scheme/us_large_11_offset111910.txt new file mode 100644 index 0000000..7ff5822 --- /dev/null +++ b/recon/findings/scheme/us_large_11_offset111910.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_12_offset114753.txt b/recon/findings/scheme/us_large_12_offset114753.txt new file mode 100644 index 0000000..21262e2 --- /dev/null +++ b/recon/findings/scheme/us_large_12_offset114753.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_13_offset118420.txt b/recon/findings/scheme/us_large_13_offset118420.txt new file mode 100644 index 0000000..844671a --- /dev/null +++ b/recon/findings/scheme/us_large_13_offset118420.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_14_offset120501.txt b/recon/findings/scheme/us_large_14_offset120501.txt new file mode 100644 index 0000000..30056ad --- /dev/null +++ b/recon/findings/scheme/us_large_14_offset120501.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_15_offset122306.txt b/recon/findings/scheme/us_large_15_offset122306.txt new file mode 100644 index 0000000..bdb4733 --- /dev/null +++ b/recon/findings/scheme/us_large_15_offset122306.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_16_offset124063.txt b/recon/findings/scheme/us_large_16_offset124063.txt new file mode 100644 index 0000000..f9828c9 --- /dev/null +++ b/recon/findings/scheme/us_large_16_offset124063.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_17_offset125816.txt b/recon/findings/scheme/us_large_17_offset125816.txt new file mode 100644 index 0000000..2368e36 --- /dev/null +++ b/recon/findings/scheme/us_large_17_offset125816.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_18_offset127623.txt b/recon/findings/scheme/us_large_18_offset127623.txt new file mode 100644 index 0000000..1d4f5a4 --- /dev/null +++ b/recon/findings/scheme/us_large_18_offset127623.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_19_offset132972.txt b/recon/findings/scheme/us_large_19_offset132972.txt new file mode 100644 index 0000000..1745725 --- /dev/null +++ b/recon/findings/scheme/us_large_19_offset132972.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_1_offset84620.txt b/recon/findings/scheme/us_large_1_offset84620.txt new file mode 100644 index 0000000..a265237 --- /dev/null +++ b/recon/findings/scheme/us_large_1_offset84620.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_20_offset137887.txt b/recon/findings/scheme/us_large_20_offset137887.txt new file mode 100644 index 0000000..c7449c7 --- /dev/null +++ b/recon/findings/scheme/us_large_20_offset137887.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_21_offset138994.txt b/recon/findings/scheme/us_large_21_offset138994.txt new file mode 100644 index 0000000..68e8e0b --- /dev/null +++ b/recon/findings/scheme/us_large_21_offset138994.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_22_offset140865.txt b/recon/findings/scheme/us_large_22_offset140865.txt new file mode 100644 index 0000000..093b064 --- /dev/null +++ b/recon/findings/scheme/us_large_22_offset140865.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_23_offset142834.txt b/recon/findings/scheme/us_large_23_offset142834.txt new file mode 100644 index 0000000..e32f76b --- /dev/null +++ b/recon/findings/scheme/us_large_23_offset142834.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_24_offset144333.txt b/recon/findings/scheme/us_large_24_offset144333.txt new file mode 100644 index 0000000..d7ade54 --- /dev/null +++ b/recon/findings/scheme/us_large_24_offset144333.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_25_offset147262.txt b/recon/findings/scheme/us_large_25_offset147262.txt new file mode 100644 index 0000000..6bafc9e --- /dev/null +++ b/recon/findings/scheme/us_large_25_offset147262.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_26_offset153870.txt b/recon/findings/scheme/us_large_26_offset153870.txt new file mode 100644 index 0000000..166ef91 --- /dev/null +++ b/recon/findings/scheme/us_large_26_offset153870.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_27_offset155413.txt b/recon/findings/scheme/us_large_27_offset155413.txt new file mode 100644 index 0000000..d83c167 --- /dev/null +++ b/recon/findings/scheme/us_large_27_offset155413.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_28_offset156808.txt b/recon/findings/scheme/us_large_28_offset156808.txt new file mode 100644 index 0000000..6539de6 --- /dev/null +++ b/recon/findings/scheme/us_large_28_offset156808.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_29_offset158325.txt b/recon/findings/scheme/us_large_29_offset158325.txt new file mode 100644 index 0000000..be47d5c --- /dev/null +++ b/recon/findings/scheme/us_large_29_offset158325.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_2_offset89239.txt b/recon/findings/scheme/us_large_2_offset89239.txt new file mode 100644 index 0000000..38749c8 --- /dev/null +++ b/recon/findings/scheme/us_large_2_offset89239.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_30_offset159392.txt b/recon/findings/scheme/us_large_30_offset159392.txt new file mode 100644 index 0000000..45d87c7 --- /dev/null +++ b/recon/findings/scheme/us_large_30_offset159392.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_31_offset160685.txt b/recon/findings/scheme/us_large_31_offset160685.txt new file mode 100644 index 0000000..9413549 --- /dev/null +++ b/recon/findings/scheme/us_large_31_offset160685.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_32_offset162068.txt b/recon/findings/scheme/us_large_32_offset162068.txt new file mode 100644 index 0000000..bf3ef00 --- /dev/null +++ b/recon/findings/scheme/us_large_32_offset162068.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_33_offset167361.txt b/recon/findings/scheme/us_large_33_offset167361.txt new file mode 100644 index 0000000..969b0b1 --- /dev/null +++ b/recon/findings/scheme/us_large_33_offset167361.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_34_offset172712.txt b/recon/findings/scheme/us_large_34_offset172712.txt new file mode 100644 index 0000000..09cbda0 --- /dev/null +++ b/recon/findings/scheme/us_large_34_offset172712.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_35_offset183329.txt b/recon/findings/scheme/us_large_35_offset183329.txt new file mode 100644 index 0000000..b56fb2e --- /dev/null +++ b/recon/findings/scheme/us_large_35_offset183329.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_36_offset184873.txt b/recon/findings/scheme/us_large_36_offset184873.txt new file mode 100644 index 0000000..ce8da30 --- /dev/null +++ b/recon/findings/scheme/us_large_36_offset184873.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_37_offset187098.txt b/recon/findings/scheme/us_large_37_offset187098.txt new file mode 100644 index 0000000..a250fcc --- /dev/null +++ b/recon/findings/scheme/us_large_37_offset187098.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_38_offset188581.txt b/recon/findings/scheme/us_large_38_offset188581.txt new file mode 100644 index 0000000..4368b2d --- /dev/null +++ b/recon/findings/scheme/us_large_38_offset188581.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_39_offset190360.txt b/recon/findings/scheme/us_large_39_offset190360.txt new file mode 100644 index 0000000..9137f51 --- /dev/null +++ b/recon/findings/scheme/us_large_39_offset190360.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_3_offset90846.txt b/recon/findings/scheme/us_large_3_offset90846.txt new file mode 100644 index 0000000..6705c2c --- /dev/null +++ b/recon/findings/scheme/us_large_3_offset90846.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_40_offset197560.txt b/recon/findings/scheme/us_large_40_offset197560.txt new file mode 100644 index 0000000..87a0ffb --- /dev/null +++ b/recon/findings/scheme/us_large_40_offset197560.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_42_offset210660.txt b/recon/findings/scheme/us_large_42_offset210660.txt new file mode 100644 index 0000000..f86b274 --- /dev/null +++ b/recon/findings/scheme/us_large_42_offset210660.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_43_offset212935.txt b/recon/findings/scheme/us_large_43_offset212935.txt new file mode 100644 index 0000000..f688169 --- /dev/null +++ b/recon/findings/scheme/us_large_43_offset212935.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_44_offset221532.txt b/recon/findings/scheme/us_large_44_offset221532.txt new file mode 100644 index 0000000..ce00b75 --- /dev/null +++ b/recon/findings/scheme/us_large_44_offset221532.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_45_offset223807.txt b/recon/findings/scheme/us_large_45_offset223807.txt new file mode 100644 index 0000000..d7b8067 --- /dev/null +++ b/recon/findings/scheme/us_large_45_offset223807.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_46_offset232404.txt b/recon/findings/scheme/us_large_46_offset232404.txt new file mode 100644 index 0000000..653aac7 --- /dev/null +++ b/recon/findings/scheme/us_large_46_offset232404.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_47_offset234679.txt b/recon/findings/scheme/us_large_47_offset234679.txt new file mode 100644 index 0000000..9c4fb25 --- /dev/null +++ b/recon/findings/scheme/us_large_47_offset234679.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_48_offset243276.txt b/recon/findings/scheme/us_large_48_offset243276.txt new file mode 100644 index 0000000..bc9a510 --- /dev/null +++ b/recon/findings/scheme/us_large_48_offset243276.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_49_offset245551.txt b/recon/findings/scheme/us_large_49_offset245551.txt new file mode 100644 index 0000000..d7bb395 --- /dev/null +++ b/recon/findings/scheme/us_large_49_offset245551.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_4_offset92714.txt b/recon/findings/scheme/us_large_4_offset92714.txt new file mode 100644 index 0000000..eae855d --- /dev/null +++ b/recon/findings/scheme/us_large_4_offset92714.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_50_offset324540.txt b/recon/findings/scheme/us_large_50_offset324540.txt new file mode 100644 index 0000000..ca78d51 --- /dev/null +++ b/recon/findings/scheme/us_large_50_offset324540.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_51_offset330189.txt b/recon/findings/scheme/us_large_51_offset330189.txt new file mode 100644 index 0000000..ae0bbef --- /dev/null +++ b/recon/findings/scheme/us_large_51_offset330189.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_52_offset332198.txt b/recon/findings/scheme/us_large_52_offset332198.txt new file mode 100644 index 0000000..57d77fa --- /dev/null +++ b/recon/findings/scheme/us_large_52_offset332198.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_53_offset333995.txt b/recon/findings/scheme/us_large_53_offset333995.txt new file mode 100644 index 0000000..577b5c7 --- /dev/null +++ b/recon/findings/scheme/us_large_53_offset333995.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_54_offset338054.txt b/recon/findings/scheme/us_large_54_offset338054.txt new file mode 100644 index 0000000..9d8e292 --- /dev/null +++ b/recon/findings/scheme/us_large_54_offset338054.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_55_offset342429.txt b/recon/findings/scheme/us_large_55_offset342429.txt new file mode 100644 index 0000000..3a4a740 --- /dev/null +++ b/recon/findings/scheme/us_large_55_offset342429.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_56_offset344372.txt b/recon/findings/scheme/us_large_56_offset344372.txt new file mode 100644 index 0000000..470fa24 --- /dev/null +++ b/recon/findings/scheme/us_large_56_offset344372.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_57_offset348151.txt b/recon/findings/scheme/us_large_57_offset348151.txt new file mode 100644 index 0000000..7c6bdc3 --- /dev/null +++ b/recon/findings/scheme/us_large_57_offset348151.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_58_offset353102.txt b/recon/findings/scheme/us_large_58_offset353102.txt new file mode 100644 index 0000000..811d057 --- /dev/null +++ b/recon/findings/scheme/us_large_58_offset353102.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_59_offset358861.txt b/recon/findings/scheme/us_large_59_offset358861.txt new file mode 100644 index 0000000..bdb06a6 --- /dev/null +++ b/recon/findings/scheme/us_large_59_offset358861.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_5_offset94700.txt b/recon/findings/scheme/us_large_5_offset94700.txt new file mode 100644 index 0000000..637a718 --- /dev/null +++ b/recon/findings/scheme/us_large_5_offset94700.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_60_offset363706.txt b/recon/findings/scheme/us_large_60_offset363706.txt new file mode 100644 index 0000000..2b40b9a --- /dev/null +++ b/recon/findings/scheme/us_large_60_offset363706.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_61_offset369021.txt b/recon/findings/scheme/us_large_61_offset369021.txt new file mode 100644 index 0000000..29b1aba --- /dev/null +++ b/recon/findings/scheme/us_large_61_offset369021.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_62_offset376392.txt b/recon/findings/scheme/us_large_62_offset376392.txt new file mode 100644 index 0000000..f5d25cb --- /dev/null +++ b/recon/findings/scheme/us_large_62_offset376392.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_63_offset378635.txt b/recon/findings/scheme/us_large_63_offset378635.txt new file mode 100644 index 0000000..85c7f78 --- /dev/null +++ b/recon/findings/scheme/us_large_63_offset378635.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_64_offset380136.txt b/recon/findings/scheme/us_large_64_offset380136.txt new file mode 100644 index 0000000..d0d4658 --- /dev/null +++ b/recon/findings/scheme/us_large_64_offset380136.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_65_offset383275.txt b/recon/findings/scheme/us_large_65_offset383275.txt new file mode 100644 index 0000000..ea0d1a9 --- /dev/null +++ b/recon/findings/scheme/us_large_65_offset383275.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_66_offset386232.txt b/recon/findings/scheme/us_large_66_offset386232.txt new file mode 100644 index 0000000..14e29cd --- /dev/null +++ b/recon/findings/scheme/us_large_66_offset386232.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_67_offset391601.txt b/recon/findings/scheme/us_large_67_offset391601.txt new file mode 100644 index 0000000..aa1df25 --- /dev/null +++ b/recon/findings/scheme/us_large_67_offset391601.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_68_offset397462.txt b/recon/findings/scheme/us_large_68_offset397462.txt new file mode 100644 index 0000000..ebd1d80 --- /dev/null +++ b/recon/findings/scheme/us_large_68_offset397462.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_69_offset403197.txt b/recon/findings/scheme/us_large_69_offset403197.txt new file mode 100644 index 0000000..49b732d --- /dev/null +++ b/recon/findings/scheme/us_large_69_offset403197.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_6_offset95957.txt b/recon/findings/scheme/us_large_6_offset95957.txt new file mode 100644 index 0000000..99a2801 --- /dev/null +++ b/recon/findings/scheme/us_large_6_offset95957.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_70_offset408296.txt b/recon/findings/scheme/us_large_70_offset408296.txt new file mode 100644 index 0000000..319fddc --- /dev/null +++ b/recon/findings/scheme/us_large_70_offset408296.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_71_offset413105.txt b/recon/findings/scheme/us_large_71_offset413105.txt new file mode 100644 index 0000000..783bb35 --- /dev/null +++ b/recon/findings/scheme/us_large_71_offset413105.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_72_offset420252.txt b/recon/findings/scheme/us_large_72_offset420252.txt new file mode 100644 index 0000000..06bf610 --- /dev/null +++ b/recon/findings/scheme/us_large_72_offset420252.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_73_offset428239.txt b/recon/findings/scheme/us_large_73_offset428239.txt new file mode 100644 index 0000000..c4fd213 --- /dev/null +++ b/recon/findings/scheme/us_large_73_offset428239.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_74_offset436258.txt b/recon/findings/scheme/us_large_74_offset436258.txt new file mode 100644 index 0000000..a69c471 --- /dev/null +++ b/recon/findings/scheme/us_large_74_offset436258.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_75_offset441025.txt b/recon/findings/scheme/us_large_75_offset441025.txt new file mode 100644 index 0000000..0742dad --- /dev/null +++ b/recon/findings/scheme/us_large_75_offset441025.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_76_offset446910.txt b/recon/findings/scheme/us_large_76_offset446910.txt new file mode 100644 index 0000000..67d5adb --- /dev/null +++ b/recon/findings/scheme/us_large_76_offset446910.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_77_offset452178.txt b/recon/findings/scheme/us_large_77_offset452178.txt new file mode 100644 index 0000000..07e60e0 --- /dev/null +++ b/recon/findings/scheme/us_large_77_offset452178.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_78_offset453991.txt b/recon/findings/scheme/us_large_78_offset453991.txt new file mode 100644 index 0000000..50c85c5 --- /dev/null +++ b/recon/findings/scheme/us_large_78_offset453991.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_79_offset456242.txt b/recon/findings/scheme/us_large_79_offset456242.txt new file mode 100644 index 0000000..ffc4dee --- /dev/null +++ b/recon/findings/scheme/us_large_79_offset456242.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_7_offset99572.txt b/recon/findings/scheme/us_large_7_offset99572.txt new file mode 100644 index 0000000..ebe7e5d --- /dev/null +++ b/recon/findings/scheme/us_large_7_offset99572.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_80_offset458765.txt b/recon/findings/scheme/us_large_80_offset458765.txt new file mode 100644 index 0000000..e80a404 --- /dev/null +++ b/recon/findings/scheme/us_large_80_offset458765.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_81_offset462090.txt b/recon/findings/scheme/us_large_81_offset462090.txt new file mode 100644 index 0000000..296f284 --- /dev/null +++ b/recon/findings/scheme/us_large_81_offset462090.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_82_offset465285.txt b/recon/findings/scheme/us_large_82_offset465285.txt new file mode 100644 index 0000000..e288b11 --- /dev/null +++ b/recon/findings/scheme/us_large_82_offset465285.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_83_offset468722.txt b/recon/findings/scheme/us_large_83_offset468722.txt new file mode 100644 index 0000000..803cf4a --- /dev/null +++ b/recon/findings/scheme/us_large_83_offset468722.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_84_offset470095.txt b/recon/findings/scheme/us_large_84_offset470095.txt new file mode 100644 index 0000000..13e9b4a --- /dev/null +++ b/recon/findings/scheme/us_large_84_offset470095.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_85_offset473760.txt b/recon/findings/scheme/us_large_85_offset473760.txt new file mode 100644 index 0000000..055b1ca --- /dev/null +++ b/recon/findings/scheme/us_large_85_offset473760.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_86_offset475107.txt b/recon/findings/scheme/us_large_86_offset475107.txt new file mode 100644 index 0000000..724840d --- /dev/null +++ b/recon/findings/scheme/us_large_86_offset475107.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_87_offset478024.txt b/recon/findings/scheme/us_large_87_offset478024.txt new file mode 100644 index 0000000..61d4d5e --- /dev/null +++ b/recon/findings/scheme/us_large_87_offset478024.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_88_offset479597.txt b/recon/findings/scheme/us_large_88_offset479597.txt new file mode 100644 index 0000000..92f20d6 --- /dev/null +++ b/recon/findings/scheme/us_large_88_offset479597.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_89_offset482566.txt b/recon/findings/scheme/us_large_89_offset482566.txt new file mode 100644 index 0000000..29f2446 --- /dev/null +++ b/recon/findings/scheme/us_large_89_offset482566.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_8_offset103281.txt b/recon/findings/scheme/us_large_8_offset103281.txt new file mode 100644 index 0000000..8d4af9c --- /dev/null +++ b/recon/findings/scheme/us_large_8_offset103281.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_90_offset483689.txt b/recon/findings/scheme/us_large_90_offset483689.txt new file mode 100644 index 0000000..60ee043 --- /dev/null +++ b/recon/findings/scheme/us_large_90_offset483689.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_91_offset488898.txt b/recon/findings/scheme/us_large_91_offset488898.txt new file mode 100644 index 0000000..f6fa434 --- /dev/null +++ b/recon/findings/scheme/us_large_91_offset488898.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_92_offset494107.txt b/recon/findings/scheme/us_large_92_offset494107.txt new file mode 100644 index 0000000..e6c2e5d --- /dev/null +++ b/recon/findings/scheme/us_large_92_offset494107.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_93_offset509661.txt b/recon/findings/scheme/us_large_93_offset509661.txt new file mode 100644 index 0000000..e65767c --- /dev/null +++ b/recon/findings/scheme/us_large_93_offset509661.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_large_9_offset106364.txt b/recon/findings/scheme/us_large_9_offset106364.txt new file mode 100644 index 0000000..9780372 --- /dev/null +++ b/recon/findings/scheme/us_large_9_offset106364.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/recon/findings/scheme/us_strings_near_svg.txt b/recon/findings/scheme/us_strings_near_svg.txt new file mode 100644 index 0000000000000000000000000000000000000000..debcdeed392a14d354808389be5384e5086b3109 GIT binary patch literal 3863 zcmbuB&1xe@6otJu_#K2-$wDBh^$VH2M92dqg9pM4nJ}IQsD&4XIG}|V3TUB#0$B{i zAznD(Fq=T$LoKzId4+uUo~mlu?#?D4>{9iubI&>V-fDHb-OiU^bl$#tb$Ri=GZ^%G zolo9eeEVWJ{j}5VcF#_$>rmZ>Y7tI$^Pl*4n1|{rR2$pfhEUyy>cKW`z4Z0MH|OEx zu=w7hmtlJs%60fF99BPq0OF40_YMUh2{;Jmji))xf3q}e2Ym>YFRHt6c6xRSqepCK zQ?VTlBir(W69H*$kYFDi6&~eX*e}9<9(FaM>iP$Z@{n>FN=TQtzw-S6qm@B%&uzj%4VHH1H;#Z-(2`r2q@u+zS<#i~D_m9PAq0ZGrLl^T`VJBH@ zOV_}Alz11t$Xm2d{tnyC@8_M%_wU}mzUaK@oPYi1tCz3OKmY9V<-2dbYeJgzRl}km zk&K2+z<#el7LJw3p-~RB5zg?}+sI_DoH^xX6UQD0Am^|N%{3Soqu51R3$oEqxpOf# zZY7D?2RhYye-rl0uv>*arG^>yi4X{zKsVAb#ua{?g*^d;-Fs_*4^ehl5J?zgM9C=t zr&w>o;e)M7*Gzp(N6xEf zBv-*+mt7X>k5IOki*5;uWmT*-T)pdZifD#gD8m}sXgZ!fDIz9YrnOa}hNg~9_E-s2 zi%ikWC-b9z==ybK_ka)8lkUt}tTnwutXnAJ+O8d2Up39rEcrber3oMbRoCF+H$8!! z|D*BkzV+T}ZtFBUbhEXoisMF5I=eBQ168tW19jirIYn<;JShTL<`#Y8RgQ)BeE;3XpN><15k4ew7Pm6fypPGRTyR2IcBB}?~{ zCA&)J1&u^O=Va1{R)Xar>E!{zEF1(LO(|#bBB-5283!_JnFecrJ(^+#uux(uM=(cZ zNn6c^sb=}|jR&$05S3$dWTSYjS{h+EjjzKR6cm}TP6dZM)~N;LVKS%jMlVMFREFGL zG8brRgfh0!IjRkrSl~d;M5J~k=(>geXdG{Vn!XN@01=L8#IZQ_u6wD@>mZGxj}nLD97v6ix7n3CB&yLNUu8UDPKK(b73Zv zG;8@TfdXfcf&vMGQJz@YMe)_I7^S9=R`m!7H%)^*9mHg{0uB?MQA8PZ2|}50*=hL! zRZLUA*0-S)sJoH^QzL(6j&zVXWilS*(k@6J<#E533GbaKO5=@!tTy literal 0 HcmV?d00001 diff --git a/recon/findings/scheme/zone_labels.json b/recon/findings/scheme/zone_labels.json new file mode 100644 index 0000000..09726c8 --- /dev/null +++ b/recon/findings/scheme/zone_labels.json @@ -0,0 +1,66 @@ +{ + "_meta": { + "source": "Ttc.dll #US heap, offsets 0x751c7–0x75a81 (consecutive UTF-16 LE strings)", + "confidence": "HIGH — 57 strings appear in exact sequential order in a single contiguous block, matching the 57 class IDs (0..56) in exterior_scheme_complete.svg", + "geographic_check": "confirmed: zone 0 (front bumper) at SVG Y=119 (top), zone 22 (rear bumper) at Y=1064 (bottom); left-side zones have small X, right-side zones have large X", + "note_typo": "zone 15 has a typo in the vendor binary: 'правй порог' (missing 'ы') — preserve as-is for matching but display as 'правый порог'", + "note_zones_34_57": "zones 34–37 are fog lights (противотуманки), zones 38–39 mirrors, 40–43 disks, 44–46 salon seats, 47–48 rear sill extensions, 49–56 bumper sub-parts and pillars" + }, + "0": "передний бампер", + "1": "передняя правая фара", + "2": "передняя левая фара", + "3": "радиатор", + "4": "капот", + "5": "лобовое стекло", + "6": "переднее левое крыло", + "7": "переднее правое крыло", + "8": "заднее левое крыло", + "9": "заднее правое крыло", + "10": "передняя левая дверь", + "11": "передняя правая дверь", + "12": "задняя левая дверь", + "13": "задняя правая дверь", + "14": "левый порог", + "15": "правый порог", + "16": "крыша", + "17": "передняя правая резина", + "18": "передняя левая резина", + "19": "задняя правая резина", + "20": "задняя левая резина", + "21": "багажник", + "22": "задний бампер", + "23": "заднее стекло", + "24": "переднее левое стекло", + "25": "переднее правое стекло", + "26": "заднее левое стекло", + "27": "заднее правое стекло", + "28": "передняя левая форточка", + "29": "передняя правая форточка", + "30": "задняя правая форточка", + "31": "задняя левая форточка", + "32": "задняя правая фара", + "33": "задняя левая фара", + "34": "передняя правая противотуманка", + "35": "передняя левая противотуманка", + "36": "задняя правая противотуманка", + "37": "задняя левая противотуманка", + "38": "правое зеркало", + "39": "левое зеркало", + "40": "задний левый диск", + "41": "задний правый диск", + "42": "передний правый диск", + "43": "передний левый диск", + "44": "водительское сидение", + "45": "пассажирское сидение", + "46": "задний диван", + "47": "задний левый порог", + "48": "задний правый порог", + "49": "задняя левая часть бампера", + "50": "задняя правая часть бампера", + "51": "передняя левая часть бампера", + "52": "передняя правая часть бампера", + "53": "задняя левая стойка", + "54": "задняя правая стойка", + "55": "передняя левая стойка", + "56": "передняя правая стойка" +}