class BaseGeneric<T>
{
	public class InnerDerived
	{
		public InnerDerived (T t)
		{
		}
	}
	
	public class GenericInnerDerived<U>
	{
		public GenericInnerDerived (T t, U u)
		{
		}
	}
}

class BaseConcrete : BaseGeneric<string>
{
}

class Concrete_A : BaseGeneric<int>
{
}

class Concrete_B : BaseConcrete
{
	InnerDerived foo1;
}

class BaseGeneric_2<T, U>
{
	public class InnerDerived
	{
		public InnerDerived (T t, U u)
		{
		}
	}
}

class BaseGeneric_1<T> : BaseGeneric_2<T, string>
{
}

class Concrete_2 : BaseGeneric_1<bool>
{
}


class Program
{
    public static void Main ()
    {
		new Concrete_B.InnerDerived ("abc");
		new Concrete_A.InnerDerived (11);
		new Concrete_A.GenericInnerDerived<int> (1, 2);
		new Concrete_2.InnerDerived (false, "bb");
    }
}