JimSSng - 버프종료 음성알림 데이터모드 자동 인스톨러 v2.4.0

구조
----
이 EXE는 모드 데이터/바닐라 payload를 내장하지 않습니다.
반드시 데이터모드 루트의 data 폴더와 함께 둡니다.

예:
<폴더명 아무거나>\
  JimSSng_BuffEndVoice_DataInstaller.exe
  data\
  README_DATA_MODE.txt
  Source_Code\

설치 원본은 항상 EXE와 같은 폴더의 data\ 입니다.
절대경로나 이전 실행 경로를 source로 저장하지 않습니다.

[검사]
------
[검사]는 EXE 옆 source만 확인합니다.
필수 계약 파일, TSV header/기준 행, 0 byte 여부, 위험 경로 등을 확인하고 성공하면 [설치]를 활성화합니다.
특정 75/75/255 값이나 source 파일의 고정 SHA-256/모드 버전을 runtime 통과조건으로 사용하지 않습니다.
따라서 구조가 같은 content-only 업데이트는 data 파일만 교체해 기존 EXE로 설치할 수 있습니다.
계약 밖의 일반 파일은 설치하지 않고 무시합니다.

검사 성공 시 현재 필수 source 파일들의 세션 fingerprint를 저장합니다.
[설치] 직전 source가 바뀌었으면 설치를 중단하고 재검사를 요구합니다.

설치 대상
--------
대상으로 다음 중 하나를 선택할 수 있습니다.
- 모드 루트
- <name>.mpq
- <name>.mpq\data

'모드폴더 없음' 체크 후 상위 폴더를 선택하면:
  <선택 폴더>\JimSSng\JimSSng.mpq\data
를 생성합니다.

[찾기]는 Windows 신형 Explorer 스타일 IFileDialog를 사용합니다.
입력값이 비어 있으면 D2R 설치위치를 자동 탐색하여 가능하면 <Diablo II Resurrected>\mods에서 시작합니다.
자동 감지는 시작 위치만 지정하며 target을 자동 확정하지 않습니다.

v2.4 안전장치
-------------
- 현재 target 기준 스마트 병합
- 검사 후 source 변경 감지
- target preflight snapshot + 쓰기 직전 재검증
- 동일 target dataRoot 공통 named mutex
- 설치기 자체 중복 실행 mutex
- 백업/target 디스크 여유공간 사전검사
- 전체 백업 + SHA-256
- atomic tmp/old 교체
- 실패 시 전체 자동 rollback
- manifest path traversal/절대경로/family ID/hash 검증
- v2.4 이전 동일 모드 legacy 백업(v1 manifest) 호환
- source data가 없어도 검증된 백업만으로 복구 가능

백업 / 실패 로그
----------------
백업은 EXE 옆 backups\에 저장되며 자동 삭제하지 않습니다.
복구 전에는 현재 상태를 BeforeRestore로 다시 백업합니다.
실패 로그는 별도 logs 폴더 없이 EXE와 같은 폴더에 직접 남습니다.

빌드
----
Go 1.23+ 필요.
BUILD_WINDOWS.cmd 실행.
완성 EXE는 Source_Code의 상위 폴더에 생성됩니다.
