private static Program s_parseProgram(GL gl, Element p, ResourceLocator resources) throws ShaderCompileException, ProgramLinkException, IOException {
		Program program = new Program();
		program.init(gl.getGL2());
		
		Element shaders = p.getElementsByTag("shaders").get(0);
		for (Element s : shaders.children()) { 
			Shader shader = s_parseShader(s, resources);
			shader.init(gl.getGL2());
			if (DEBUG) System.out.println("Compiling shader: " + shader);
			shader.compile(gl.getGL2());
			if (DEBUG) System.out.println("Done compiling shader, attaching");
			program.attachShader(gl.getGL2(), shader);
		}
		if (DEBUG) System.out.println("Linking program...");
		program.link(gl.getGL2());
		if (p.getElementsByTag("uniforms").size() != 0) {
			Element uniforms  = p.getElementsByTag("uniforms").get(0);
			for (Element uni : uniforms.children()) {
				Uniform uniform = s_parseUniform(uni, program);
				uniform.init(gl.getGL2());
				program.getInputs().addInput(uniform);
			}
		}
		if (p.getElementsByTag("attributes").size() != 0) {
			Element attributes = p.getElementsByTag("attributes").get(0);
			for (Element attr : attributes.children()) {
				Attribute attrib = s_parseAttribute(attr, program);
				attrib.init(gl.getGL2());
				program.getInputs().addInput(attrib);
			}
		}
		if (DEBUG) System.out.println("Program Creation Error State: " + GLUtils.getError(gl.getGL1()));
		return program;
	}