sclass GazAICredentials { settable S user; settable S password; toString { ret joinNempties(" with ", shortClassName(this), nempty(user) ? "user " + user : null, nempty(password) ? "password" : null); } static GazAICredentials fromFile(File f) { var credMap = parseColonPropertyCIMap(loadTextFile(f)); var cred = new GazAICredentials; cred.user(credMap.get("user"); cred.password(credMap.get("password"); ret cred; } void save(File f) { saveTextFile(f, formatColonProperties(litorderedmap( +user, +password ))); } Map asParams() { ret litorderedmap(+user, pw := password); } }