- ElectionCandidateData: replace String symbol with Boolean hasSymbol + add memberId - ElectionCandidateApiResource: symbol upload/download via ContentStoreService (mimeType|storagePath format, backward-compatible with legacy base64 records) - ElectionVotingApiResource: add GET /vote-summary endpoint (totalVotes, totalVoters, per-candidate breakdown) using ElectionVoteRepository queries - ElectionVoteRepository: add countByElectionConfigId and voteSummaryByCandidate queries - ElectionReadPlatformServiceImpl: map hasSymbol and memberId in candidate list response - ElectionWritePlatformServiceImpl: set photoUrl from memberId on approveCandidate, delete old symbol file from ContentStore on removeCandidate Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>