func Tesses.CrossLang.Shell.WebApp(dd)
{
    var dir = Env.CrossLangConfig / "WebApps";
    if(dd.Arguments.Length == 1)
    {
        Console.WriteLine("List of web applications:");
        Console.WriteLine("Use --port=PORT to set port");
        
		if(FS.Local.DirectoryExists(dir))
        each(var item : FS.Local.EnumeratePaths(dir))
        {
            Console.WriteLine(Tesses.CrossLang.GetNameAndDescription(item / item.GetFileName() + ".crvm"));
        }
        return 0;
    }
	else if(dd.Arguments.Length >= 2)
	{
		var webappname = dd.Arguments[1];
		var webapppath = dir / webappname / webappname + ".crvm";
        var port = 4206;
        each(var item : dd.Options)
        {
            if(item.Key == "port")
            {
                var thePort = ParseLong(item.Value);
                if(TypeOf(thePort) == "Long") port = thePort;
            }
        }


		if(FS.Local.FileExists(webapppath))
		{
			const _dict = {};
    		const env = VM.CreateEnvironment(_dict);
		    env.RegisterEverything();
    		env.LockRegister();

			_dict.Net ?? = {};
			_dict.Net.WebServerPort = port;
			

	    	env.LoadFileWithDependencies(FS.Local,webapppath);
	    	var myArgs = [webapppath.ToString()];
		    for(var i = 2; i < dd.Arguments.Count; i++)
    		{
    	    	myArgs.Add(dd.Arguments[i]);
		    }
    		var res = env.GetDictionary().WebAppMain(myArgs);


            Net.Http.ListenSimpleWithLoop(res, port);
			res.Close();
			return 0;
		}
		else {
			Console.WriteLine($"Could not find web application with name {toolname}.");
			return 1;
		}
	}

}