import java.util.List;
import java.util.Map;

public class Endpoint
{
	public Endpoint() {
	}

	public void useVoid() {
	}
	
	private void privateMethod() {
	}
	
	protected void protectedMethod() {
	}	
	
	public int[] useArrayAsReturnValue() {	
		return new int[0];
	}
	
	public int useArrayAsParam(int [] arr) {	
		return 0;
	}	
	
	public java.util.List<String> useGenericsAs() {
		return null;
	}
	
	public MyMap<String, String> useMyMap() {
		return null;
	}
	
	public java.util.List<?> useGenericsAs() {
		return null;
	}	
	
	public int useMDArrayAsParam(int [][][] arr) {	
		return 0;
	}	
	
	public List<List<Map<String, String>>> useNestedGenerics() {
		return null;
	}		
	
	public List<? extends String> useExtendsInGenerics() {	
		return null;
	}		
	
	public List<? super String> useSuperInGenerics() {	
		return null;
	}		
	
	public List<List<String>> useSuperInGenericsAsParam(List<? super String> param) {
		return null;
	}		
	
	public List<BaseImplemented> useImplementedBaseInGenerics() {
		return null;
	}
	
	public javax.crypto.Cipher useUnsupportedJavaType() {
		return null;
	}	
	
	public java.net.URI useSupportedJavaType() {
	}
	
	public ImplementsRemote useImplementsRemote() {
	}
	
	public NoDefaultConstructor useNoDefaultConstructor() {
		return null;
	}
	
	public HasInadmisableInnerClass useHasInadmisableInnerClass() {
		return null;
	}
	
	public void useUsesUnsupportedAsField(UsesUnsupportedAsField param) {
		return null;
	}
	
	// Implementation cases
	public BaseNotImplemented useNotImplementedAbstractClass() {
		return null;
	}
	
	public BaseImplemented useImplementedAbstractClass() {
		return null;
	}
	
	public InterfaceImplemented useInterface() {
		return null;
	}
	
	public EnumType useEnum() {
		return null;
	}	
	
	// Inheritance cases
	public void useMultyInheritanceUseClass(MultyInheritanceUseClass param) {
		return null;
	}
	
	public SupportedMultyInheritanceWithBaseClass useSupportedMultyInheritanceWithBaseClass() {
		return null;
	}
	
	public SupportedMultyInheritanceWithInterface useSupportedMultyInheritanceWithInterface() {
		return null;
	}	

	// Using exceptions methods	
	public void useException() throws java.lang.Exception {
	}	
	
	public void useCustomException() throws CustomException {
	}
}