├── META-INF
└── MANIFEST.MF
├── src
├── META-INF
│ └── MANIFEST.MF
├── DecryptoXxxx.java
├── DecryptoXxxx.form
└── myutils
│ └── XxxxUtils.java
├── eval.class
├── forreadme1.png
├── out
├── production
│ └── DecodeGozillaSwing
│ │ ├── META-INF
│ │ └── MANIFEST.MF
│ │ ├── DecryptoXxxx.class
│ │ ├── DecryptoXxxx$1.class
│ │ ├── DecryptoXxxx$2.class
│ │ ├── DecryptoXxxx$3.class
│ │ ├── DecryptoXxxx$4.class
│ │ ├── myutils
│ │ └── XxxxUtils.class
│ │ └── com
│ │ └── intellij
│ │ └── uiDesigner
│ │ └── core
│ │ ├── Util.class
│ │ ├── Spacer.class
│ │ ├── LayoutState.class
│ │ ├── SupportCode.class
│ │ ├── AbstractLayout.class
│ │ ├── DimensionInfo.class
│ │ ├── HorizontalInfo.class
│ │ ├── VerticalInfo.class
│ │ ├── GridConstraints.class
│ │ ├── GridLayoutManager.class
│ │ └── SupportCode$TextWithMnemonic.class
└── artifacts
│ └── DecodeGozillaSwing_jar
│ └── DecodeGozillaSwing.jar
├── .idea
├── .gitignore
├── misc.xml
├── modules.xml
├── runConfigurations.xml
├── artifacts
│ └── DecodeGozillaSwing_jar.xml
└── uiDesigner.xml
├── DecodeGozillaSwing.iml
└── README.md
/META-INF/MANIFEST.MF:
--------------------------------------------------------------------------------
1 | Manifest-Version: 1.0
2 | Main-Class: DecryptoXxxx
3 |
4 |
--------------------------------------------------------------------------------
/src/META-INF/MANIFEST.MF:
--------------------------------------------------------------------------------
1 | Manifest-Version: 1.0
2 | Main-Class: DecryptoXxxx
3 |
4 |
--------------------------------------------------------------------------------
/eval.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/eval.class
--------------------------------------------------------------------------------
/forreadme1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/forreadme1.png
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/META-INF/MANIFEST.MF:
--------------------------------------------------------------------------------
1 | Manifest-Version: 1.0
2 | Main-Class: DecryptoXxxx
3 |
4 |
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/DecryptoXxxx.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/DecryptoXxxx.class
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/DecryptoXxxx$1.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/DecryptoXxxx$1.class
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/DecryptoXxxx$2.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/DecryptoXxxx$2.class
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/DecryptoXxxx$3.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/DecryptoXxxx$3.class
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/DecryptoXxxx$4.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/DecryptoXxxx$4.class
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/myutils/XxxxUtils.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/myutils/XxxxUtils.class
--------------------------------------------------------------------------------
/out/artifacts/DecodeGozillaSwing_jar/DecodeGozillaSwing.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/artifacts/DecodeGozillaSwing_jar/DecodeGozillaSwing.jar
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/Util.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/Util.class
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/Spacer.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/Spacer.class
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Datasource local storage ignored files
5 | /dataSources/
6 | /dataSources.local.xml
7 | # Editor-based HTTP Client requests
8 | /httpRequests/
9 |
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/LayoutState.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/LayoutState.class
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/SupportCode.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/SupportCode.class
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/AbstractLayout.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/AbstractLayout.class
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/DimensionInfo.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/DimensionInfo.class
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/HorizontalInfo.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/HorizontalInfo.class
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/VerticalInfo.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/VerticalInfo.class
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/GridConstraints.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/GridConstraints.class
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/GridLayoutManager.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/GridLayoutManager.class
--------------------------------------------------------------------------------
/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/SupportCode$TextWithMnemonic.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhangxiaohui/DecodeSomeJSPWebshell/HEAD/out/production/DecodeGozillaSwing/com/intellij/uiDesigner/core/SupportCode$TextWithMnemonic.class
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
--------------------------------------------------------------------------------
/DecodeGozillaSwing.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.idea/artifacts/DecodeGozillaSwing_jar.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | $PROJECT_DIR$/out/artifacts/DecodeGozillaSwing_jar
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # DecodeSomeJSPWebshell
2 | 利用java Swing 简单写的一个jspWebshell 解密工具:
3 | 支持 冰蝎2,冰蝎3,哥斯拉
4 | ## 使用案例:
5 | 如下为冰蝎3通信时产生的流量,对齐进行解密
6 | 
7 | 使用工具,输入密码,对其进行解密:
8 | 
9 | 
10 | 还原出使用的payload 恶意类
11 |
12 | 哥斯拉的解密同理 案例如下,注意注入的密码为shell里面定义的的pass也就是密码,输入的密钥为shell里面定义的xc 也就是密钥的md5的前16位:
13 | 案例如下:
14 | 
15 | 
16 |
17 |
18 | # 问题:
19 | ## 目前存在的问题:
20 | 因为冰蝎webshell管理工具的jsp马其本身在实现的时候:客户端发起命令执行的请求流量是以加密后base64编码传输的,但是服务端发回的命令执行的结果的响应流量的传输内容是直接为AES加密之后的
21 | 二进制流,因为我们通过wireshark或者bp抓到的流量中,展现形式通常以看见字符的解码方式去解码,所以导致我们看到的都是一些乱码。因此在实现响应流解密的时候,这里规定要使用响应内容的16进制,
22 | 内部的话从16进制还原成bytes ,然后实现AES解密,下面这张图是我们在尝试解密冰蝎响应流量时,要get的部分:
23 |
24 | 
25 |
26 | 这里之后还要想办法优化下,暂时先这样吧
27 |
28 | ## 解密中存在的问题:
29 | 冰蝎2**首次**持续化通信阶段,服务端响应流量解密不出来,其他正常;
30 |
31 | 冰蝎3也是一样,没有之前的密钥协商,首次就是第一次,所以第一次的响应流量解密失败,其他正常;
32 |
33 | 哥斯拉请求响应流量还原正常;
34 |
--------------------------------------------------------------------------------
/src/DecryptoXxxx.java:
--------------------------------------------------------------------------------
1 | import myutils.XxxxUtils;
2 |
3 | import javax.swing.*;
4 | import java.awt.event.MouseAdapter;
5 | import java.awt.event.MouseEvent;
6 |
7 | public class DecryptoXxxx {
8 | private XxxxUtils utils;
9 | private JTabbedPane tabbedPane1;
10 | private JPanel panel1;
11 | private JTextField textField_beyound_key;
12 | private JTextArea textArea_beyound_secret;
13 | private JButton button_beyound_decrypto;
14 | private JTextArea textArea_beyound_text;
15 | private JButton button_beyound_clean;
16 | private JTextField textField_beyound_notice;
17 | private JTextField textField_godzilla_key;
18 | private JTextField textField_godzilla_pwd;
19 | private JTextArea textArea_godzilla_secret;
20 | private JButton button_godzilladecrypto;
21 | private JButton button_godzilla_clean;
22 | private JTextArea textArea_godzilla_text;
23 | private JTextField textField_godzilla_notice;
24 |
25 | public DecryptoXxxx() {
26 | button_beyound_decrypto.addMouseListener(new MouseAdapter() {
27 | @Override
28 | public void mouseClicked(MouseEvent e) {
29 | textField_beyound_notice.setText("");
30 | utils = new XxxxUtils();
31 | String key = textField_beyound_key.getText().trim();
32 | String secret = textArea_beyound_secret.getText().trim();
33 | String result = "";
34 | try {
35 | result = utils.deCrytoforbehinderClienttoServer(key, secret);
36 | System.out.println("当成请求流量处理");
37 | textField_beyound_notice.setText("此流量为客户端请求连接流量");
38 |
39 | } catch (Exception ex) {
40 | System.out.println("当成响应流量处理");
41 | try {
42 | result = utils.deCrytoforbehinderServertoClient(key, secret);
43 | textField_beyound_notice.setText("此流量为服务端执行命令后的响应流量");
44 | } catch (Exception exc) {
45 | System.out.println("既不是请求流量也不是响应流量");
46 | result = "既不是请求流量也不是响应流量,流量错误或密钥错误";
47 | textField_beyound_notice.setText("请确认流量正确,密码密钥存在切正确");
48 | exc.printStackTrace();
49 | }
50 | }
51 | textArea_beyound_text.setText(result);
52 | super.mouseClicked(e);
53 | }
54 | });
55 | button_beyound_clean.addMouseListener(new MouseAdapter() {
56 | @Override
57 | public void mouseClicked(MouseEvent e) {
58 | textField_beyound_notice.setText("");
59 | textArea_beyound_text.setText("");
60 | textArea_beyound_secret.setText("");
61 | super.mouseClicked(e);
62 | }
63 | });
64 | button_godzilladecrypto.addMouseListener(new MouseAdapter() {
65 | @Override
66 | public void mouseClicked(MouseEvent e) {
67 | textField_godzilla_notice.setText("");
68 | utils = new XxxxUtils();
69 | String key = textField_godzilla_key.getText().trim();
70 | String pwd = textField_godzilla_pwd.getText().trim();
71 | String secret = textArea_godzilla_secret.getText().trim();
72 | String result = "";
73 |
74 | try {
75 | result = utils.deCryptoforGodzillaClienttoServer(secret, key);
76 | textField_godzilla_notice.setText("此流量为哥斯拉请求流量");
77 | } catch (Exception ex) {
78 | try {
79 | result = utils.deCryptoforGodzillaServertoclient(secret, key, pwd);
80 | textField_godzilla_notice.setText("此流量为哥斯拉响应流量");
81 | if (result.equals("请输入正确的密码和密钥参数")) {
82 | result = "既不是请求流量也不是响应流量,流量错误或密钥错误";
83 | }
84 | // ex.printStackTrace();
85 | } catch (Exception exc) {
86 | System.out.println("既不是请求流量也不是响应流量");
87 | result = "既不是请求流量也不是响应流量,流量错误或密钥错误";
88 | textField_godzilla_notice.setText("请确认流量正确,密码密钥存在切正确");
89 | // exc.printStackTrace();
90 | }
91 |
92 | }
93 | textArea_godzilla_text.setText(result);
94 | super.mouseClicked(e);
95 | }
96 | });
97 | button_godzilla_clean.addMouseListener(new MouseAdapter() {
98 | @Override
99 | public void mouseClicked(MouseEvent e) {
100 | textField_godzilla_notice.setText("");
101 | textArea_godzilla_text.setText("");
102 | textArea_godzilla_secret.setText("");
103 | super.mouseClicked(e);
104 | }
105 | });
106 | }
107 |
108 | public static void main(String[] args) {
109 | JFrame frame = new JFrame("JWebshellDecoder by ga0weI");
110 | frame.setContentPane(new DecryptoXxxx().panel1);
111 | frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
112 | frame.pack();
113 | frame.setVisible(true);
114 | frame.setSize(800, 1000);
115 | frame.setResizable(false);
116 | }
117 |
118 |
119 | }
120 |
--------------------------------------------------------------------------------
/.idea/uiDesigner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
7 |
8 | -
9 |
10 |
11 | -
12 |
13 |
14 | -
15 |
16 |
17 | -
18 |
19 |
20 |
21 |
22 |
23 | -
24 |
25 |
26 |
27 |
28 |
29 | -
30 |
31 |
32 |
33 |
34 |
35 | -
36 |
37 |
38 |
39 |
40 |
41 | -
42 |
43 |
44 |
45 |
46 | -
47 |
48 |
49 |
50 |
51 | -
52 |
53 |
54 |
55 |
56 | -
57 |
58 |
59 |
60 |
61 | -
62 |
63 |
64 |
65 |
66 | -
67 |
68 |
69 |
70 |
71 | -
72 |
73 |
74 | -
75 |
76 |
77 |
78 |
79 | -
80 |
81 |
82 |
83 |
84 | -
85 |
86 |
87 |
88 |
89 | -
90 |
91 |
92 |
93 |
94 | -
95 |
96 |
97 |
98 |
99 | -
100 |
101 |
102 | -
103 |
104 |
105 | -
106 |
107 |
108 | -
109 |
110 |
111 | -
112 |
113 |
114 |
115 |
116 | -
117 |
118 |
119 | -
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
--------------------------------------------------------------------------------
/src/DecryptoXxxx.form:
--------------------------------------------------------------------------------
1 |
2 |
262 |
--------------------------------------------------------------------------------
/src/myutils/XxxxUtils.java:
--------------------------------------------------------------------------------
1 | package myutils;
2 |
3 | //import cn.hutool.core.util.HexUtil;
4 |
5 | import javax.crypto.Cipher;
6 | import javax.crypto.spec.SecretKeySpec;
7 | import java.io.*;
8 | import java.math.BigInteger;
9 | import java.net.URLDecoder;
10 | import java.security.Key;
11 | import java.security.MessageDigest;
12 | import java.util.Base64;
13 | import java.util.regex.Matcher;
14 | import java.util.regex.Pattern;
15 | import java.util.zip.GZIPInputStream;
16 | import java.util.zip.ZipException;
17 |
18 | public class XxxxUtils {
19 | public static final char[] hexCode = "0123456789abcdef".toCharArray();
20 |
21 |
22 | /**
23 | * 将base64编码的字节码还原成class文件
24 | * @param base64edString
25 | * @throws Exception
26 | */
27 | public void getBase64edClass(String base64edString) throws Exception{
28 | byte[] classcode = Base64.getDecoder().decode(base64edString);
29 |
30 | FileOutputStream fos = new FileOutputStream("orginal.class");
31 | fos.write(classcode);
32 | System.out.println("class还原成功,生成orginal.class");
33 | }
34 |
35 | /**
36 | *
37 | 冰鞋流量 客户端to服务端流量解密(客户端尝试发起执行命令的流量)
38 | 输入:加密使用的key、通信流量(一个base64编码内容)
39 | 输出:发送的class文件内容,并生成eval.class文件
40 | */
41 | public String deCrytoforbehinderClienttoServer(String key, String text) throws Exception {
42 | byte[] ciphertext = Base64.getDecoder().decode(text);
43 | Cipher c = Cipher.getInstance("AES");
44 | c.init(2, new SecretKeySpec(key.getBytes(), "AES"));
45 | byte[] classdata = c.doFinal(ciphertext);
46 | String data = new String(classdata);
47 | FileOutputStream fos = new FileOutputStream(new File("eval.class"));
48 | fos.write(classdata);
49 | System.out.println("eval文件写出成功");
50 | return "冰蝎客户端请求流量,恶意payload class字节码文件已还原至根目录下 eval.class中";
51 | }
52 |
53 | /**
54 | 冰鞋流量 服务端to客户端流量解密(命令执行之后返回的流量)
55 | 输入:加密使用的key、通信流量(16进制流量,wireshark里面的原始数据里面的请求体内容)
56 | 输出:解密之后命令执行的响应体
57 | */
58 | public String deCrytoforbehinderServertoClient(String key, String text) throws Exception {
59 | text=text.replace("\n","").replace("\t","").replace("\r","");//干掉换行符
60 | System.out.println("密文长度:"+text.length());
61 | System.out.println(text);
62 | // byte[] xx = HexUtil.decodeHex(text); //这里是将16进制字符串转换成字节数组 记得加hutool依赖 哈哈
63 | byte[] xx = hexStringTobytes(text);
64 | System.out.println("THE length OF xx"+xx.length);
65 | Cipher c = Cipher.getInstance("AES");
66 | c.init(2, new SecretKeySpec(key.getBytes(), "AES"));
67 | byte[] classdata = c.doFinal(xx);
68 | String data = new String(classdata);
69 | System.out.println("还原出来的json数据为:" + data);
70 | Pattern pattern = Pattern.compile("\"(.*?)\"");
71 | Matcher matcher = pattern.matcher(data);
72 | System.out.println("解码后的内容如下:");
73 | StringBuilder stringBuilder = new StringBuilder("");
74 | int i = 0;
75 | while (matcher.find()) {
76 | if (i == 0) {
77 | stringBuilder.append(matcher.group().substring(1, matcher.group().length() - 1));
78 | i = 1;
79 | } else {
80 | String s = new String(Base64.getDecoder().decode(matcher.group().substring(1, matcher.group().length() - 1)));
81 | stringBuilder.append(":" + s + "\n");
82 | i = 0;
83 | }
84 | }
85 | System.out.println(stringBuilder);
86 | return stringBuilder.toString();
87 | }
88 |
89 | /**
90 | Godzilla客户端请求流量解密(发起执行命令的流量)
91 | 客户端的请求流量有两种:
92 | 1、首次请求的时候加载Class文件内容 (这玩意直接urldecode base64decode 然后aes解密就行)
93 | 2、后续发起执行命令,里面主要包含命令执行的参数和需要调用的Class里面的函数 (这段流量 先urldecode base64decode 然后aes解密 最后Gzip解压)
94 | 输入:待解密内容,密钥
95 | 输出:请求命令执行的流量或者是eval.class文件
96 | */
97 | public String deCryptoforGodzillaClienttoServer(String ubdata, String key) throws Exception {
98 | String base64data = URLDecoder.decode(ubdata);
99 | base64data = base64data.replaceAll(" ", "+").replace("\n", "").replace("\r", "");
100 | System.out.println("此内容为客户端发起请求流量,干掉混淆处理完url中+自动转换以及换行问题之后:" + base64data);
101 | byte[] data = Base64.getDecoder().decode(base64data);
102 |
103 | Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
104 | Key speckey = new SecretKeySpec(key.getBytes(), "AES");
105 | cipher.init(Cipher.DECRYPT_MODE, speckey);
106 | byte[] result = cipher.doFinal(data);
107 | String resultString="";
108 | try {
109 | resultString = unSerialize(uncompress(result));
110 | // System.out.println("非首次解密后内容为:" + resultString);
111 |
112 | } catch (ZipException exs) { //首次加载 需要还原class文件
113 | System.out.println("改流量为首次连接发起的连接加载Class文件");
114 | FileOutputStream fos = new FileOutputStream("eval.class");
115 | fos.write(result);
116 | resultString = "哥斯拉首次加载客户端请求流量,恶意payload class字节码文件已还原至根目录下 eval.class中";
117 | }
118 | return resultString;
119 | }
120 |
121 | /**
122 | Godzilla服务端响应流量解密(命令执行响应体流量)
123 | 哥斯拉中服务端响应流量的解密方式:url解码 ——> 干掉头尾的混淆流量 ——> base64解码 ——> aes解码 ——> Gzip解压缩
124 | 输入:待解密流量,密钥,密码
125 | 输入: 命令执行响应流量明文
126 | */
127 | public String deCryptoforGodzillaServertoclient(String text, String key, String pass) throws Exception {
128 | String mymd5 = md5(pass + key);
129 | String base64data = URLDecoder.decode(text);
130 | //判断是否为响应内容
131 | String base64data016 = base64data.substring(0, 16).toLowerCase();
132 | if (base64data016.equals(mymd5.substring(0, 16).toLowerCase())) {
133 | base64data = base64data.substring(16, base64data.length() - 16);
134 | System.out.println("此内容为响应流量,干掉混淆之后:" + base64data);
135 | }
136 | else {return "请输入正确的密码和密钥参数";}
137 | base64data = base64data.replaceAll(" ", "+").replace("\n", "").replace("\r", "");
138 | System.out.println("此内容为响应流量,干掉混淆处理完url中+自动转换以及换行问题之后:" + base64data);
139 | byte[] data = Base64.getDecoder().decode(base64data);
140 |
141 | Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
142 | Key speckey = new SecretKeySpec(key.getBytes(), "AES");
143 | cipher.init(Cipher.DECRYPT_MODE, speckey);
144 | byte[] result = cipher.doFinal(data);
145 | System.out.println("AES解密后流量:"+new String(result));
146 | String resultString = new String(uncompress(result));
147 | return "响应流量解密之后:"+resultString;
148 | }
149 |
150 | /**
151 | * 计算md5前16位的大写
152 | * @param s
153 | * @return
154 | */
155 | public String md5(String s) {
156 | String ret = null;
157 |
158 | try {
159 | MessageDigest m = MessageDigest.getInstance("MD5");
160 | m.update(s.getBytes(), 0, s.length());
161 | ret = (new BigInteger(1, m.digest())).toString(16).toUpperCase();
162 | } catch (Exception var3) {
163 | }
164 | return ret;
165 | }
166 |
167 | /**
168 | Gzip解压 用于哥斯拉请求流量解密
169 | */
170 | public byte[] uncompress(byte[] bytes) throws ZipException, IOException {
171 | if (bytes == null || bytes.length == 0) {
172 | return null;
173 | }
174 | ByteArrayOutputStream out = new ByteArrayOutputStream();
175 | ByteArrayInputStream in = new ByteArrayInputStream(bytes);
176 | GZIPInputStream ungzip = new GZIPInputStream(in);
177 | byte[] buffer = new byte[256];
178 | int n;
179 | while ((n = ungzip.read(buffer)) >= 0) {
180 | out.write(buffer, 0, n);
181 | }
182 | return out.toByteArray();
183 | }
184 | /**
185 | Godzilla客户端请求流量反格式化
186 | 输入:Gzip解压之后的原始流量
187 | 输出:哥斯拉构造的明文命令流量
188 | */
189 | public String unSerialize(byte[] parameterByte) {
190 | StringBuilder result =new StringBuilder("");
191 | ByteArrayInputStream tStream = new ByteArrayInputStream(parameterByte);
192 | ByteArrayOutputStream tp = new ByteArrayOutputStream();
193 | String key = null;
194 | byte[] lenB = new byte[4];
195 | // Object var6 = null;
196 |
197 | try {
198 | ByteArrayInputStream inputStream = tStream;
199 |
200 | while(true) {
201 | while(true) {
202 | byte t = (byte)inputStream.read();
203 | if (t == -1) {
204 | tp.close();
205 | tStream.close();
206 | inputStream.close();
207 | return result.toString();
208 | }
209 |
210 | if (t == 2) {
211 | key = tp.toString();
212 | inputStream.read(lenB);//读后面四个字节
213 | int len = (lenB[0] & 255) | ((lenB[1] & 255) << 8) | ((lenB[2] & 255) << 16) | ((lenB[3] & 255) << 24);//读取“2”后面四个字节里面的内容,获取data的长度
214 | byte[] data = new byte[len];
215 | int readOneLen = 0;
216 |
217 | while((readOneLen += inputStream.read(data, readOneLen, data.length - readOneLen)) < data.length) {
218 | }
219 |
220 | //data存在包含class文件的情况 如:加载内存马,此时还原data中的class文件
221 | String henxStrings = bytesTohexString(data);
222 | // System.out.println("class字节码文件的16进制信息:"+henxStrings);
223 | if(henxStrings.startsWith("cafe"))
224 | {
225 | FileOutputStream fos = new FileOutputStream(key+"Eval.class");
226 | //字节数组data转换成16进制然后正则匹配cafe 来获取class的字节码
227 | fos.write(data);
228 | System.out.println("检查到非首次请求流量里面有class文件信息,已还原"+key+"Eval.class文件");
229 | fos.flush();
230 | fos.close();
231 | result.append(key+"="+"还原文件根目录下:"+key+"Eval.class"+"\n");
232 | tp.reset();
233 | }
234 | else {
235 | result.append(key+"="+new String(data)+"\n");
236 | tp.reset();
237 | }
238 |
239 | } else {
240 | tp.write(t);
241 | }
242 | }
243 | }
244 | } catch (Exception var11) {
245 | var11.printStackTrace();
246 | return "格式错误";
247 | }
248 | }
249 |
250 | /**
251 | * 16进制string转字节数组
252 | * @param hexString
253 | * @throws Exception
254 | * @return out
255 | */
256 | public byte[] hexStringTobytes(String hexString){
257 | char[] data= hexString.toCharArray();
258 | int len = data.length;
259 |
260 | if ((len & 0x01) != 0) {
261 | throw new RuntimeException("Odd number of characters.");
262 | }
263 |
264 | byte[] out = new byte[len >> 1];
265 |
266 | // two characters form the hex value.
267 | for (int i = 0, j = 0; j < len; i++) {
268 | int f = toDigit(data[j], j) << 4;
269 | j++;
270 | f = f | toDigit(data[j], j);
271 | j++;
272 | out[i] = (byte) (f & 0xFF);
273 | }
274 |
275 | return out;
276 |
277 | }
278 | /**
279 | * 字节数组转16进制string
280 | * @param data
281 | * @throws Exception
282 | * @return hexString
283 | */
284 | public String bytesTohexString(byte[] data ){
285 | StringBuilder r = new StringBuilder(data.length * 2);
286 | for (byte b : data) {
287 | r.append(hexCode[(b >> 4) & 0xF]);
288 | r.append(hexCode[(b & 0xF)]);
289 | }
290 | return r.toString();
291 | }
292 |
293 | /**
294 | * 将十六进制字符转换成一个整数
295 | *
296 | * @param ch
297 | * 十六进制char
298 | * @param index
299 | * 十六进制字符在字符数组中的位置
300 | * @return 一个整数
301 | * @throws RuntimeException
302 | * 当ch不是一个合法的十六进制字符时,抛出运行时异常
303 | */
304 | public int toDigit(char ch, int index) {
305 | int digit = Character.digit(ch, 16);
306 | if (digit == -1) {
307 | throw new RuntimeException("Illegal hexadecimal character " + ch
308 | + " at index " + index);
309 | }
310 | return digit;
311 | }
312 |
313 |
314 | public static void main(String[] args) throws Exception {
315 | XxxxUtils utils = new XxxxUtils();
316 |
317 | // String key = "8104d0a89bac46b8";
318 | // String text = "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";
319 | // utils.deCrytoforbehinderClienttoServer(key,text);
320 |
321 |
322 | // String key2 = "8f1d5237e9b39fc0";
323 | // String text3 = "e8de8ab09732a8901cd4db1dca9e169b3c57005dd9a117ef18b8c758648fb9acfb873a4f05c5df779d2d328f31ad3888d022e981831743d157c9dc0212f6e2d137ddf5d145fff337732fdea0b367c66ff44faefa3cb8bac07eae6e86cd750cff762393510eacbea1a6a13dcb549a7b9eafd9c023975ead35de91cdd93c8289f75f8ac294b5ed582dbe64a238398554484c8073970dd8eef55a18bd99cafc9cf8d24f17ff1f240d494089364cb968b94140261db6ae4197ef7d6446cd308e73c5d52ae5cdb8d5b4af10a71750056942e6988129d2433c9b2a3af56d1e10889239f70fc43a1ee33a49e6317a342e1f853de61b664725e67c720a3efb09b1b81b00c6901134215c2c9e60556f4d5d91286fad3808e38a28346caf4d33a7d5ac9bb19fd4e18656000b4f13fa9e053e6f27c74b14a71bad2e7893691f832167942100f117d61522494f935e487526351c86385f8ac294b5ed582dbe64a238398554485f8ac294b5ed582dbe64a238398554481afdcf0f432c2ac1b7cfe304d6459b3d6681ac007ab14b5e97ac1f9628623b63c2eaa165c8ee3fef2a309b8b829ff7d9d08a4069713b26bbec10b05d4e61b16317a55ffa9ecd540d0632a141e5f896bd261694dffb38fc94a197fe49d35aea9a5542c1aa43565181fce7ee6f083256671d71453443b6a2fa523e27567bec3ca1a40c3b28fccbbb416bf549bd806fbc203741ff4ae748eaa50cfca52becd3386b1ef3f7c29988c2b9e260892c4aa1b5cdff35f12fb33caa050cf7106ee68eeed81e9e1c7bfd8940a54c5892c8a39488948a32fdf287578a748f722ef68f5d58f0a8da44838a20ae9348f11a97acf72309fa9d8cbfcb15549bc57ff6bdf90f76908f44d28254ffa128aec43f893aa932b896db15b050418b3e0de02f8f7f52d921ef4d466d68ddec16dc70beb42694b202fcc4176a609e231bce090e12746f362e53a06918bb04d5de3eced6191efaf0fd69b06f50fcced3ec9c187d6e8bfcc2c04fc4e92453825137c6ad30d4a27daa3daf8b633598c3100d1ce59a8ba3a0e73114210f37cbbf75caee129daaab058e5d5f8ac294b5ed582dbe64a23839855448c0332ba596b74b399dbf95859bf20b372cbd4a51b8e42837a0e66cd986f0c7cbdf7a81121cd7d65a065a59f1a3b6d35fc29bfa01deb2f781508ed20ff5dd4e1a7b6d6eb6cd403027601482d01de5d3b04c8073970dd8eef55a18bd99cafc9cf891393dd61ec970a0b24c8446d3d43fc5281b10e057bbad4c437dd8ca22d354a6345aa3f81e7514d3c091f75df796a046cbb362f8ec8d0f42842b0bbb5f8ba8da5a5d652967a43643bfdc46a60e5bba0e22950ecab27052bc3c3029cec8d33d47315f578bb0dec8f7952311a59125b7cf1e9e1c7bfd8940a54c5892c8a3948894c797170ded89be206e78398a351aadae3b14862723616cc082b545c0f77de0257ffeff4599dc4dc21dc68ed7521135bd1e9e1c7bfd8940a54c5892c8a3948894107678a36d1681ce327a20ae13fed7358228717feb530101130213519a1423eb044726324de2ef370ff47b919c1abc2d505062f986d0516ac35c246d7909c1441e9e1c7bfd8940a54c5892c8a3948894ef4d466d68ddec16dc70beb42694b2024b5f09cc1a4b7b5cd1c366b4ed618e19b98df4a9ecbada485ad4ea0615eb38a1e2a08ee7bcc57cebe9987459d12bb5225f8ac294b5ed582dbe64a23839855448e7eaf21cec5e5c9c597ed86cbcf9a9577b69fc1197546d7560192584c4933e013686abb6ad647008744c0f356f7ba710669877468a7d8f187024c57dbe3e5ee61e9e1c7bfd8940a54c5892c8a39488942d3e9bf00d1a89aeb46035d6aebc43d2671dcc38d60b0def48d1ae0109996972fcb3c89e1307ef49c2fd1c0ee06976b8c66b95fbb562e6bf6df77e9884e53c3fb1dd05985fb029c5cd52f05d5c132a96d52ae5cdb8d5b4af10a71750056942e6988129d2433c9b2a3af56d1e10889239f70fc43a1ee33a49e6317a342e1f853dd80cb68397a9fa3d24731771b3fcfc195d2cbdb3a333c8bd2e8c5dbba5d6939830f9dd32de9b173fe6364c6c38646ea6c93c112363ff27c8003d2bb3f2806eb11067889f9e62010e9d16fcaaf4c6af2fe78ce6a7288928cdab1be088467c70106ce9872f05302de82efd7f3992c158b5cf6e0d3145a98eb4194c49361d31e43cb31ac7037acd5482a945f2e4ff9a950e1e9e1c7bfd8940a54c5892c8a3948894a7e9560e80d8b57b1cd0af3ee8365d564e4eca5ef0a77c98b19a53e8d8db19b1810fa5c0669fce2416be0f96874c550e5f8ac294b5ed582dbe64a238398554484c8073970dd8eef55a18bd99cafc9cf8b4c352749dd596bb076df58b47aa650303e6efa0f5ba25dda7af01b41205dc3aafb3636521d8c84390a5ec66da1cd2891e9e1c7bfd8940a54c5892c8a39488944caf84cfc6e032a4bcaca9bc5df2ff35542d1961a7a264aab3803f2682583eac43c8fde62cce9933c99d86ae5d7c356d8d3fcabc420d9e62ffb69a61176a4edc8b6bea5ed5740447be47ce25b46166905b9d749b951b606bb51c08f1bdfe473b4fb3d43691bfcd7e96d07c454aea1438b3c2e7ca647ae990bccb386fb77a8484e58fa5cf0536f3100564293c2389aa5c9f65dbe3f97e83244168b068a1d74391d8231f5ecb64eabc7cd7d84363fba4895f8ac294b5ed582dbe64a23839855448b65707e3cb6452024972a5e01ee1a26adb3faeba53a830fee5a9556f0a69434bac1ea5290d05174244582aee3d57f4eacbcb16ee34d7d4e692c9ea068f4a5e975f8ac294b5ed582dbe64a238398554484c8073970dd8eef55a18bd99cafc9cf8419424df1f5efba0ec81d5f24daf0cde22c32a0cbc73db5f39cd101412b23dad3c3e790094c66ff4468ae047c8a9236f1e9e1c7bfd8940a54c5892c8a39488941dd525f262c5825982d5a14997df1e5843db692e39e6f9bfe66583e3aceeddf04536a032cb7329638b78f40185d8e1f937b6cc5e78281256373489276ac8f3f05f8ac294b5ed582dbe64a238398554480ecdb3e3e15cd1fa616e99246cff867884a326c9b60a5871b10f8d9777d7ece8671dcc38d60b0def48d1ae010999697291038d99448aaae131252208b61caa9aaf912a508044bed3b3f71f6f4027efaabde832150b75a40dc4a2354993a68a6b1e9e1c7bfd8940a54c5892c8a3948894ef4d466d68ddec16dc70beb42694b202878bac1599a8d09982e8a68bc5c7e387f5be8751188969e7f27aeb479dd7a1a58b6bea5ed5740447be47ce25b46166905b9d749b951b606bb51c08f1bdfe473b4fb3d43691bfcd7e96d07c454aea14382f39b78d0800c398485d1b5358f7af841232614c0e0fd17404ad7ed809f4bfe13df34efae1f21e6cf0585e11654cf29e601d394c32d32bb5018421d4a4ed7ff89a72782a2157d71d24491f6ee01d82bc1e9e1c7bfd8940a54c5892c8a39488941e9e1c7bfd8940a54c5892c8a39488947bb287697e2cceb7ab0aed17173161c6b31cd51452054ba4cccf3a2bfd77464d14c930b5686499e1051158a74ef6ad92b33d8832dfc82edb4e476569791350f45324da245e4bb796b3ba485d348b8bd548991587396d91637937657aff151dc3637ac416d5d56198dfc8786c6a09451f";
324 | // String text2 = "e8de8ab09732a8901cd4db1dca9e169b3c57005dd9a117ef18b8c758648fb9ac841e229ea8a5bc860e41e76b9fa097b09965b76f32947cb18cef884beae6628f";
325 | // String text2 = "3be870312a2d03125512a860a511344e19e88405e26a3c7094ad291853c5ea928dd3b0f2fe875806aba9e53f23cd4cfd6fbd067dcf4ce7ea2a8e8e04e2ea0ed6beea829fe27c4acc1488f8c3a7852e7137c555d0513a529e093987813d333f3c19fd1496374a063df2e2cc5440b6c8730d1a6f9870a4feb7cc497cd80ef605e60cd8b9de391a5bf89b833d497a9ab34a7bb6b56615189b96692d26f75fe4a8a159e61f7ea916cb37318a75c278e5f55aa1c3f73e54ddcc91252662f43f953ab8ae394821ece751e818b7c000cf517625429df297809bb3be8c48900b5178fd9e0954734f90c76a62d1c75eb631dd234aa9b325eb4e461b35c1f9f9c6c9526dace6fcb6e8f45f10042416fc325d5c33e86501dd6cc2f4139adb179955c57a58d31eb4036ad33908be2ab409ebe1bb9ef7fefc8b3314bdf18f5317d572aa28a4ac97514b0c9514a16ef04b1e580d7608dd6e9b2ba83ee0b062849a0708b3128f6136742aca9d0d2aa14115102375254a410f8bbcab82c0f5f00a9a7028afb303a7f3eaaaa0b9e42bf659daddc4a9cdd03a98036302fe0f2c15b52ba79deb8e10a6438bd1ef1ed2c0b598e03dc60d6884a77e0d2dd738b65fde9382be0d251218ca563b12c7721f4527b7f89ec0b60e2764eacefaf4ee7ee3006f1a453ce49148fe49f50e61e3362a649709eb229ffc2fd90a69c999cea2be8eeb39cd29a0095e82eac0e2e44d083dae867551d156179fa3509012da1b1c3e08bf532a03254bdb818c2617ccf1251613e64227c485d901ca37743e7682455dfe598d70b8c2e0df5f093b3f08522976ce2e84a4e3421f558dd82090215fb26a36294a5eff77d00c2a4d0a5dc59df52fe71985a04600337cdf7470cd1c774031a48ac41feb9a96c923d4fa310ca1ab94637985de22efcdefaf0d944decd44be66faaddff4118c50b7260e8394a5197f7313ff72a46bcfafd00adf76480a86b7cc34a49ac06b4ed6c58ea4077f69fe28e6ce85fd7f9d83808df3d0301fe9df655f5966c74b382b95ce14dd602c7b2a932f1a98f62d0a29f6b8446e513b6ae81359df206bcf91694875ecb33c81df15da5136646594f78c917fc890be15df67290ce48883adce47a248442f4a7f37bb5f1551f133e2a42cffd94eb441d38f573f2132f4e43aab0ab25e8a321d39cc9e577c1d2967db078d6acb584871f023cd0507f72b45b73686dc9a16d0973bb0f57c00d4ddfd771356002775a80030f443b3a40bf81b6156584448ea8c714511794a8f03c3b7c795c491d5ae80ee22289ce79ac945cddb976de914dc293084922c2981fc4373625f6b93f7b61f637ac66887574b6c4787b1794f1e9c6a535f500247a17630872b12616481a2374f719be6cd833464d24a589c2f8b73b434b59892b4324ba7d62da815338052350b49af7ef9aab178d7f9090b3493d42bfcb19d4f7cacab5be1e22f440ce22caba87859d71a937a762418b1698565599235a94499f57cfd8be331d1f92edbed38a05215ee9f28bbfb885be68cf34dbc0c740a2f208d8020081c7250869e15cc4d17019125f332c66f752c26b8b13a7bc64901aaac0bec4950ebb2a63b8f5cbdba5a6a466b44c244581842dd6445f1b36742aca9d0d2aa14115102375254a411f9567c966a1a40fbeb06e9d058ecaa7faa80eec5b5f0c1601716c14eb1d07048fc84b3fb1690b4d54e74092170e859dada54fc0";
326 | // System.out.println("第一个:");
327 | // utils.deCrytoforbehinderServertoClient(key2,text2);
328 | // System.out.println("第二个");
329 | // utils.deCrytoforbehinderServertoClient(key2,text3);
330 | // Base64.getEncoder().encodeToString()
331 |
332 | // String key = "e45e329feb5d925b";
333 | // String text = "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";
334 | // System.out.println(utils.deCrytoforbehinderClienttoServer(key,text));
335 | // String text2 = "92VjUoUPf%2BhIfd2hi3P9Y3AjNlsR%2FuSe%2FSXSHRSBhXfFBh%2F2Yqatfa3tmfh%2FqsQ0LcioCJLjHPiObTPdxS%2BPf6crf20lSvAS9obTHZ%2ByAt8BZV5%2BVgJ%2FNTLW4cVLVGiiNPSgkuO8JSbjcSOkn3TUPE8Bup8JorTqQYPhXFD9sOB%2B9Dp2MnnGMVvCx%2Bcw9c17SfBZNrW5XLtKACPAw6Qx3NIjlxYoVlkSsvVian%2BWX7HpkYuw%2BeH6Q8uzxj6Slm8T";
336 | // utils.deCrytoforbehinderServertoClient(key,text2);
337 | // org.apache.catalina.Context
338 |
339 | // String pass = "ga0weI";
340 | // String key = "e10adc3949ba59ab";
341 | // key.getClass();
342 | //// ApplicationContext applicationContext
343 | //// String text = "B342ABD9ED1C3C6BAFAVtIAeemt2NS+KDLcD5EnwyPEd58McF/s2FXquKTk=1B8E52787426CE7C";
344 | //// System.out.println(utils.deCryptoforGodzillaServertoclient(text, key, pass));
345 | //
346 | // String text2 = "x1T9lkKUqbbtz6nKQpfVXlDZzCLkVLyMYz8%2FbXOtj%2B9cFAaSuCwcyMdut5ZgrBTqCfZfux67%2BYmIMi8OEpsAvxLAKio76c%2FA9k1KzGOvg%2B4VEZP%2FRjOvct0AWoPKDJEv7L0ddpcD4XkH6tVcCGUf0rfurDhHZ4DXv8wuARFeC6jeUYAbGIUN4Hd49QUNschg";
347 | // System.out.println(utils.deCryptoforGodzillaClienttoServer(text2, key));
348 |
349 |
350 | // String a ="yv66vgAAADQAUQoAEQAvBwAwCgACAC8KADEAMgoAMQAzBwA0BwA1CgA2ADcKAAcAOAoABgA5CgAGADoKAAIAOwgAPAoAAgA9CQAQAD4HAD8HAEABAAJhcwEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABjxpbml0PgEAFShMamF2YS9sYW5nL1N0cmluZzspVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAcTE15Y2xhc3Nsb2FkZXIvRXZhbGZvcmJ5dGVzOwEAA2NtZAEADXN0cmluZ0J1aWxkZXIBABlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQAHcHJvY2VzcwEAE0xqYXZhL2xhbmcvUHJvY2VzczsBAAJicgEAGExqYXZhL2lvL0J1ZmZlcmVkUmVhZGVyOwEAAWEBAA1TdGFja01hcFRhYmxlBwA/BwBBBwAwBwBCBwA0AQAKRXhjZXB0aW9ucwcAQwEACHRvU3RyaW5nAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQARRXZhbGZvcmJ5dGVzLmphdmEMABQARAEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyBwBFDABGAEcMAEgASQEAFmphdmEvaW8vQnVmZmVyZWRSZWFkZXIBABlqYXZhL2lvL0lucHV0U3RyZWFtUmVhZGVyBwBCDABKAEsMABQATAwAFABNDABOACwMAE8AUAEAAQoMACsALAwAEgATAQAaTXljbGFzc2xvYWRlci9FdmFsZm9yYnl0ZXMBABBqYXZhL2xhbmcvT2JqZWN0AQAQamF2YS9sYW5nL1N0cmluZwEAEWphdmEvbGFuZy9Qcm9jZXNzAQATamF2YS9sYW5nL0V4Y2VwdGlvbgEAAygpVgEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwEABGV4ZWMBACcoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvUHJvY2VzczsBAA5nZXRJbnB1dFN0cmVhbQEAFygpTGphdmEvaW8vSW5wdXRTdHJlYW07AQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWAQATKExqYXZhL2lvL1JlYWRlcjspVgEACHJlYWRMaW5lAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7ACEAEAARAAAAAQABABIAEwAAAAIAAQAUABUAAgAWAAAA5wAFAAYAAABLKrcAAbsAAlm3AANNuAAEK7YABU67AAZZuwAHWS22AAi3AAm3AAo6BBkEtgALWToFxgASLBkFtgAMEg22AAxXp//pKiy2AA61AA+xAAAAAwAXAAAAIgAIAAAACgAEAAsADAAMABQADQAoAA8AMwAQAEIAEgBKABUAGAAAAD4ABgAAAEsAGQAaAAAAAABLABsAEwABAAwAPwAcAB0AAgAUADcAHgAfAAMAKAAjACAAIQAEADAAGwAiABMABQAjAAAAHgAC/wAoAAUHACQHACUHACYHACcHACgAAPwAGQcAJQApAAAABAABACoAAQArACwAAQAWAAAALwABAAEAAAAFKrQAD7AAAAACABcAAAAGAAEAAAAZABgAAAAMAAEAAAAFABkAGgAAAAEALQAAAAIALg==";
351 | // utils.getBase64edClass(a);
352 |
353 | // String xx = "1f4e";
354 | //
355 | // byte[] a = utils.hexStringTobytes(xx);
356 | // for (byte x :a){
357 | // System.out.println(x);
358 | // }
359 | //// System.out.println(bytesTohexString(a));
360 | // System.out.println(utils.bytesTohexString(a));
361 | //754de50087a99a87213a78ea7dc9a870d8a378ec64ce5caf19777c01f2c02f570ee571f5bc309ad7b7440fccd6db3434c6fc15fd343cb74e3ff1c6d010cf873498032409742c59e70ea35a94cd81785a53b826382b455bf99c491ba31a63b5be304d36dcd85f20cbe36270a5355325d70605c11d89e3d5f0a261db3ca71c780f5dc6f297d8d059a5bb6382b8063941340147ddcfbf1ed9403e48574cb45f6b69d8e7664f114427699b16f9a25187ac6b825d9d340bb450853d28ade49ae18f8291c31f3a31909fc51d45c6231a6641071f7a091c09918fad18e32deb8e2494db6322031e70e12a3d033da8f16e32b511bc75891054f9ab31c822ff097fa4fee4b4e50ea4c8a8758cadc914c7b44267cbc7335857d02b0886d8c4aa890ec2b8802d398331bb3e28b0e17451b3e9b9afe7afd9f922f560c03a82c76a9dd927d1e946e13fc1a48e3714e16e3c3d2ed6dea937d40bfa374f0f9d339a6c0c8e0dbd6591918441469690329437bc986c6c296979d386ba03aa62a4dcacf0999442eee19db76ddfe1ee6ee40b87b238c4520107ab616944a3cc9bd25469523c1140861c34969d2b36e5a2a8a4187cb96babe726ac8baf510737027f838cac077b57573caf1a2ba5945d83937df827651b96b317a6c50735f05a7a2ce8cc133dae0ea355344b22f49d8bb29ad47765e483e6a63f7eba8df76a6a6b11a6c7177c6739fec1f5e2675bbabb4193ebffad6d58e68ababcfa57d434c19769836ff1efd6ded4a17ed4a4facfdffa04c74725ebf949621fe1540d390f7cac4ee82115e48c568bde08f25413cf5f023a20d44e0259509d6ece963e4e2fce8206fa4f9fca4413a918f8deadb4773a5b3207eb2b6277f760f53698189f671e354888bed70bc8135844c11bee1d997e0214fc07e5e35d6272e539fc20077e8e1dda38dff5574173a52299c6f98def8c75f5f2a2f7dba92684bfcaa2361c92c234088bd6f1e5876f3b642df5b56d28b92f70ded7cbb83c7c60ed925e9f5892505e046fb17c91a8785d6957a3061789babaa63436f7672833f1dab90bc577632f68b14cf85d1021a194f55d7246cc2cf0ff3728d7c03da3bd413093bb6d756cafc812b1e382c1616823c20ff504fb826322f89015fc34a3c4512c326a11bcd034e3e58c4b4e118a9a4a80fa85e216c9d6563146e229469035a1db1f85cd7899294c4059238b1c5b25a1e7d1b2df85644a85927458934c99af9300e6e7e6920da611240527093503b4b13fc044dbd1bcff81ec54e5b5241c4fbe4b9ba9ce6d10d4726c700572175a53e3aad1682161bf4ab260eaf615fdcd01e9e7876a713de50ef7877d2863e6c24fa4eefdd76d4aea7386f2a18cf7174f1cba7744637aee8b19340b3cce151151c5ca3c775ac7ca6b9c378653a7596ae5dbf329cef0506070af0145bb819ed082c43b0fc7ac41d9a3eae5ef4bceec4ba3747f32f3818a2b3dcc9da7b8586f260106b0535e6e01da9137f151ad41c4fbf5c75739360696fe6de8c34a8ea38abbda296f200a1e7ab0f06e87a12bc94ed13c40739b9efb6155fed7312c667e931eff79a5a7d472752dcee071b71a245a8990082f94cfdf6de17540afb36290168a8d13df1e91918441469690329437bc986c6c296901d7fa7a09fc50914162e090fc349e99337062a1b75a53f0c755cfde3cb3ae912c634dadedc141bfa8043b68bde3abc9b323c3120128255c25d42bb32f9aa779146f06e62517122bb917b23a9cea2574bf1175edee0cf7d18a5a2b90ba0f23ee3fc7eea9271076d8bed5f68bfd6a8c5724b8dff6b27174efa19bae5fef7de16ff0e660757ce0a775d250747786a049e13765e52f248cc88d5528cd11e9fb135ae8cebabd3e6adc48d3613dc4e294795d61628c604ceeef64b1b45173b370ede519e464af59a03a85dae4da6d31d43252e9e7f2c005dd092978f36d016447879a4e85fd4ce795231d7eab4a1ad65195875ce9bb1d4013cdaccca079255271df1c051e0d052906f6e6b938ff3751d6b04753d1be05457b72ab90adfc5bef8bb966e9ba867621c71661dc449ddd48c469563acf3e78044c8e4bb62e9cedb33046de8e0800684c9566d15d60101401a0a799cc1d84caab9e881c9e7814500bcecff3a67efcb908fc0118effb7caefc1b60304b2b4631a2782deaa3482c387a12e3f2e54782c65d93b66cb679e1e46a6fc967785f63bb40244a0402e603258271e2db4eac09bc28eb82f08f347ea218633357bc070a8a00e0ce55d6e52b4b28e90efb1ef1e7646ead0a409f004f261ee42d8f0062e4c11f1326ac5382d9fd6fdbd4dc70d64d464333be3f5c791dbfc8247b3516e696e19998f69a00d9cb15bdfa448bb61d39dedf101d7324b5a2d6cf251a35c2e55c592b4acbaa7cf5ae76defc37ea4475f1bc32aaaf0c9de7fca37be8d771deafae8b1930f9544289fb38de9d8eee84a7b0904bf71652e93cca960734c845b866846a2549634e449f927dedb3075de0441e919463a5e52ab816bdb990169f10b73b4b4fbaf2c91f2623e724a923eb603ccc5c67cceb519430f84074ade8a6f652d73247fb975308b608dba5c39c39e4988e496c6c9a488f9db3f3f88f4f7a24469c230f018eebb42560dec4f2889220486eab06c39d6e307e76dc3495c285f550c6a5c34810c3865d84ea3208749a685827d814c196dd442d4b8d6acdf532ab6993f3a536fe03dd0c2c6f6de605d7767d270b3839f371907f7e61c7e9af4d845d3961ac199fb1d9df8a6ecc5787f686d85f30aac0277d0abba089c43b6df9c442f15d61eed643b775489a07f1865225dc86a44082ff4dafe061be3e9685cb88a83ca372619d8ec908d690e058194c40f2c3bdf0c0389db2e2a3b3345cbb8eaf6d5eec03ee9fb764ee67ba5df98fda3664ba4225af3b2b13c4110351cf98f933e7a88cdae4ef2d28fb86889461b04c878141942dda9f19e83180b1cd91003242975c764dcf2ea0bdb06ad5eaf066901fd3d476afa1e516e3b2be12742072abbf841fd394403e160b9d77700aa60d489e33ab3fb3a55ab1e24061d2244c3186008af0532d7061f871966704845e770f1608b56ef408aad02a6dcb1c9d84ad1ff0e6f17a547b8e3acf67a82e18004d8ebb12a6213867d559b765d108a11e94b60c7826e15d726acc480298b6c4732527304ae64fa224ebd74fef21b8a4199af49607438065291578049889a670ee3802cf22fdf2e8b475795e8884d03d4a51ff275850b1eb0725788cb5eef58fb3bc152fb150a664a57a8f2d3d358b9dbe1f92b28fd46a9efe63079f6f9aa0a6bf0694bfbf1c8f0397347771b5148ee2ffd30479997fc55b872c5aed387258d07c5e5b025f2af41abf82debefb33e9b8d18767469b9ba4972fd9f6da2e2d0fbc88c00316fbfd43347eceb3ffde3cc25546868da37057c3c7270858e9cf6b7bce43c28e9b2832d4cc29a6f9272d4fc9e22afe1066083f4c784b5641046252665c9854edb981825b5ca1022f73a88a461ab0507565f89137e896a218d48852e885ea46ad7d425134f42c13c745ccf751e20d91e6bec5dbae5f3aeffd6e276aee40c886c2b706742eae48b1e85a21486d51faaa4ae6431ef9bc6f320eaf98737695a6be423869f066b0a9277972bc12eff52e8543876a713de50ef7877d2863e6c24fa4ee243b2a08cc379a3250ddc94067ead590c84ae3e1623a39d5da5e45fb452a92097fcc366d4c08ce75a280b089c507a5a4619b491f82c1fac1d7e0c44eb08b656d8fa7c04d876ba5a52ce5057797e6b05e052c6b8352448fb7330413e970abef8fa099bf0420bcfac3c0cc4be283be0932b8f7efa20845ccd7c08b56c888effdc9931dc185aa7d3ca2bf8de9fbde0b169624df59a1595348e48dcaf3f3d42eb070f224dfa3b579534a351bc0b96ebbb36954c53af9718ff865662ace9ab010f5a2dbfc6e1be589f3f76f021fde1eb5fa36329e4ba85f25671d5e047a80bd106cdcc60a7adfaad203f443a73337cb6a45a943614f67077544844b5e72cd3a5e63ef6bf00987b6b3c084503179ad18dc8ab8e983e2244e7c35f7e85826ced5bd9afef366fd49731af89f3472b63bc5a183c35012ef70d7571290ffebaaea09d1b34849c5a7b3fa8a91597c7a7c0c080456173e2e529c1d023340074ed090134c5f0fc301e9805fc9311c379470fbebd91090f3b9b52ff3f5e5440e499fd9fa0136a2de7d8b3d5afb9bf0643299e6541a0e93719efb6cb3a48ce76333ce2db64bb6234c25578569fca822c1273d915a19dccf26a3a767bfc461c8a52829ccc6193d7c70ca207d285834a54df1bd4a9b7cdd36e09ba89f30a0ea3ae24bd1df2a3cb9c7b9f1f9a58abc20eac13a67cca6bbf2b3780ea019700302aeea577e5c8be43b7e4b4756c52ecd57e373b69e46c71142a74788019b7fa9cd879548dd7303a26267589105bf5d9c25cc6549845d223ed24a4ee90b75203afc113156c0fdae224a06cc3abde86ff1c7a4cfc3c81e9663e5b9db96692893a22205599fb3f1d19acccf9781529d5e6b314f30178c51d82ea3bd703d59824dc97aa90e708a6a4ae57a3bdea22867f58d6dffd8830d2f34050e60d2c48aafc9a8fae65f9f6ce2aeda54b51567237f08727c3d840cd2f1fbd57e1ca49d09b940a8f8ef95ebfbdd4868501b0dbd45bcc2f84e78710aa32ac5b5fcc2648d219a0a250b958b936eed9e178a7c1222fb749d1839c310dee057fa36d1e591918441469690329437bc986c6c296973b289c6e6a856430d8a344283dda03a1de16d9860746921fe64ea8b45e88ea42688f30f4da324cc1df354d201b5cf5fdab8f447daeeaf4813614b5caa9e4d7e6a53762d021c768c0f77feec0b85cb5fa62928035ab31c6bd1818d0e6accd63074e68c26f17abf86b146c978a6b414bdc233b115e2e6ee6df0505b7c96b857b3897a3459d9fae9a2dfd17dd60dff192522fca5d0e3bdf833ba60f262a4aeb0654102a7e476c9b29110af56498f90e572298c010f45bfe9f83cc097d62e5d7eb45ce9bb1d4013cdaccca079255271df1c64fd5330a59b840842869092c3bce741132342880977dc9e4ef7f6b39a6e06de77eecf05c3898783479da23278c07420ddab483bb8935feef78720a39ae11f2408a875fada7153926da46f1600495bfb5c618669cdf4c61f4f2b000a56e6302374333b300f8e81050cec5a511b2af1c5916d3cd13f14241b9d793e8aad682b60e44651efa5cba2129e7f5a371d34cf65ebc59b1917a0d35f469b420bbd5e27e56e3af1698e8a97a4f76b22ca718b9d62957d17599dd43dbbc713c156e36f6a10c4851331f881ff71ade64da8285da4cde097dbe7287a5d2218d6b8e91199bfe711d0b79aab000c6e59b186ea214c8638a5c9be4c470571076c485b028d754c36de10d8f3307d8ebc0224f86543157b090b16ddeec56ab6bc084d09d700c5a6a0e6431ef9bc6f320eaf98737695a6be42981fed10046ec11816449d2efca2cfc0c69c4aae80bd6726c2c1fd80f7b59715311be42e44ee65dcbf304e18d5eaebe1fa733e0f5895d5b4707d24fe051b1e8363cea506b7d58428f2f3334ec7641bb0fb49a7e5b4af24c395a961a31644c8f9b445f401a2c1ec9e1f9ed9bcfeaaafd1e36beaf26e4eeb470d34ff394b62846889dce27f0582a6f5109c01bc9e2fd4dc700cc2dcbd0db18a568c279b9e30549c3f4642ea9af2032b9bd91bb2474e9f8af16d52a8c7578235537d6a8567abe01cdff674e268d270db249fcab8f29a59dac3ff8a9abf222fe1ad162c1e9873c3f0215818a9344f01df2746c967c509bf01afd9f922f560c03a82c76a9dd927d1e946e13fc1a48e3714e16e3c3d2ed6dea9dc6f631fa27a7db808bc3d63202cd1302e422c003cef6ad2ec9c8fd0993a318da623247181cc6fc9d98f322eddb3d8d3189f070ef021e1a48587860fee36b41275a22d2d4b0f0c3c18cb31ac998610c927fb45eb911dc1c330b18a91f320228c264d8254023af4e5c37669141cb3692dc2920d77df6ea1f90f04c56a950b23b16a297d336a238a5b2f816d0299d1dca689557c6b8c3f1ad6ee8cf8d11e9dad8781d86b3ec3624e8b8830c73299747c739c993df867f3e984dd10199af59e63495766ddc7fc0c719665978ef14ab0bda3841d33d2066087beda10086270877065952666fb03d00a9f32db6b9b29ed6c3f9878883328f94c4c3b0fc2df887a1f4c5b53e98b25fa9ee14404865cd3dcfbf4622d22a02c34427bf3b3db3d3691d8e81849de6bb65473dd7f8da8e1e7ae9e984afc4ba60565590ef1cfbb264f43d4abdc8fd04b64b671127364f1bdc5b631933cdf998f495dd190c495a49fb0e139f674cbc77807e12ad6f76e64999ac10260e36beaf26e4eeb470d34ff394b6284686850dda39134e71fa83e38f50c5b8a457eb388a9e6347d806fa22b10aba68b224890a998ec74a4a2781f4c4c7db34347a520d18eb0799b68ca771cd8b857a7ea5145af1ede36b5dee7ee3d096b1f3135a6fb34beb778b46b4c82c5ae75b7f9e55eec537c37bded745b06ca36864a0c1f6d8145a0d8fd1a4b5820ee9e15b89fbb8830eaf0f79be6c998a47fd329d77c4355f85c3e4f93acb227c1a61e99677fe53a22b79bef79830c82a33c65a04cc6b52b27ae37930fa6bbe51b9061e2e0e918827b982247d1f4b45f9f0afef3b4b3bbe450c1265d5b50d1c0abe4f4816c47bfd0c518a1309f48a28241eb4cab63977d61f8187f748c35bec64f61acd04943be7ae4cc9189f6ab2b66b5699d0ef48fa1f7273e433c52de76cfd875ac32cc4d6863a2cb224f29084e9bb974b4fb750bccca0720ce15c0124994cbc0d5edbad53ba229fb9a22783c000c58fefa7f948b2646839adb73646393bf5a1b526c51efb5ffba10f15a4e8ed7edde56cc3be149f6ebc237033274d93d33d21ced980084c2f23ce4dc67f1ff80819b2f697bc011f93f0596957dcd2339c7387c6f86f9638c8249c696f807181b511ac2bd011463d944f9751e20c272a5c1b91f21b32fd2d00cbf1b4fd939e1543373564b71baa2c630aeadcd807762bbefb8a39175b0d43ef40e0cee3d12cc7e660d7fcc35330ef637a12c1019317fd48699be891cc5516baddbc0a599a8b1038bc1ed598e7a7813cb28b78cf084d7c614cfa7b9c9190c4c7e36fc7c0b2ada5b20e8f60894ba8ce7399fd4b91ea1df2edfd08ef394c0292d600ad1d50948354152ddd7b82a1d3f22a9b2c15f0096256134e07f1a64d977617c5b21527feda4e0e3b3b4c86fce78bc9f4003f0b6d06efa0a382d2d4536d8d84b569fe7d83a3bb7a3d0d28fb750ca1f48251a7bfee95d944232e85b41bfd9039b57669bfbd19b1a7f5b34e3dee737dc6081fb85c3fdc86ecc39c88e60ea03e26a82ba75523eca1c88b63fe5126635e9488993e2484667594868ad9a74495553d26f1d1934b50d9da3aa63f65c4d88bc97ba42d9f7730f50aca1facce91ad8830e88ca52c41eab95f9438025c34a33242a3a704aa424066ae6fd54d9436126693d1e61afd1ac97fd6fe720cada3e20a4146ab3e7b798836fc7c2a9b87686b3405443b0fc5453a4ca27f66b7bcecd95ef33095456870b9822e5ea8c7f1b558665164cd36e416be61c4a8fe4acd509ee2f1ab5c242fd9a1045965193e7cea3fdd51f93fea7a855a3a926955270e3eb650769893d2b0f435524036f37b01e67073d2fb0266aff915057a71ca931a755463e20d5e88ba600f2885efce86bba7788ea063d71498595d78037e49766a2a75cd95d1a08e3ead112baca17e495f105773a09233c981ba9f12d12dea3e74d433747055f21129ecae2713a8a5c39d3d9d562851e76b8bbeaef834e0ce34e416b69fb985b591d7057935879c6168b9bc5275523cf1f820f0ab7c9ea648f2012db4229329f66b36bab5ccf7a101f891d5b006c407aaf19310cb9166869a1e07151d7be88fecf05d79afce6e72fbb84aed12f067ae558210320cc17894adb5a8434872f77eecf05c3898783479da23278c07420989db0af0312c09b254acaf7a8c41dc9e353385dca0f131211e7c479d847190804f6c7ed9f57eb0bd5564df5193c101f0a009f12850a60420d9ac1a9a045038aa25590ffbf445050a8a6ea239372224da49d09b940a8f8ef95ebfbdd4868501b882192f096aa19c956eabbe39369ad059fa2a83d96249f8592dc5530872716dd8541c5236a0e3da73cf6839b9c1ee768ba56212ec6f029edad1b6e1c63b77e1583642dd84db67ced6fc9b5fb902a1f03419c130c0205a439f8c9429068584d38701223b3a51486fa1c552702236ff406bc1b1036cf49ee62acc32c16807b601bb93aa85673d8bb306dbd78b2348ad0aa90de736e70b55e7cd122494c01bb3539043f2cf6c69c64b9cb854f601c12e5e04e4ee1d1e5d536bdd78eb7772979dab159a25816a6f2e26dfb06d9bc4a19cfe14e40a8ffd03f06618cea28484067097d81881d03980715d7627f040cdb8134a875d53cf9fed415808f1ea6a362bb1e002d1b1f61887ff9d4fac4ba5fad5bc24856988a28aa051a9098a81e55c39fe475a64d256f7f6c0330c6467f5e6d9fed062c9eb52c67133a586e6c75fd3c0500f21130ace9e05442c2c29682010715be4158583b3da08f024c8b6606fdf97479f4b75215650dab6a318087ad6b37d562a1bda73206115118e5f293fd83011009fe0ec4fdca65e1771d197a2bbfabc73f1cff33a4762c96d68c293abdf68ecbbd5162a7dae65cc4c1c543e697145d0805b89e6366a470a9eb2082f0e1bb77cc4faf948ec44e8d4cc556756d8f2c3da0a677e6500bb81d7df3d8dad6a5ba014433a4309ee0afcfb1c452e98237288959cbbb17af22362ce3ce10d747b5e6cf10df76f8d40a9053ce48c89f0b8b0ef6f18d993881e8bbe9987ab6e3b0754656ac6d99db02cc5b45d5c73c23783f7dd711db0dbe05c1e27ae740722e56af5dd6ed765f3b04d9229fa8ae30b981598cab3a41a9998ca55ddf52b75bd46c39571a16517dc0c64e9218467ac558a718df6dd15a341856aa39a7e8a06c1c124bdc6f3c1a7937e65280da2e7839de6fed59d5d258a89deda6d745739d0aa0c29be3915593dc0896fad0f04a41599c639e11a80b79d23048c2fbcdc09dd3ae2b695b73397a12e3a3e23bc4ece1471e4759af91215125429163bbc06763c352df0a52117dd3f0d635637fcf9931aef79605f505e34ded7b86ff352e277e8e71a92ff3378e1cad3c295c8e70db16681fbc0a60ea0ef181dcc4c93530161de087dc4012fcd8e14cc976d60e7f939ea9bc04f6b43c985d723f39985d8942b83d69b61a6d13b0c45e057422df6b9b2952a9d9c19e5274e424c4a80bbc266d84a3c6e401eb016ad55cda8e871b89b1c03146d76fc5f355da4424e46e3d4fd69aac83e273d569cdc3d3f9202edeeeb8758cc9f7c9c44501fb7d755b546324bdce5c48b5cc69864bdcdb7d4bc7d2c772ba872cb1b68e48643270d02295d222132fcbd73614e74e21b6384606edb20d125f86bf27a6bc078ec14a14d47ff59a28d1293fcd073b8cf627f1e4c0a4d75e210216632f544fa7cff86efa4889ef3347ad47851bfe51a0e8a169c7aaa4ba996406a99f740b32caed9b7f95fe2612738a32e7766db7cf5e55fa72089c7a39262ef27cc9304b324778665d520e9ae10385672039b2ccbcb93b9ea20134a8c80a5bd56d7ac4f82c1b8dc9a06559ec04ac97006213ba4fea15f3a94e6adc11d966c570f1e18999c4d3890f7eba718d6e151074f074ba1ae7f7ebdd5ca7e41625fc288c5776390d876ef0358150c2c1edd2385e39ef6a2084c07c966a7e359e6c55268dcbba9eaa38501159cb11faed94b9743902e666f1062a061c34db0e8f754f54b61b764d08949b4390156c9d33ee7c474036249f512cd28338944a2892cd4774a57997618f1e1194af72752e45d83510f85ad065f25dbda710933dbd6ecd7abb8f844f6e7a19f2c88090ab727b32ba82e033d61d373369829aaeddf94b2777d4dda19f67d5e8832c932dd0b86960846fe001068c5c2147d0d758b179a0a3999bd8621fc1b63fb8afa55d41d747bc8896942eb8b7c66ea96314a0553f88f575947819385ea78acd49ac161b112bcbf11f0da5774811f8616bf3614be8dd8c43390505f68e69974c9eec69afb89512f920a81330a99207f7a580ccdd9833fcd132cf251e732e3cdd54316fd2d2f6f37fe5b604a040d253a66c32a710b58ce2f25c234764d9df0f5955224ccc7b332d23132b14804691fe2cf97cbecf68741a5b4a864debf1892b19af6799fff94595b55c08e821d51a748afb6b58b9bca0077a9d23b3e704fd58c1b2545b58b95492816a4cad7ca1747770d606f8cb1e7f440c936935df0880d5cc13dde29b7ab403e835308a9de423eed3c7103be61afaedcc2ddbb2cd4e2802c0287c2588077573d60b60e83fa18cf67e9752be2c7439242c45ffa751ac74df43f3e67da31988755e58468b7cfc7df992796c0b289a3722e3271f281df24cd377d624d7cfe6f0ca53dfad67978f3904f3184323a792990f82b470708af265fe844b572a8f7451b946a29111bb4ab1b96df5ae59eb3a0c89c61fb1f314a558e0beaeabcbf1e6149574226b330a2d836d41a6a2d4c9770b445c8f75d4dea2227c39063655118eb8086051459628b2ff8e514290750eeed03df16d088cf17514f6d6a204689335ae40352dfffdf4cc6a308617f13dcd690f4eafed6579dd059157dbba621ec46f6caa2351cfd945675d816511a4657b4f7928b42031806d082f63dbf05328144575d93bc6366c8b1b567ce0c445aea7c42b01e420345fab4e621d7d33d1b0abbbc2efafeaaf97e2065fffdccc8fbca1af666dbeaaddce6b6e11eb68b5cd4d9d302041c3f48e495a06e3875ed04fc9ff0d6941f7d298924999dcc09d09b92d305d75c22c45775ed28215027d46c7c1122b5f614f8eb378b5354b494adfaad1a94f0739350af669d37c31fdc598c52409c4050b90314c6c2b4300ed57681def89afc91cd98cf15a972c03d793953e7a9cf3596fb4806893ce81170165c1b8a9fad82597dfe43930262a127800f1428ee632b5e72f9388a7972db192d80e290eff3bb32c2cdaf349895aac955423c3dba7e46d437935a2bb92399e12bf2008cd7009f1f321aa7c35f4150b36006c3e4dec5c8b2aa443b080fcc688180e323120f3e3566e851a9121f79782766e9a3e83b3477b557342f9e17d91c00f45fcee02a3dac26cbdfa206ddeb22aead753b50bc6855e9b215a020180bf2b73aa1cde947f7fd5d77454e0688ab729e53ca9c74ab72c31dd429a6d579701417f575c0ec0cdafa6828b3bb7ac32aeb913583287f75ed00b6eccc22bfee272d1f58726aa8d5f42054958ed7ca1e6a4f72c3de060a7ccd40ac6af553565bbc912f76912bac493876051cb685ec74d2fab1273c58040fa219fb887dec5683a3d85711da1d0b4d5c1c11113f7924ea72d9431b180fa5eae9ebc32285d43655914239e3a59db60c69c4aae80bd6726
362 | //754de50087a99a87213a78ea7dc9a870d8a378ec64ce5caf19777c01f2c02f570ee571f5bc309ad7b7440fccd6db3434c6fc15fd343cb74e3ff1c6d010cf873498032409742c59e70ea35a94cd81785a53b826382b455bf99c491ba31a63b5be304d36dcd85f20cbe36270a5355325d70605c11d89e3d5f0a261db3ca71c780f5dc6f297d8d059a5bb6382b8063941340147ddcfbf1ed9403e48574cb45f6b69d8e7664f114427699b16f9a25187ac6b825d9d340bb450853d28ade49ae18f8291c31f3a31909fc51d45c6231a6641071f7a091c09918fad18e32deb8e2494db6322031e70e12a3d033da8f16e32b511bc75891054f9ab31c822ff097fa4fee4b4e50ea4c8a8758cadc914c7b44267cbc7335857d02b0886d8c4aa890ec2b8802d398331bb3e28b0e17451b3e9b9afe7afd9f922f560c03a82c76a9dd927d1e946e13fc1a48e3714e16e3c3d2ed6dea937d40bfa374f0f9d339a6c0c8e0dbd6591918441469690329437bc986c6c296979d386ba03aa62a4dcacf0999442eee19db76ddfe1ee6ee40b87b238c4520107ab616944a3cc9bd25469523c1140861c34969d2b36e5a2a8a4187cb96babe726ac8baf510737027f838cac077b57573caf1a2ba5945d83937df827651b96b317a6c50735f05a7a2ce8cc133dae0ea355344b22f49d8bb29ad47765e483e6a63f7eba8df76a6a6b11a6c7177c6739fec1f5e2675bbabb4193ebffad6d58e68ababcfa57d434c19769836ff1efd6ded4a17ed4a4facfdffa04c74725ebf949621fe1540d390f7cac4ee82115e48c568bde08f25413cf5f023a20d44e0259509d6ece963e4e2fce8206fa4f9fca4413a918f8deadb4773a5b3207eb2b6277f760f53698189f671e354888bed70bc8135844c11bee1d997e0214fc07e5e35d6272e539fc20077e8e1dda38dff5574173a52299c6f98def8c75f5f2a2f7dba92684bfcaa2361c92c234088bd6f1e5876f3b642df5b56d28b92f70ded7cbb83c7c60ed925e9f5892505e046fb17c91a8785d6957a3061789babaa63436f7672833f1dab90bc577632f68b14cf85d1021a194f55d7246cc2cf0ff3728d7c03da3bd413093bb6d756cafc812b1e382c1616823c20ff504fb826322f89015fc34a3c4512c326a11bcd034e3e58c4b4e118a9a4a80fa85e216c9d6563146e229469035a1db1f85cd7899294c4059238b1c5b25a1e7d1b2df85644a85927458934c99af9300e6e7e6920da611240527093503b4b13fc044dbd1bcff81ec54e5b5241c4fbe4b9ba9ce6d10d4726c700572175a53e3aad1682161bf4ab260eaf615fdcd01e9e7876a713de50ef7877d2863e6c24fa4eefdd76d4aea7386f2a18cf7174f1cba7744637aee8b19340b3cce151151c5ca3c775ac7ca6b9c378653a7596ae5dbf329cef0506070af0145bb819ed082c43b0fc7ac41d9a3eae5ef4bceec4ba3747f32f3818a2b3dcc9da7b8586f260106b0535e6e01da9137f151ad41c4fbf5c75739360696fe6de8c34a8ea38abbda296f200a1e7ab0f06e87a12bc94ed13c40739b9efb6155fed7312c667e931eff79a5a7d472752dcee071b71a245a8990082f94cfdf6de17540afb36290168a8d13df1e91918441469690329437bc986c6c296901d7fa7a09fc50914162e090fc349e99337062a1b75a53f0c755cfde3cb3ae912c634dadedc141bfa8043b68bde3abc9b323c3120128255c25d42bb32f9aa779146f06e62517122bb917b23a9cea2574bf1175edee0cf7d18a5a2b90ba0f23ee3fc7eea9271076d8bed5f68bfd6a8c5724b8dff6b27174efa19bae5fef7de16ff0e660757ce0a775d250747786a049e13765e52f248cc88d5528cd11e9fb135ae8cebabd3e6adc48d3613dc4e294795d61628c604ceeef64b1b45173b370ede519e464af59a03a85dae4da6d31d43252e9e7f2c005dd092978f36d016447879a4e85fd4ce795231d7eab4a1ad65195875ce9bb1d4013cdaccca079255271df1c051e0d052906f6e6b938ff3751d6b04753d1be05457b72ab90adfc5bef8bb966e9ba867621c71661dc449ddd48c469563acf3e78044c8e4bb62e9cedb33046de8e0800684c9566d15d60101401a0a799cc1d84caab9e881c9e7814500bcecff3a67efcb908fc0118effb7caefc1b60304b2b4631a2782deaa3482c387a12e3f2e54782c65d93b66cb679e1e46a6fc967785f63bb40244a0402e603258271e2db4eac09bc28eb82f08f347ea218633357bc070a8a00e0ce55d6e52b4b28e90efb1ef1e7646ead0a409f004f261ee42d8f0062e4c11f1326ac5382d9fd6fdbd4dc70d64d464333be3f5c791dbfc8247b3516e696e19998f69a00d9cb15bdfa448bb61d39dedf101d7324b5a2d6cf251a35c2e55c592b4acbaa7cf5ae76defc37ea4475f1bc32aaaf0c9de7fca37be8d771deafae8b1930f9544289fb38de9d8eee84a7b0904bf71652e93cca960734c845b866846a2549634e449f927dedb3075de0441e919463a5e52ab816bdb990169f10b73b4b4fbaf2c91f2623e724a923eb603ccc5c67cceb519430f84074ade8a6f652d73247fb975308b608dba5c39c39e4988e496c6c9a488f9db3f3f88f4f7a24469c230f018eebb42560dec4f2889220486eab06c39d6e307e76dc3495c285f550c6a5c34810c3865d84ea3208749a685827d814c196dd442d4b8d6acdf532ab6993f3a536fe03dd0c2c6f6de605d7767d270b3839f371907f7e61c7e9af4d845d3961ac199fb1d9df8a6ecc5787f686d85f30aac0277d0abba089c43b6df9c442f15d61eed643b775489a07f1865225dc86a44082ff4dafe061be3e9685cb88a83ca372619d8ec908d690e058194c40f2c3bdf0c0389db2e2a3b3345cbb8eaf6d5eec03ee9fb764ee67ba5df98fda3664ba4225af3b2b13c4110351cf98f933e7a88cdae4ef2d28fb86889461b04c878141942dda9f19e83180b1cd91003242975c764dcf2ea0bdb06ad5eaf066901fd3d476afa1e516e3b2be12742072abbf841fd394403e160b9d77700aa60d489e33ab3fb3a55ab1e24061d2244c3186008af0532d7061f871966704845e770f1608b56ef408aad02a6dcb1c9d84ad1ff0e6f17a547b8e3acf67a82e18004d8ebb12a6213867d559b765d108a11e94b60c7826e15d726acc480298b6c4732527304ae64fa224ebd74fef21b8a4199af49607438065291578049889a670ee3802cf22fdf2e8b475795e8884d03d4a51ff275850b1eb0725788cb5eef58fb3bc152fb150a664a57a8f2d3d358b9dbe1f92b28fd46a9efe63079f6f9aa0a6bf0694bfbf1c8f0397347771b5148ee2ffd30479997fc55b872c5aed387258d07c5e5b025f2af41abf82debefb33e9b8d18767469b9ba4972fd9f6da2e2d0fbc88c00316fbfd43347eceb3ffde3cc25546868da37057c3c7270858e9cf6b7bce43c28e9b2832d4cc29a6f9272d4fc9e22afe1066083f4c784b5641046252665c9854edb981825b5ca1022f73a88a461ab0507565f89137e896a218d48852e885ea46ad7d425134f42c13c745ccf751e20d91e6bec5dbae5f3aeffd6e276aee40c886c2b706742eae48b1e85a21486d51faaa4ae6431ef9bc6f320eaf98737695a6be423869f066b0a9277972bc12eff52e8543876a713de50ef7877d2863e6c24fa4ee243b2a08cc379a3250ddc94067ead590c84ae3e1623a39d5da5e45fb452a92097fcc366d4c08ce75a280b089c507a5a4619b491f82c1fac1d7e0c44eb08b656d8fa7c04d876ba5a52ce5057797e6b05e052c6b8352448fb7330413e970abef8fa099bf0420bcfac3c0cc4be283be0932b8f7efa20845ccd7c08b56c888effdc9931dc185aa7d3ca2bf8de9fbde0b169624df59a1595348e48dcaf3f3d42eb070f224dfa3b579534a351bc0b96ebbb36954c53af9718ff865662ace9ab010f5a2dbfc6e1be589f3f76f021fde1eb5fa36329e4ba85f25671d5e047a80bd106cdcc60a7adfaad203f443a73337cb6a45a943614f67077544844b5e72cd3a5e63ef6bf00987b6b3c084503179ad18dc8ab8e983e2244e7c35f7e85826ced5bd9afef366fd49731af89f3472b63bc5a183c35012ef70d7571290ffebaaea09d1b34849c5a7b3fa8a91597c7a7c0c080456173e2e529c1d023340074ed090134c5f0fc301e9805fc9311c379470fbebd91090f3b9b52ff3f5e5440e499fd9fa0136a2de7d8b3d5afb9bf0643299e6541a0e93719efb6cb3a48ce76333ce2db64bb6234c25578569fca822c1273d915a19dccf26a3a767bfc461c8a52829ccc6193d7c70ca207d285834a54df1bd4a9b7cdd36e09ba89f30a0ea3ae24bd1df2a3cb9c7b9f1f9a58abc20eac13a67cca6bbf2b3780ea019700302aeea577e5c8be43b7e4b4756c52ecd57e373b69e46c71142a74788019b7fa9cd879548dd7303a26267589105bf5d9c25cc6549845d223ed24a4ee90b75203afc113156c0fdae224a06cc3abde86ff1c7a4cfc3c81e9663e5b9db96692893a22205599fb3f1d19acccf9781529d5e6b314f30178c51d82ea3bd703d59824dc97aa90e708a6a4ae57a3bdea22867f58d6dffd8830d2f34050e60d2c48aafc9a8fae65f9f6ce2aeda54b51567237f08727c3d840cd2f1fbd57e1ca49d09b940a8f8ef95ebfbdd4868501b0dbd45bcc2f84e78710aa32ac5b5fcc2648d219a0a250b958b936eed9e178a7c1222fb749d1839c310dee057fa36d1e591918441469690329437bc986c6c296973b289c6e6a856430d8a344283dda03a1de16d9860746921fe64ea8b45e88ea42688f30f4da324cc1df354d201b5cf5fdab8f447daeeaf4813614b5caa9e4d7e6a53762d021c768c0f77feec0b85cb5fa62928035ab31c6bd1818d0e6accd63074e68c26f17abf86b146c978a6b414bdc233b115e2e6ee6df0505b7c96b857b3897a3459d9fae9a2dfd17dd60dff192522fca5d0e3bdf833ba60f262a4aeb0654102a7e476c9b29110af56498f90e572298c010f45bfe9f83cc097d62e5d7eb45ce9bb1d4013cdaccca079255271df1c64fd5330a59b840842869092c3bce741132342880977dc9e4ef7f6b39a6e06de77eecf05c3898783479da23278c07420ddab483bb8935feef78720a39ae11f2408a875fada7153926da46f1600495bfb5c618669cdf4c61f4f2b000a56e6302374333b300f8e81050cec5a511b2af1c5916d3cd13f14241b9d793e8aad682b60e44651efa5cba2129e7f5a371d34cf65ebc59b1917a0d35f469b420bbd5e27e56e3af1698e8a97a4f76b22ca718b9d62957d17599dd43dbbc713c156e36f6a10c4851331f881ff71ade64da8285da4cde097dbe7287a5d2218d6b8e91199bfe711d0b79aab000c6e59b186ea214c8638a5c9be4c470571076c485b028d754c36de10d8f3307d8ebc0224f86543157b090b16ddeec56ab6bc084d09d700c5a6a0e6431ef9bc6f320eaf98737695a6be42981fed10046ec11816449d2efca2cfc0c69c4aae80bd6726c2c1fd80f7b59715311be42e44ee65dcbf304e18d5eaebe1fa733e0f5895d5b4707d24fe051b1e8363cea506b7d58428f2f3334ec7641bb0fb49a7e5b4af24c395a961a31644c8f9b445f401a2c1ec9e1f9ed9bcfeaaafd1e36beaf26e4eeb470d34ff394b62846889dce27f0582a6f5109c01bc9e2fd4dc700cc2dcbd0db18a568c279b9e30549c3f4642ea9af2032b9bd91bb2474e9f8af16d52a8c7578235537d6a8567abe01cdff674e268d270db249fcab8f29a59dac3ff8a9abf222fe1ad162c1e9873c3f0215818a9344f01df2746c967c509bf01afd9f922f560c03a82c76a9dd927d1e946e13fc1a48e3714e16e3c3d2ed6dea9dc6f631fa27a7db808bc3d63202cd1302e422c003cef6ad2ec9c8fd0993a318da623247181cc6fc9d98f322eddb3d8d3189f070ef021e1a48587860fee36b41275a22d2d4b0f0c3c18cb31ac998610c927fb45eb911dc1c330b18a91f320228c264d8254023af4e5c37669141cb3692dc2920d77df6ea1f90f04c56a950b23b16a297d336a238a5b2f816d0299d1dca689557c6b8c3f1ad6ee8cf8d11e9dad8781d86b3ec3624e8b8830c73299747c739c993df867f3e984dd10199af59e63495766ddc7fc0c719665978ef14ab0bda3841d33d2066087beda10086270877065952666fb03d00a9f32db6b9b29ed6c3f9878883328f94c4c3b0fc2df887a1f4c5b53e98b25fa9ee14404865cd3dcfbf4622d22a02c34427bf3b3db3d3691d8e81849de6bb65473dd7f8da8e1e7ae9e984afc4ba60565590ef1cfbb264f43d4abdc8fd04b64b671127364f1bdc5b631933cdf998f495dd190c495a49fb0e139f674cbc77807e12ad6f76e64999ac10260e36beaf26e4eeb470d34ff394b6284686850dda39134e71fa83e38f50c5b8a457eb388a9e6347d806fa22b10aba68b224890a998ec74a4a2781f4c4c7db34347a520d18eb0799b68ca771cd8b857a7ea5145af1ede36b5dee7ee3d096b1f3135a6fb34beb778b46b4c82c5ae75b7f9e55eec537c37bded745b06ca36864a0c1f6d8145a0d8fd1a4b5820ee9e15b89fbb8830eaf0f79be6c998a47fd329d77c4355f85c3e4f93acb227c1a61e99677fe53a22b79bef79830c82a33c65a04cc6b52b27ae37930fa6bbe51b9061e2e0e918827b982247d1f4b45f9f0afef3b4b3bbe450c1265d5b50d1c0abe4f4816c47bfd0c518a1309f48a28241eb4cab63977d61f8187f748c35bec64f61acd04943be7ae4cc9189f6ab2b66b5699d0ef48fa1f7273e433c52de76cfd875ac32cc4d6863a2cb224f29084e9bb974b4fb750bccca0720ce15c0124994cbc0d5edbad53ba229fb9a22783c000c58fefa7f948b2646839adb73646393bf5a1b526c51efb5ffba10f15a4e8ed7edde56cc3be149f6ebc237033274d93d33d21ced980084c2f23ce4dc67f1ff80819b2f697bc011f93f0596957dcd2339c7387c6f86f9638c8249c696f807181b511ac2bd011463d944f9751e20c272a5c1b91f21b32fd2d00cbf1b4fd939e1543373564b71baa2c630aeadcd807762bbefb8a39175b0d43ef40e0cee3d12cc7e660d7fcc35330ef637a12c1019317fd48699be891cc5516baddbc0a599a8b1038bc1ed598e7a7813cb28b78cf084d7c614cfa7b9c9190c4c7e36fc7c0b2ada5b20e8f60894ba8ce7399fd4b91ea1df2edfd08ef394c0292d600ad1d50948354152ddd7b82a1d3f22a9b2c15f0096256134e07f1a64d977617c5b21527feda4e0e3b3b4c86fce78bc9f4003f0b6d06efa0a382d2d4536d8d84b569fe7d83a3bb7a3d0d28fb750ca1f48251a7bfee95d944232e85b41bfd9039b57669bfbd19b1a7f5b34e3dee737dc6081fb85c3fdc86ecc39c88e60ea03e26a82ba75523eca1c88b63fe5126635e9488993e2484667594868ad9a74495553d26f1d1934b50d9da3aa63f65c4d88bc97ba42d9f7730f50aca1facce91ad8830e88ca52c41eab95f9438025c34a33242a3a704aa424066ae6fd54d9436126693d1e61afd1ac97fd6fe720cada3e20a4146ab3e7b798836fc7c2a9b87686b3405443b0fc5453a4ca27f66b7bcecd95ef33095456870b9822e5ea8c7f1b558665164cd36e416be61c4a8fe4acd509ee2f1ab5c242fd9a1045965193e7cea3fdd51f93fea7a855a3a926955270e3eb650769893d2b0f435524036f37b01e67073d2fb0266aff915057a71ca931a755463e20d5e88ba600f2885efce86bba7788ea063d71498595d78037e49766a2a75cd95d1a08e3ead112baca17e495f105773a09233c981ba9f12d12dea3e74d433747055f21129ecae2713a8a5c39d3d9d562851e76b8bbeaef834e0ce34e416b69fb985b591d7057935879c6168b9bc5275523cf1f820f0ab7c9ea648f2012db4229329f66b36bab5ccf7a101f891d5b006c407aaf19310cb9166869a1e07151d7be88fecf05d79afce6e72fbb84aed12f067ae558210320cc17894adb5a8434872f77eecf05c3898783479da23278c07420989db0af0312c09b254acaf7a8c41dc9e353385dca0f131211e7c479d847190804f6c7ed9f57eb0bd5564df5193c101f0a009f12850a60420d9ac1a9a045038aa25590ffbf445050a8a6ea239372224da49d09b940a8f8ef95ebfbdd4868501b882192f096aa19c956eabbe39369ad059fa2a83d96249f8592dc5530872716dd8541c5236a0e3da73cf6839b9c1ee768ba56212ec6f029edad1b6e1c63b77e1583642dd84db67ced6fc9b5fb902a1f03419c130c0205a439f8c9429068584d38701223b3a51486fa1c552702236ff406bc1b1036cf49ee62acc32c16807b601bb93aa85673d8bb306dbd78b2348ad0aa90de736e70b55e7cd122494c01bb3539043f2cf6c69c64b9cb854f601c12e5e04e4ee1d1e5d536bdd78eb7772979dab159a25816a6f2e26dfb06d9bc4a19cfe14e40a8ffd03f06618cea28484067097d81881d03980715d7627f040cdb8134a875d53cf9fed415808f1ea6a362bb1e002d1b1f61887ff9d4fac4ba5fad5bc24856988a28aa051a9098a81e55c39fe475a64d256f7f6c0330c6467f5e6d9fed062c9eb52c67133a586e6c75fd3c0500f21130ace9e05442c2c29682010715be4158583b3da08f024c8b6606fdf97479f4b75215650dab6a318087ad6b37d562a1bda73206115118e5f293fd83011009fe0ec4fdca65e1771d197a2bbfabc73f1cff33a4762c96d68c293abdf68ecbbd5162a7dae65cc4c1c543e697145d0805b89e6366a470a9eb2082f0e1bb77cc4faf948ec44e8d4cc556756d8f2c3da0a677e6500bb81d7df3d8dad6a5ba014433a4309ee0afcfb1c452e98237288959cbbb17af22362ce3ce10d747b5e6cf10df76f8d40a9053ce48c89f0b8b0ef6f18d993881e8bbe9987ab6e3b0754656ac6d99db02cc5b45d5c73c23783f7dd711db0dbe05c1e27ae740722e56af5dd6ed765f3b04d9229fa8ae30b981598cab3a41a9998ca55ddf52b75bd46c39571a16517dc0c64e9218467ac558a718df6dd15a341856aa39a7e8a06c1c124bdc6f3c1a7937e65280da2e7839de6fed59d5d258a89deda6d745739d0aa0c29be3915593dc0896fad0f04a41599c639e11a80b79d23048c2fbcdc09dd3ae2b695b73397a12e3a3e23bc4ece1471e4759af91215125429163bbc06763c352df0a52117dd3f0d635637fcf9931aef79605f505e34ded7b86ff352e277e8e71a92ff3378e1cad3c295c8e70db16681fbc0a60ea0ef181dcc4c93530161de087dc4012fcd8e14cc976d60e7f939ea9bc04f6b43c985d723f39985d8942b83d69b61a6d13b0c45e057422df6b9b2952a9d9c19e5274e424c4a80bbc266d84a3c6e401eb016ad55cda8e871b89b1c03146d76fc5f355da4424e46e3d4fd69aac83e273d569cdc3d3f9202edeeeb8758cc9f7c9c44501fb7d755b546324bdce5c48b5cc69864bdcdb7d4bc7d2c772ba872cb1b68e48643270d02295d222132fcbd73614e74e21b6384606edb20d125f86bf27a6bc078ec14a14d47ff59a28d1293fcd073b8cf627f1e4c0a4d75e210216632f544fa7cff86efa4889ef3347ad47851bfe51a0e8a169c7aaa4ba996406a99f740b32caed9b7f95fe2612738a32e7766db7cf5e55fa72089c7a39262ef27cc9304b324778665d520e9ae10385672039b2ccbcb93b9ea20134a8c80a5bd56d7ac4f82c1b8dc9a06559ec04ac97006213ba4fea15f3a94e6adc11d966c570f1e18999c4d3890f7eba718d6e151074f074ba1ae7f7ebdd5ca7e41625fc288c5776390d876ef0358150c2c1edd2385e39ef6a2084c07c966a7e359e6c55268dcbba9eaa38501159cb11faed94b9743902e666f1062a061c34db0e8f754f54b61b764d08949b4390156c9d33ee7c474036249f512cd28338944a2892cd4774a57997618f1e1194af72752e45d83510f85ad065f25dbda710933dbd6ecd7abb8f844f6e7a19f2c88090ab727b32ba82e033d61d373369829aaeddf94b2777d4dda19f67d5e8832c932dd0b86960846fe001068c5c2147d0d758b179a0a3999bd8621fc1b63fb8afa55d41d747bc8896942eb8b7c66ea96314a0553f88f575947819385ea78acd49ac161b112bcbf11f0da5774811f8616bf3614be8dd8c43390505f68e69974c9eec69afb89512f920a81330a99207f7a580ccdd9833fcd132cf251e732e3cdd54316fd2d2f6f37fe5b604a040d253a66c32a710b58ce2f25c234764d9df0f5955224ccc7b332d23132b14804691fe2cf97cbecf68741a5b4a864debf1892b19af6799fff94595b55c08e821d51a748afb6b58b9bca0077a9d23b3e704fd58c1b2545b58b95492816a4cad7ca1747770d606f8cb1e7f440c936935df0880d5cc13dde29b7ab403e835308a9de423eed3c7103be61afaedcc2ddbb2cd4e2802c0287c2588077573d60b60e83fa18cf67e9752be2c7439242c45ffa751ac74df43f3e67da31988755e58468b7cfc7df992796c0b289a3722e3271f281df24cd377d624d7cfe6f0ca53dfad67978f3904f3184323a792990f82b470708af265fe844b572a8f7451b946a29111bb4ab1b96df5ae59eb3a0c89c61fb1f314a558e0beaeabcbf1e6149574226b330a2d836d41a6a2d4c9770b445c8f75d4dea2227c39063655118eb8086051459628b2ff8e514290750eeed03df16d088cf17514f6d6a204689335ae40352dfffdf4cc6a308617f13dcd690f4eafed6579dd059157dbba621ec46f6caa2351cfd945675d816511a4657b4f7928b42031806d082f63dbf05328144575d93bc6366c8b1b567ce0c445aea7c42b01e420345fab4e621d7d33d1b0abbbc2efafeaaf97e2065fffdccc8fbca1af666dbeaaddce6b6e11eb68b5cd4d9d302041c3f48e495a06e3875ed04fc9ff0d6941f7d298924999dcc09d09b92d305d75c22c45775ed28215027d46c7c1122b5f614f8eb378b5354b494adfaad1a94f0739350af669d37c31fdc598c52409c4050b90314c6c2b4300ed57681def89afc91cd98cf15a972c03d793953e7a9cf3596fb4806893ce81170165c1b8a9fad82597dfe43930262a127800f1428ee632b5e72f9388a7972db192d80e290eff3bb32c2cdaf349895aac955423c3dba7e46d437935a2bb92399e12bf2008cd7009f1f321aa7c35f4150b36006c3e4dec5c8b2aa443b080fcc688180e323120f3e3566e851a9121f79782766e9a3e83b3477b557342f9e17d91c00f45fcee02a3dac26cbdfa206ddeb22aead753b50bc6855e9b215a020180bf2b73aa1cde947f7fd5d77454e0688ab729e53ca9c74ab72c31dd429a6d579701417f575c0ec0cdafa6828b3bb7ac32aeb913583287f75ed00b6eccc22bfee272d1f58726aa8d5f42054958ed7ca1e6a4f72c3de060a7ccd40ac6af553565bbc912f76912bac493876051cb685ec74d2fab1273c58040fa219fb887dec5683a3d85711da1d0b4d5c1c11113f7924ea72d9431b180fa5eae9ebc32285d43655914239e3a59db60c69c4aae80bd67260d0a6566380d0ac2c1fd80f7b59715a89349c598ec39f2bb1a8d1cb2ad92878291e8c3b902e31ec6ada8a967baee445af41e0e780be6f5276b22e43f782f56ec1ad1b85e31c3e186d9d6a26e98d349909d3ec5074cac22e9577b8dca936bd83d19458e2792d20ee24ed9c03549bd39d82cc49b672e47205670f13b510f6050036cc08793e3af945f24c3d3415995629cf345c669c9685e9f9c59b46ea40796b84b0d4cd6ea7308a275716c74585f7859da10b5552a1e754ac95621f01be907edaefe2b5799aa7e900c93696446bf4b4afc4ba60565590ef1cfbb264f43d4abeb28c389e10cca26a52a0d3887da4f35ef8e8d7b9b4ac1bd354187c3e8b5b86cf8deadb4773a5b3207eb2b6277f760f59c4224ccf34ef1c63b88250bf3d844ba8993a9acdf35fd41535db09d177fe5a9be884a14574c5adf511d8c335414bd7cf703d2abc4fbb4a47452336d13d3d487dcf09480bacd9dc913faa6faef516fd64bdb0513a4f111da25db0c55f8f5e63bdc2d57d2d6e0853db0646c6616c2063a6d8abdf6b98aa40d9ae272e0854cfcfd9e8c271048bfdbb917e29a6b952b24bf285e7fcd884b155cbaf8654acacdee225a683c60cb9780b0c648b3fbd1e61326f389521174130f5a62223673c9e439629a14c12ea04358224c9b0b5a617d4b1cb2cb75995a07c42c01384edfa69b6b802b6612b1e850fe36cbd686a76f40a88d5c7829f401619e3cab7e6d2b16d0dffa3c38f5e9113b1e4e3cc4eba126b85777eb01c7e512e2a74ae36f5bc05bb0e344cb642dcca94a9fd853f9268cf7667d4afcbd019ccad3cf1034ac9d650fad3cabe35b5743505073be90d20e1327d0002187d04ee10d738861e919a40d915c4a3cabc1dcb8a984d15f6985b72c956b3e9c77e7d373797dbe7acfe07f4691f4d838743a269134195b3536911b0dcebe0d95a29c9e8fad211968d8e4e1ebc9019556a674eda0eeda3011ec0656fb57ee2db8c3ff8a9abf222fe1ad162c1e9873c3f0152a605e522ca9598988eeac6795b781d26b48d90b43f0732baf36f84820e9a533752434b7a4198b68efa97e0d1663ad7fa1d48f19bc45264782dfb277bf0f292efd0e697d5da2941a17d5b9778fbc3f6bee91871f09fefb9967753d0f149640ebc3f01c974254270c1b6a6b4076e8040147ddcfbf1ed9403e48574cb45f6b69edce80b896ee197b865fbbbc847f96b823e79cb590a54fb5e95df089ed6236bb6067d115a870d62ea016d7c8f0ab6d7830dc5c31a7e8ded9f1d5861d55655a4c24b24c0dc2fe8c1a0974a5a07beef0238d5b8b84e23dc1a81ae9c792f9250b184c347a0ba11f5276d64b8ad140c887918672c47660965d9a0d567538d0e7696c57051b180e6ea061a8799751b6b1cd0b1069718721cd1a0f7d59da3c0cf994e94db77b975f2f1fe7b6dafb38cbb87b31c736d19318578e60d9a772948ffd8ed90f9c794474cde1c9b4bf8de032411b445e84b8990368da9064bc7766bfbcded4e42cea4bb952949a1cf9f60336a1e243738b7f6b76d0ef68540e587064731ac035fecb9f3b22f0c28de5d8ccbae2db15df3ec6379f60590dbc7d3affa8d044d52086cf19432cfd852377e811c122cef64fbd4fe429f86787892bb128db5e926ee83c072f45e0913bff615d41bbaacd7f9fa2a83d96249f8592dc5530872716dd4a279e7038cd6125af4a144fcdabf6e283d7634360fdb68e8dffca36b12fe086eb01c7e512e2a74ae36f5bc05bb0e3445ebf2f59688d14eb7ee863eb4d1a6603f829fb22d0454128e424f5f6fcff29dd916efa272037bbe1a06df278cc7c8db57717efcf2e69ed7b172d4228339455fed99dc94e78264b3c7d0d9d036b9f0079883bbcf94f9372d72f4c957669badd1936734f468b3e7be5c8eda936c8db92a434d9b2caf5c94cd902e16bbbd8885e47e16725c1d44047ad5e6ea08e0829211916d9ab08e52029f1073ca81514f0b9a201c14b9f59ea6b8c63f40f59ca74e1494e7ef4bbb98dd148a3999fc4b03ca2b7a6c9a5f50df30f037a365d5432fd602db75215650dab6a318087ad6b37d562a195ab5d26615809e17be2ce02b0dd5ef8b13e2b69e865401ade8131a266cb2dda21178df463de885fc4ba30f121e013df56988a28aa051a9098a81e55c39fe47510e48b9e72de75dbaafe3c738e92a32802d0c018349f5d08aea001b5f1316b5230c30c386586f952ac43da81997636af59a25816a6f2e26dfb06d9bc4a19cfe10b13a249c3974e0d71248e1ed6982df6ce6b54325c216305040cf8480d9ef72bb70ca356f462fe6b99493797de09302d5134163d10381c36691d448c1fd022b2f4a1e2252b73d2f4f97a1e5f186ba90ae2b7204dc117f3d65037ae034084dc32ff226417b1e47565016c28bedc83fca6bd1e4c3729a6d89c61382603254c5f1c67d313b6ccb3511f77cdea28ebf2d20afbac70019dc80e58728b3dbbb10f438c2e5a649db4d6cd2f447c947f61c1c796c45a305174f4bd0b59d7ad35446115365c7618a30806cd6a971198371b74be5a07cc6ee65f9a1d4abd60ca50fe8a904e7de2868cd34266d8057e01c080ca5619ff9424b98cd4c4f9afbd8a08fba47534d27403d50fcf364a93c6f2309cc2a6b7d5949628e6724f4ddef848c9e8fb8884cddf4b34b873b9436f773bf0e49ad3a52f62accc53e5f3ce53fa2335bb5d713fd34c48760293269c9a13dcde4d6923535051b2402782fbe1a1a7c42f400b5fe31d2431983b9e9cde973a0ff529c982e1ba4d788a25c87aef3782a3bee64f323b781950510a5bdfcd2abf01ea0f66134a0d49a99af71de1c2e60efce7698305aab4e24bcf68f189e1160ae3aebcd090c6d04d3c4b70deebc182f3ab0adfac1dd4c7a0223a39d627b6b7615baed1fa73a572dab4cf07cffcd3da8d2ba31d10e516c5ee9f03c843769e4c01aad96a580f322e680f7e7251f8ce377e9fdfc88f90ee351408e8e58e4936fd419310588c6f9e5d36bf44361a318177fe53365bf5ca7de17c80f4c8ccffcfa2ac2296063472a8567c8b259375dc312149e191eea1a463705c337b722708d31639ef74006ec66e0377a646112f281e3f79a7e874964535b8e7baafffb8dfad8e278877d7505d1e92bec012dacaee6e364fc1b52460d211781950510a5bdfcd2abf01ea0f66134a3be198ec51c752a187986775bb4771823e8539c179a1b5969b1681182eb82f07547fc7ffacabda3de62a168ca6532061fac3cacddb11cfedca045ca96cb8cf3de16725c1d44047ad5e6ea08e08292119ceaced14b1b958051adea470afb44cdb58583b3da08f024c8b6606fdf97479f486fc2d22e065f473bc294b13b121ec7ab3edc9a706c582633cb33553368afd3343906c73ca6333060be8759de5ec399b04f6c7ed9f57eb0bd5564df5193c101fff0a0fea441b92adee128f519c315cb8cb944a6431febd4146ad1f1308c427f0311b1984ddb2f8933b92d320b2aa67f3ebc237033274d93d33d21ced980084c2bc3977b648d766958717b37eb09eecdf35a4f7850b85d13e5beedd771119eb626f23d1027e94ad65b97d17fe2210c49aa229fb9a22783c000c58fefa7f948b26b101aec42bc94e03cb37dc15ef7a9b1f488993e2484667594868ad9a744955537bcca071e3c6e1cad20cd168f50b127c7f353a09cbd22168824ca24ec2f6c877be3f22147a928e60633fbf82d0c6cc0debc237033274d93d33d21ced980084c2fc1b6bc3acdb8011d461ab09e0acdd8b3029cf2b062ada172f066e1f3fb1f39c955c54153829765c8f662e0e912c062211eafa9ecef1e45567cba3882a871f2e94b79817b1efd10c95dc82c8e78791297bcca071e3c6e1cad20cd168f50b127cce8517d53df4476d3c82e36c137480163029cf2b062ada172f066e1f3fb1f39c9f1b169f2b59684a404b8fb970762875e7c0096a76eca8fc66a69683cf34db67f550c6a5c34810c3865d84ea3208749ae8bbeb5609f61ccd2fa1a937b2879b79cddd2cc0b62ddfb3ec85ec914e5384365d73573bcb7010d9f0645e14b0bdd3ea2b6c191176ad76b9520d6651afdcf42dbe3f22147a928e60633fbf82d0c6cc0debc237033274d93d33d21ced980084c27a6322c60e321d7950bd6ecfedc375c4de7f35a59637c69150ed39825918f7dbbeb826d047b8477e3ba55f6fc59d1e67ff44d9e7136fb5cc4a337b3cf685851b3e8539c179a1b5969b1681182eb82f07d77be19e43cb4d703228e57d7e12ca9a364b79edecce5285d782174f4ca74a88488993e2484667594868ad9a744955537662f0951d280e1c828f10fc834a5e14ac1c80600f34ecc829e6f496cc4f300c018a05e376108c01309e2a097c9e3b09ba2278b548ef7f5a62fb14969b870913c90bec652bc8c1475ccc4bc1e0ff1a64e25af00993defce142bab344d6e308788569217844f8e0d780ef7a96d9b704416e7a4a471d8885d2dbe5c0d59a19cdb2ff1c7412fd936b51e60a66a786483deec0a264e4e1ec56297798d902dda6742799006ec6ccd4f16c85c483d6e063f8f9ebaa65e55e8ac07e34ca72a26c4aa9099762aff08f98007545168b395addd544a26a0a36aabd394e7a14d3d5ffdd909ca0f7b6452da16abfa4246dc6f0e31d92ebaa65e55e8ac07e34ca72a26c4aa9090e5eb245cc18e2e89adab0b832f5325ae2324de9c5d9918a76828e148ce4911273cf06797fafbd1d17a6b6db8e39f90b96bf814ecb072a626881819e3570576440de17b69bb6f01afd19834b993c5e1f79a2c6653f7732109766d1dfbef99522641f0e655a7deac73b9560daf4b93c114ef145f5790234295d01e10e9592066f9a806f7421547e69ca39184c5bdf86eef15e52df410460dc67d24a7db7ad7e80625481944661e457ed221fed271246138734f1fcb3364000914799e81ac0bd3c691a346a2cdf7df0a4f789bf6ee8f27c5080077c2f8e35f762a6e2bfb0fba8e413c45b192d262bd5b5c7ee76faeffdf99fb8c428f6998ad34d55e9ae14b269e51447ffc42fc1a27331828e4024ceda18689a39dee818502eb7e1b287d5bd5f65bcb20dffae6a768afa43d6191fe869108ee7059d1080f2b08d9138b1c4b6b4b685c68b446c8e2da47f72a69fbe038a4af4b27ef74ea74d12baf3fe3265c1f0d528db3789a4b90d14a61013d9a91d6bfe314fff01ea988763c17fd577c5bc6f7f1cbf4c0ed8337f568b1e90dfee7673e56b11a3845efae8b0fa48ba6b7f4c10c77121086991851f34a7d6da6c10af9c85c6d6e771ef01bccf8a57c310c181447c1727b5417483b8eea6bff12ec11129453d539011e4a0a8177dff3d9cd67d8ee6a6b5eb6ac88f47865130aa13e5d72b57886cba3a9e84e1baf03356635d1a7446adf7ec21fc5698cb7aa363a72b5e35d6
363 | }
364 | }
365 | //e8de8ab09732a8901cd4db1dca9e169b3c57005dd9a117ef18b8c758648fb9ac
366 |
--------------------------------------------------------------------------------