// Note: Zip CRCs are spoofable. But we use this for program updates, // so no malicious parties involved static L zipFileToJSONFingerprint(File zip) { temp zipFile = zipFile(zip); ret zipFileToJSONFingerprint(zipFile); } static L zipFileToJSONFingerprint(ZipFile zip) { ret map(listZipEntries(zip), e -> litorderedmap(name := e.getName(), size := e.getSize(), crc := intToHex((int) e.getCrc()), date := e.getTime()/1000, )); }