序言:
最近在做项目时,遇到的文件,将图片文件存储在数据库,通过Base64做中间转换。
文件上传到---->数据库:先将文件上传的文件通过Base64转换为字符串,然后将对应Base64字符串存储到数据库。
数据库获取---->到页面:从数据库获取对应Base64字符串,通过Base64转换为图片文件,输出到页面。
实现:
文件和Base64之间的相互转化工具类如下:
package weaver.mobile.core.test;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
//需要的jar包名commons-codec-1.6.jar
import org.apache.commons.codec.binary.Base64;
/**
* 文件和Base64之间的相互转化工具类
* @author rmk
*/
public class FileUtil {
/**
*
* @param path 文件全路径(加文件名)
* @return String
* @description 将文件转base64字符串
* @date 2019年11月24日
* @author rmk
*/
public static String fileToBase64(String path) {
String base64 = null;
InputStream in = null;
try {
File file = new File(path);
in = new FileInputStream(file);
byte[] bytes = new byte[(int) file.length()];
in.read(bytes);
base64 = new String(Base64.encodeBase64(bytes),"UTF-8");
System.out.println("将文件["+path+"]转base64字符串:"+base64);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return base64;
}
/**
* @param outFilePath 输出文件路径, base64 base64文件编码字符串, outFileName 输出文件名
* @return String
* @description BASE64解码成File文件
* @date 2019年11月24日
* @author rmk
*/
public static void base64ToFile(String outFilePath,String base64, String outFileName) {
System.out.println("BASE64:["+base64+"]解码成File文件["+outFilePath+"\\"+outFileName+"]");
File file = null;
//创建文件目录
String filePath=outFilePath;
File dir=new File(filePath);
if (!dir.exists() && !dir.isDirectory()) {
dir.mkdirs();
}
BufferedOutputStream bos = null;
java.io.FileOutputStream fos = null;
try {
byte[] bytes = Base64.decodeBase64(base64);
file=new File(filePath+"/"+outFileName);
fos = new java.io.FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(bytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 单元测试
*/
public static void main(String[] args) {
//定义文件路径
String filePath = "E:\\FileTest\\logs\\log4jtest.log";
//将文件转base64字符串
String base64 = fileToBase64(filePath);
System.out.println();
//定义输出文件的路径outFilePath和输出文件名outoutFileName
String outFilePath = "E:\\FileTest\\logs";
String outFileName = "test.log";
//将BASE64解码成File文件
base64ToFile(outFilePath, base64, outFileName);
}
}
结果如下:
将文件[E:\FileTest\logs\log4jtest.log]转base64字符串:MjAxOS0wNC0yMyAxNDoxOTowMSBbRVJST1JdIC0gb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5Db250ZXh0TG9hZGVyIC1Db250ZXh0TG9hZGVyLmphdmEoMzUzKSAtQ29udGV4dCBpbml0aWFsaXphdGlvbiBmYWlsZWQNCiAgICBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuQmVhbkNyZWF0aW9uRXhjZXB0aW9uOiBFcnJvciBjcmVhdGluZyBiZWFuIHdpdGggbmFtZSAnc3FsU2Vzc2lvbkZhY3RvcnknIGRlZmluZWQgaW4gVVJMIFtmaWxlOi9EOi9Qcm9ncmFtJTIwRmlsZXMlMjAoeDg2KS9Ub21jYXQ3L3dlYmFwcHMvSU1PT0MvV0VCLUlORi9jbGFzc2VzL3NwcmluZy9hcHBsaWNhdGlvbkNvbnRleHQueG1sXTogSW52b2NhdGlvbiBvZiBpbml0IG1ldGhvZCBmYWlsZWQ7IG5lc3RlZCBleGNlcHRpb24gaXMgamF2YS5sYW5nLk5vQ2xhc3NEZWZGb3VuZEVycm9yOiBTZXJpYWxpemFibGUNCglhdCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3Rvcnkuc3VwcG9ydC5BYnN0cmFjdEF1dG93aXJlQ2FwYWJsZUJlYW5GYWN0b3J5LmluaXRpYWxpemVCZWFuKEFic3RyYWN0QXV0b3dpcmVDYXBhYmxlQmVhbkZhY3RvcnkuamF2YToxNTc4KQ0KCWF0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5zdXBwb3J0LkFic3RyYWN0QXV0b3dpcmVDYXBhYmxlQmVhbkZhY3RvcnkuZG9DcmVhdGVCZWFuKEFic3RyYWN0QXV0b3dpcmVDYXBhYmxlQmVhbkZhY3RvcnkuamF2YTo1NDUpDQoJYXQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LnN1cHBvcnQuQWJzdHJhY3RBdXRvd2lyZUNhcGFibGVCZWFuRmFjdG9yeS5jcmVhdGVCZWFuKEFic3RyYWN0QXV0b3dpcmVDYXBhYmxlQmVhbkZhY3RvcnkuamF2YTo0ODIpDQoJYXQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LnN1cHBvcnQuQWJzdHJhY3RCZWFuRmFjdG9yeSQxLmdldE9iamVjdChBYnN0cmFjdEJlYW5GYWN0b3J5LmphdmE6MzA2KQ0KCWF0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5zdXBwb3J0LkRlZmF1bHRTaW5nbGV0b25CZWFuUmVnaXN0cnkuZ2V0U2luZ2xldG9uKERlZmF1bHRTaW5nbGV0b25CZWFuUmVnaXN0cnkuamF2YToyMzApDQoJYXQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LnN1cHBvcnQuQWJzdHJhY3RCZWFuRmFjdG9yeS5kb0dldEJlYW4oQWJzdHJhY3RCZWFuRmFjdG9yeS5qYXZhOjMwMikNCglhdCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3Rvcnkuc3VwcG9ydC5BYnN0cmFjdEJlYW5GYWN0b3J5LmdldEJlYW4oQWJzdHJhY3RCZWFuRmFjdG9yeS5qYXZhOjE5NykNCglhdCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3Rvcnkuc3VwcG9ydC5EZWZhdWx0TGlzdGFibGVCZWFuRmFjdG9yeS5wcmVJbnN0YW50aWF0ZVNpbmdsZXRvbnMoRGVmYXVsdExpc3RhYmxlQmVhbkZhY3RvcnkuamF2YTo3NTMpDQoJYXQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LnN1cHBvcnQuQWJzdHJhY3RBcHBsaWNhdGlvbkNvbnRleHQuZmluaXNoQmVhbkZhY3RvcnlJbml0aWFsaXphdGlvbihBYnN0cmFjdEFwcGxpY2F0aW9uQ29udGV4dC5qYXZhOjgzOSkNCglhdCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuc3VwcG9ydC5BYnN0cmFjdEFwcGxpY2F0aW9uQ29udGV4dC5yZWZyZXNoKEFic3RyYWN0QXBwbGljYXRpb25Db250ZXh0LmphdmE6NTM4KQ0KCWF0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuQ29udGV4dExvYWRlci5jb25maWd1cmVBbmRSZWZyZXNoV2ViQXBwbGljYXRpb25Db250ZXh0KENvbnRleHRMb2FkZXIuamF2YTo0NDYpDQoJYXQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5Db250ZXh0TG9hZGVyLmluaXRXZWJBcHBsaWNhdGlvbkNvbnRleHQoQ29udGV4dExvYWRlci5qYXZhOjMyOCkNCglhdCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LkNvbnRleHRMb2FkZXJMaXN0ZW5lci5jb250ZXh0SW5pdGlhbGl6ZWQoQ29udGV4dExvYWRlckxpc3RlbmVyLmphdmE6MTA3KQ0KCWF0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQubGlzdGVuZXJTdGFydChTdGFuZGFyZENvbnRleHQuamF2YTo1MTU3KQ0KCWF0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQuc3RhcnRJbnRlcm5hbChTdGFuZGFyZENvbnRleHQuamF2YTo1NjgwKQ0KCWF0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5MaWZlY3ljbGVCYXNlLnN0YXJ0KExpZmVjeWNsZUJhc2UuamF2YToxNDUpDQoJYXQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkNvbnRhaW5lckJhc2UuYWRkQ2hpbGRJbnRlcm5hbChDb250YWluZXJCYXNlLmphdmE6MTAxOCkNCglhdCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQ29udGFpbmVyQmFzZS5hZGRDaGlsZChDb250YWluZXJCYXNlLmphdmE6OTk0KQ0KCWF0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3QuYWRkQ2hpbGQoU3RhbmRhcmRIb3N0LmphdmE6NjUyKQ0KCWF0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Ib3N0Q29uZmlnLmRlcGxveURpcmVjdG9yeShIb3N0Q29uZmlnLmphdmE6MTI5NikNCglhdCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuSG9zdENvbmZpZyREZXBsb3lEaXJlY3RvcnkucnVuKEhvc3RDb25maWcuamF2YToyMDM5KQ0KCWF0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9ycyRSdW5uYWJsZUFkYXB0ZXIuY2FsbChFeGVjdXRvcnMuamF2YTo0NzEpDQoJYXQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzay5ydW4oRnV0dXJlVGFzay5qYXZhOjI2MikNCglhdCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IucnVuV29ya2VyKFRocmVhZFBvb2xFeGVjdXRvci5qYXZhOjExNDUpDQoJYXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yJFdvcmtlci5ydW4oVGhyZWFkUG9vbEV4ZWN1dG9yLmphdmE6NjE1KQ0KCWF0IGphdmEubGFuZy5UaHJlYWQucnVuKFRocmVhZC5qYXZhOjc0NSkNCkNhdXNlZCBieTogamF2YS5sYW5nLk5vQ2xhc3NEZWZGb3VuZEVycm9yOiBTZXJpYWxpemFibGUNCglhdCBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIuZGVmaW5lQ2xhc3MxKE5hdGl2ZSBNZXRob2QpDQoJYXQgamF2YS5sYW5nLkNsYXNzTG9hZGVyLmRlZmluZUNsYXNzKENsYXNzTG9hZGVyLmphdmE6ODAwKQ0KCWF0IGphdmEuc2VjdXJpdHkuU2VjdXJlQ2xhc3NMb2FkZXIuZGVmaW5lQ2xhc3MoU2VjdXJlQ2xhc3NMb2FkZXIuamF2YToxNDIpDQoJYXQgb3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIuV2ViYXBwQ2xhc3NMb2FkZXJCYXNlLmZpbmRDbGFzc0ludGVybmFsKFdlYmFwcENsYXNzTG9hZGVyQmFzZS5qYXZhOjMyMjIpDQoJYXQgb3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIuV2ViYXBwQ2xhc3NMb2FkZXJCYXNlLmZpbmRDbGFzcyhXZWJhcHBDbGFzc0xvYWRlckJhc2UuamF2YToxNDA5KQ0KCWF0IG9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcENsYXNzTG9hZGVyQmFzZS5sb2FkQ2xhc3MoV2ViYXBwQ2xhc3NMb2FkZXJCYXNlLmphdmE6MTg5NykNCglhdCBvcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlci5XZWJhcHBDbGFzc0xvYWRlckJhc2UubG9hZENsYXNzKFdlYmFwcENsYXNzTG9hZGVyQmFzZS5qYXZhOjE3NzEpDQoJYXQgamF2YS5sYW5nLkNsYXNzLmZvck5hbWUwKE5hdGl2ZSBNZXRob2QpDQoJYXQgamF2YS5sYW5nLkNsYXNzLmZvck5hbWUoQ2xhc3MuamF2YToyNzQpDQoJYXQgb3JnLmFwYWNoZS5pYmF0aXMuaW8uQ2xhc3NMb2FkZXJXcmFwcGVyLmNsYXNzRm9yTmFtZShDbGFzc0xvYWRlcldyYXBwZXIuamF2YToxNzgpDQoJYXQgb3JnLmFwYWNoZS5pYmF0aXMuaW8uQ2xhc3NMb2FkZXJXcmFwcGVyLmNsYXNzRm9yTmFtZShDbGFzc0xvYWRlcldyYXBwZXIuamF2YTo4OSkNCglhdCBvcmcuYXBhY2hlLmliYXRpcy5pby5SZXNvdXJjZXMuY2xhc3NGb3JOYW1lKFJlc291cmNlcy5qYXZhOjI1NikNCglhdCBvcmcuYXBhY2hlLmliYXRpcy5idWlsZGVyLnhtbC5YTUxDb25maWdCdWlsZGVyLnR5cGVBbGlhc2VzRWxlbWVudChYTUxDb25maWdCdWlsZGVyLmphdmE6MTIzKQ0KCWF0IG9yZy5hcGFjaGUuaWJhdGlzLmJ1aWxkZXIueG1sLlhNTENvbmZpZ0J1aWxkZXIucGFyc2VDb25maWd1cmF0aW9uKFhNTENvbmZpZ0J1aWxkZXIuamF2YTo5OSkNCglhdCBvcmcuYXBhY2hlLmliYXRpcy5idWlsZGVyLnhtbC5YTUxDb25maWdCdWlsZGVyLnBhcnNlKFhNTENvbmZpZ0J1aWxkZXIuamF2YTo5MikNCglhdCBvcmcubXliYXRpcy5zcHJpbmcuU3FsU2Vzc2lvbkZhY3RvcnlCZWFuLmJ1aWxkU3FsU2Vzc2lvbkZhY3RvcnkoU3FsU2Vzc2lvbkZhY3RvcnlCZWFuLmphdmE6NDI4KQ0KCWF0IG9yZy5teWJhdGlzLnNwcmluZy5TcWxTZXNzaW9uRmFjdG9yeUJlYW4uYWZ0ZXJQcm9wZXJ0aWVzU2V0KFNxbFNlc3Npb25GYWN0b3J5QmVhbi5qYXZhOjM0MCkNCglhdCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3Rvcnkuc3VwcG9ydC5BYnN0cmFjdEF1dG93aXJlQ2FwYWJsZUJlYW5GYWN0b3J5Lmludm9rZUluaXRNZXRob2RzKEFic3RyYWN0QXV0b3dpcmVDYXBhYmxlQmVhbkZhY3RvcnkuamF2YToxNjM3KQ0KCWF0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5zdXBwb3J0LkFic3RyYWN0QXV0b3dpcmVDYXBhYmxlQmVhbkZhY3RvcnkuaW5pdGlhbGl6ZUJlYW4oQWJzdHJhY3RBdXRvd2lyZUNhcGFibGVCZWFuRmFjdG9yeS5qYXZhOjE1NzQpDQoJLi4uIDI1IG1vcmUNCkNhdXNlZCBieTogamF2YS5sYW5nLkNsYXNzTm90Rm91bmRFeGNlcHRpb246IFNlcmlhbGl6YWJsZQ0KCWF0IG9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcENsYXNzTG9hZGVyQmFzZS5sb2FkQ2xhc3MoV2ViYXBwQ2xhc3NMb2FkZXJCYXNlLmphdmE6MTkyOCkNCglhdCBvcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlci5XZWJhcHBDbGFzc0xvYWRlckJhc2UubG9hZENsYXNzKFdlYmFwcENsYXNzTG9hZGVyQmFzZS5qYXZhOjE3NzEpDQoJLi4uIDQ0IG1vcmUNCjIwMTktMDQtMjMgMTQ6MjA6MzggW0VSUk9SXSAtIG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuQ29udGV4dExvYWRlciAtQ29udGV4dExvYWRlci5qYXZhKDM1MykgLUNvbnRleHQgaW5pdGlhbGl6YXRpb24gZmFpbGVkDQogICAgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LkJlYW5DcmVhdGlvbkV4Y2VwdGlvbjogRXJyb3IgY3JlYXRpbmcgYmVhbiB3aXRoIG5hbWUgJ3NxbFNlc3Npb25GYWN0b3J5JyBkZWZpbmVkIGluIFVSTCBbZmlsZTovRDovUHJvZ3JhbSUyMEZpbGVzJTIwKHg4NikvVG9tY2F0Ny93ZWJhcHBzL0lNT09DL1dFQi1JTkYvY2xhc3Nlcy9zcHJpbmcvYXBwbGljYXRpb25Db250ZXh0LnhtbF06IEludm9jYXRpb24gb2YgaW5pdCBtZXRob2QgZmFpbGVkOyBuZXN0ZWQgZXhjZXB0aW9uIGlzIGphdmEubGFuZy5Ob0NsYXNzRGVmRm91bmRFcnJvcjogU2VyaWFsaXphYmxlDQoJYXQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LnN1cHBvcnQuQWJzdHJhY3RBdXRvd2lyZUNhcGFibGVCZWFuRmFjdG9yeS5pbml0aWFsaXplQmVhbihBYnN0cmFjdEF1dG93aXJlQ2FwYWJsZUJlYW5GYWN0b3J5LmphdmE6MTU3OCkNCglhdCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3Rvcnkuc3VwcG9ydC5BYnN0cmFjdEF1dG93aXJlQ2FwYWJsZUJlYW5GYWN0b3J5LmRvQ3JlYXRlQmVhbihBYnN0cmFjdEF1dG93aXJlQ2FwYWJsZUJlYW5GYWN0b3J5LmphdmE6NTQ1KQ0KCWF0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5zdXBwb3J0LkFic3RyYWN0QXV0b3dpcmVDYXBhYmxlQmVhbkZhY3RvcnkuY3JlYXRlQmVhbihBYnN0cmFjdEF1dG93aXJlQ2FwYWJsZUJlYW5GYWN0b3J5LmphdmE6NDgyKQ0KCWF0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5zdXBwb3J0LkFic3RyYWN0QmVhbkZhY3RvcnkkMS5nZXRPYmplY3QoQWJzdHJhY3RCZWFuRmFjdG9yeS5qYXZhOjMwNikNCglhdCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3Rvcnkuc3VwcG9ydC5EZWZhdWx0U2luZ2xldG9uQmVhblJlZ2lzdHJ5LmdldFNpbmdsZXRvbihEZWZhdWx0U2luZ2xldG9uQmVhblJlZ2lzdHJ5LmphdmE6MjMwKQ0KCWF0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5zdXBwb3J0LkFic3RyYWN0QmVhbkZhY3RvcnkuZG9HZXRCZWFuKEFic3RyYWN0QmVhbkZhY3RvcnkuamF2YTozMDIpDQoJYXQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LnN1cHBvcnQuQWJzdHJhY3RCZWFuRmFjdG9yeS5nZXRCZWFuKEFic3RyYWN0QmVhbkZhY3RvcnkuamF2YToxOTcpDQoJYXQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LnN1cHBvcnQuRGVmYXVsdExpc3RhYmxlQmVhbkZhY3RvcnkucHJlSW5zdGFudGlhdGVTaW5nbGV0b25zKERlZmF1bHRMaXN0YWJsZUJlYW5GYWN0b3J5LmphdmE6NzUzKQ0KCWF0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5zdXBwb3J0LkFic3RyYWN0QXBwbGljYXRpb25Db250ZXh0LmZpbmlzaEJlYW5GYWN0b3J5SW5pdGlhbGl6YXRpb24oQWJzdHJhY3RBcHBsaWNhdGlvbkNvbnRleHQuamF2YTo4MzkpDQoJYXQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LnN1cHBvcnQuQWJzdHJhY3RBcHBsaWNhdGlvbkNvbnRleHQucmVmcmVzaChBYnN0cmFjdEFwcGxpY2F0aW9uQ29udGV4dC5qYXZhOjUzOCkNCglhdCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LkNvbnRleHRMb2FkZXIuY29uZmlndXJlQW5kUmVmcmVzaFdlYkFwcGxpY2F0aW9uQ29udGV4dChDb250ZXh0TG9hZGVyLmphdmE6NDQ2KQ0KCWF0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQuQ29udGV4dExvYWRlci5pbml0V2ViQXBwbGljYXRpb25Db250ZXh0KENvbnRleHRMb2FkZXIuamF2YTozMjgpDQoJYXQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5Db250ZXh0TG9hZGVyTGlzdGVuZXIuY29udGV4dEluaXRpYWxpemVkKENvbnRleHRMb2FkZXJMaXN0ZW5lci5qYXZhOjEwNykNCglhdCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0Lmxpc3RlbmVyU3RhcnQoU3RhbmRhcmRDb250ZXh0LmphdmE6NTE1NykNCglhdCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0LnN0YXJ0SW50ZXJuYWwoU3RhbmRhcmRDb250ZXh0LmphdmE6NTY4MCkNCglhdCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlQmFzZS5zdGFydChMaWZlY3ljbGVCYXNlLmphdmE6MTQ1KQ0KCWF0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5Db250YWluZXJCYXNlLmFkZENoaWxkSW50ZXJuYWwoQ29udGFpbmVyQmFzZS5qYXZhOjEwMTgpDQoJYXQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkNvbnRhaW5lckJhc2UuYWRkQ2hpbGQoQ29udGFpbmVyQmFzZS5qYXZhOjk5NCkNCglhdCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0LmFkZENoaWxkKFN0YW5kYXJkSG9zdC5qYXZhOjY1MikNCglhdCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuSG9zdENvbmZpZy5kZXBsb3lEaXJlY3RvcnkoSG9zdENvbmZpZy5qYXZhOjEyOTYpDQoJYXQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkhvc3RDb25maWckRGVwbG95RGlyZWN0b3J5LnJ1bihIb3N0Q29uZmlnLmphdmE6MjAzOSkNCglhdCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMkUnVubmFibGVBZGFwdGVyLmNhbGwoRXhlY3V0b3JzLmphdmE6NDcxKQ0KCWF0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2sucnVuKEZ1dHVyZVRhc2suamF2YToyNjIpDQoJYXQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLnJ1bldvcmtlcih