@SuppressWarnings("unused") // looks like Client is unused, but it's not
   public static void main(String args[]) throws Exception {
      if (System.getSecurityManager() == null)
         System.setSecurityManager(new SecurityManager() {
            @Override
            public void checkPermission(java.security.Permission perm) {}
         });  // give loaded controllers FULL permissions
      String server     = args.length > 0 ? args[0] : "//localhost:1198/main";
      int clientPort    = args.length > 1 ? Integer.parseInt(args[1]) : 0;
      String clientHost = args.length > 2 ? args[2] : null;
      int localPort     = args.length > 3 ? Integer.parseInt(args[3]) : 0;
      String localHost  = args.length > 4 ? args[4] :
         java.net.InetAddress.getLocalHost().getHostAddress();
      Remote.config(localHost, localPort, clientHost, clientPort);
      Object object = java.rmi.Naming.lookup(server); // fetch service by URL
      object = Remote.invoke(object, "getController", null);
      try { Remote.invoke(object, "init", new gnu.cajo.Cajo()); }
      catch(Throwable t) {} // won't work running in WebStart
      object = Remote.invoke(object, "getView", null);
      String title = null;
      try { title = System.getProperty("cajo.sdk.Client.title"); }
      catch(Throwable t) {} // won't work running in WebStart
      if (title == null) title = "cajo viewer";  // default
      new Client((JComponent)object, title + " - " + server);
   }