- /* package whatever; // don't place package name! */ 
-   
- import java.util.*; 
- import java.lang.*; 
- import java.io.*; 
-   
- interface Interface { 
- } 
-   
- class Foo implements Interface { 
- 	Foo(int magicInt) { magicInt = magicInt + 1; /* do some fancy calculations */ } 
- } 
-   
- class Bar implements Interface { 
- 	Bar(int magicInt) { magicInt = magicInt + 2; /* do some fancy calculations */ } 
- } 
-   
- class Factory<T extends Interface> { 
-     int magicInt = 0;  
-   
-     T createNewObject(Class<T> typeToMake) { 
-     	final java.lang.reflect.Constructor<T> magicIntConstructor; 
-     	try { 
-     		magicIntConstructor  =-  typeToMake. getDeclaredConstructor(Integer- . TYPE);
-     	} 
-     	final T t; 
-     	try { 
-     		t = magicIntConstructor.newInstance(magicInt); 
-     	} 
-     	return t; 
-     } 
- } 
-   
- /* Name of the class has to be "Main" only if the class is public. */ 
- class Ideone 
- { 
- 	{ 
- 		Factory<Foo> fooFactory = new Factory<Foo>(); 
- 		Foo foo = fooFactory.createNewObject(Foo.class); 
-   
- 		Factory<Bar> barFactory = new Factory<Bar>(); 
- 		Bar bar = barFactory.createNewObject(Bar.class); 
- 	} 
- } 
-   
				LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgppbnRlcmZhY2UgSW50ZXJmYWNlIHsKfQoKY2xhc3MgRm9vIGltcGxlbWVudHMgSW50ZXJmYWNlIHsKCUZvbyhpbnQgbWFnaWNJbnQpIHsgbWFnaWNJbnQgPSBtYWdpY0ludCArIDE7IC8qIGRvIHNvbWUgZmFuY3kgY2FsY3VsYXRpb25zICovIH0KfQoKY2xhc3MgQmFyIGltcGxlbWVudHMgSW50ZXJmYWNlIHsKCUJhcihpbnQgbWFnaWNJbnQpIHsgbWFnaWNJbnQgPSBtYWdpY0ludCArIDI7IC8qIGRvIHNvbWUgZmFuY3kgY2FsY3VsYXRpb25zICovIH0KfQoKY2xhc3MgRmFjdG9yeTxUIGV4dGVuZHMgSW50ZXJmYWNlPiB7CiAgICBpbnQgbWFnaWNJbnQgPSAwOyAKCiAgICBUIGNyZWF0ZU5ld09iamVjdChDbGFzczxUPiB0eXBlVG9NYWtlKSB7CiAgICAJZmluYWwgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I8VD4gbWFnaWNJbnRDb25zdHJ1Y3RvcjsKICAgIAl0cnkgewogICAgCQltYWdpY0ludENvbnN0cnVjdG9yID0gdHlwZVRvTWFrZS5nZXREZWNsYXJlZENvbnN0cnVjdG9yKEludGVnZXIuVFlQRSk7CiAgICAJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKICAgIAkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIHZhbGlkIGNvbnN0cnVjdG9yISIpOwogICAgCX0KICAgIAlmaW5hbCBUIHQ7CiAgICAJdHJ5IHsKICAgIAkJdCA9IG1hZ2ljSW50Q29uc3RydWN0b3IubmV3SW5zdGFuY2UobWFnaWNJbnQpOwogICAgCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb258SWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbnxqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKICAgIAkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkbid0IGluc3RhbnRpYXRlLiIpOwogICAgCX0KICAgIAlyZXR1cm4gdDsKICAgIH0KfQoKLyogTmFtZSBvZiB0aGUgY2xhc3MgaGFzIHRvIGJlICJNYWluIiBvbmx5IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMuICovCmNsYXNzIElkZW9uZQp7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQlGYWN0b3J5PEZvbz4gZm9vRmFjdG9yeSA9IG5ldyBGYWN0b3J5PEZvbz4oKTsKCQlGb28gZm9vID0gZm9vRmFjdG9yeS5jcmVhdGVOZXdPYmplY3QoRm9vLmNsYXNzKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oZm9vKTsKCQkKCQlGYWN0b3J5PEJhcj4gYmFyRmFjdG9yeSA9IG5ldyBGYWN0b3J5PEJhcj4oKTsKCQlCYXIgYmFyID0gYmFyRmFjdG9yeS5jcmVhdGVOZXdPYmplY3QoQmFyLmNsYXNzKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oYmFyKTsKCX0KfQo=