commit cd94600651b36ec0c84a98974c14407eab142aa0 Author: alterdekim Date: Sat May 25 19:07:15 2024 +0300 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/cody_history.xml b/.idea/cody_history.xml new file mode 100644 index 0000000..c886a51 --- /dev/null +++ b/.idea/cody_history.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..89675a9 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a107768 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/login.reg b/login.reg new file mode 100644 index 0000000..796d83f --- /dev/null +++ b/login.reg @@ -0,0 +1,5 @@ +Windows Registry Editor Version 5.00 + +[HKEY_CURRENT_USER\Software\Blizzard Entertainment\Battle.net\Launch Options\WTCG] +"REGION"="EU" +"HBS_TOKENX"="ABC123" \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..b668aa7 --- /dev/null +++ b/pom.xml @@ -0,0 +1,142 @@ + + + 4.0.0 + + com.alterdekim + jstud + 1.0-SNAPSHOT + jar + + + 1.8 + 1.8 + UTF-8 + com.alterdekim.Main + + + + + org.slf4j + slf4j-api + 2.0.9 + + + org.slf4j + slf4j-simple + 2.0.9 + + + org.bouncycastle + bcpkix-jdk15on + 1.58 + + + com.google.protobuf + protobuf-java + 3.14.0 + + + com.google.protobuf + protobuf-java-util + 3.24.4 + + + org.ektorp + org.ektorp + 1.5.0 + + + org.nanohttpd + nanohttpd + 2.3.1 + + + org.apache.maven.plugins + maven-assembly-plugin + 2.3 + maven-plugin + + + + + + + kr.motd.maven + os-maven-plugin + 1.6.1 + + + + + + org.xolstice.maven.plugins + protobuf-maven-plugin + 0.6.1 + + + com.google.protobuf:protoc:3.12.2:exe:${os.detected.classifier} + + + + + + compile + test-compile + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + package + + single + + + + + + com.alterdekim.Main + + + + + jar-with-dependencies + + + + + + + + \ No newline at end of file diff --git a/protoc.exe b/protoc.exe new file mode 100644 index 0000000..b5c8429 Binary files /dev/null and b/protoc.exe differ diff --git a/src/main/java/com/alterdekim/Connection.java b/src/main/java/com/alterdekim/Connection.java new file mode 100644 index 0000000..db6b0f8 --- /dev/null +++ b/src/main/java/com/alterdekim/Connection.java @@ -0,0 +1,124 @@ +package com.alterdekim; + +import com.alterdekim.db.Database; +import com.alterdekim.login.LoginServer; +import com.alterdekim.services.*; +import com.alterdekim.utils.BattleNetPacket; +import com.alterdekim.utils.Compute32; +import com.alterdekim.utils.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.SSLSocket; +import java.io.*; +import java.util.HashMap; +import java.util.Map; + +public class Connection extends Thread { + + /* + All files were merged into protocol.proto + */ + + private static final Logger log = LoggerFactory.getLogger(Connection.class); + + private final SSLSocket fromClient; + private OutputStream outToClient; + + private Map services; + + private final Database db; + + public Connection(SSLSocket socket, Database db) { + this.fromClient = socket; + this.db = db; + this.init(); + this.start(); + } + + public void stopListeningAndDisconnect() { + log.warn("Tried to stopListening"); + } + + public Map getServices() { + return services; + } + + public void send(BattleNetPacket bp) throws Exception { + // log.info("Sending response: " + bp.getHeader().getServiceId() + " / " + bp.getHeader().getMethodId()); + this.outToClient.write(bp.Encode()); + this.outToClient.flush(); + } + + public void _send( byte[] b ) throws Exception { + this.outToClient.write(b); + this.outToClient.flush(); + } + + public Database getDb() { + return db; + } + + private void init() { + this.services = new HashMap<>(); + this.services.put(0, new ConnectionService("")); + this.services.put(1, new AuthService("bnet.protocol.authentication.AuthenticationClient")); // Compute32.Hash("bnet.protocol.authentication.AuthenticationServer") + this.services.put(17, new AccountService("bnet.protocol.account.AccountNotify")); // Compute32.Hash("bnet.protocol.account.AccountService") + this.services.put(4, new PresenceService("bnet.protocol.presence.PresenceService")); // Compute32.Hash("bnet.protocol.presence.PresenceService") + this.services.put(6, new FriendsService("bnet.protocol.friends.FriendsNotify")); // Compute32.Hash("bnet.protocol.friends.FriendsService") + this.services.put(7, new ChannelService("bnet.protocol.channel.Channel")); // Compute32.Hash("bnet.protocol.channel.Channel") + this.services.put(16, new ResourcesService("bnet.protocol.resources.Resources")); + this.services.put(9, new GameUtilitiesService("bnet.protocol.game_utilities.GameUtilities")); + } + + private void processPacket( BattleNetPacket packet ) { + try { + + Service is = this.services.get(Integer.parseUnsignedInt(Integer.toUnsignedString(packet.getHeader().getServiceId()))); + if( is == null ) { + log.error("Can't process weird ServiceId: " + Integer.parseUnsignedInt(Integer.toUnsignedString(packet.getHeader().getServiceId()))); + return; + } + log.info("Incoming: " + is.getClass().getSimpleName() + " / " + packet.getHeader().getMethodId() + " (Token: " + packet.getHeader().getToken() + ")"); + is.process(packet, this); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + + @Override + public void run() { + try { + InputStream is = fromClient.getInputStream(); + outToClient = fromClient.getOutputStream(); + while (true) { + try { + int count; + byte[] buffer = new byte[4096]; // or 4096, or more + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + while ((count = is.read(buffer)) > 0) { + baos.write(buffer, 0, count); + byte[] r = baos.toByteArray(); + BattleNetPacket bp = new BattleNetPacket(); + int offset = 0; + while( offset < r.length ) { + offset += bp.Decode(r, offset, r.length); + processPacket(bp); + } + baos.reset(); + } + baos.close(); + } catch (Exception e) { + e.printStackTrace(); + break; + } + } + } catch ( Exception e ) { + e.printStackTrace(); + } + /* + br.close(); + fromClient.close(); + */ + } +} diff --git a/src/main/java/com/alterdekim/Main.java b/src/main/java/com/alterdekim/Main.java new file mode 100644 index 0000000..c03183f --- /dev/null +++ b/src/main/java/com/alterdekim/Main.java @@ -0,0 +1,41 @@ +package com.alterdekim; + +import com.alterdekim.utils.BattleNetPacket; +import com.alterdekim.utils.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Scanner; + + +public class Main { + + private static final Logger log = LoggerFactory.getLogger(Main.class); + + public static void main(String[] args) { + new Server(1119).startListening(); + /* System.out.println(Util.bytesToHex(exampleProtocol.Test.newBuilder() + .setA(9999) + .setB("testing") + .setC(7777) + .build().toByteArray()));*/ + /* Scanner scanner = new Scanner(System.in); + String s = ""; + while( (s = scanner.nextLine()) != null ) { + try { + byte[] arr = Util.hexStringToByteArray(s); + int offset = 0; + while( offset < arr.length ) { + BattleNetPacket bp = new BattleNetPacket(); + offset += bp.Decode(arr, offset, arr.length); + log.warn( offset + " " + arr.length); + log.info(bp.getHeader().toString()); + log.info("Body.Length = " + bp.getBody().length); + log.info(Util.bytesToHex(bp.getBody())); + } + } catch ( Exception e ) { + e.printStackTrace(); + } + }*/ + } +} \ No newline at end of file diff --git a/src/main/java/com/alterdekim/Server.java b/src/main/java/com/alterdekim/Server.java new file mode 100644 index 0000000..529989b --- /dev/null +++ b/src/main/java/com/alterdekim/Server.java @@ -0,0 +1,96 @@ +package com.alterdekim; + + +import com.alterdekim.db.Database; +import com.alterdekim.login.LoginServer; +import com.alterdekim.utils.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.*; +import java.io.IOException; +import java.util.LinkedList; + +public class Server implements Runnable { + + private static final Logger log = LoggerFactory.getLogger(Server.class); + + private SSLServerSocket serverSocket; + private int portNumber; + private Thread acceptThread; + + private LinkedList connections; + + private Database db; + + public Server(int port) { + portNumber = port; + connections = new LinkedList<>(); + + db = new Database("localhost", 5984, "hs_lobby"); + try { + //SSLServerSocketFactory sslssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); + + serverSocket = (SSLServerSocket) Util.getSocketFactory( + "test.com.crt", + "test.com.crt", + "test.com.key", + "" + ).createServerSocket(portNumber,15); + + + db.start(); + + } catch (Exception e) { + log.error("Init failed: " + e.getMessage()); + } + } + + public void startListening() { + acceptThread = new Thread(this); + acceptThread.start(); + try { + new LoginServer(8080); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + public void stopListening() { + for(Connection c:connections) { + c.stopListeningAndDisconnect(); + } + + try { + serverSocket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + @Override + public void run() { + try { + while(true) { + SSLSocket s = (SSLSocket) serverSocket.accept(); + Connection c = new Connection(s, db); + connections.add(c); + log.info("New Connection Established From "+s.getInetAddress().toString()); + } + } catch(java.net.SocketException e) { + log.error("Listening thread terminated with exception: " + e.getMessage()); + } catch(IOException e) { + log.error(e.getMessage()); + } + } + + public void removeConnection(Connection c) { + connections.remove(c); + } + + public void printConnections() { + log.info("Number of connections "+connections.toString()); + + for(int i=0; i hashes = cr.getBindRequest().getImportedServiceHashList(); + for( Integer hash : hashes ) { + b.addImportedServiceId(hash); + } + List bs = cr.getBindRequest().getExportedServiceList(); + for( Protocol.BoundService s : bs ) { + Set ks = conn.getServices().keySet(); + for( Integer c : ks ) { + Service ss = conn.getServices().get(c); + if( ss != null && ss.getSERVICE_HASH() == s.getHash() ) { + ss.setSERVICE_ID(s.getId()); + break; + } + } + } + + conn._send(Util.hexStringToByteArray("000c08fe011800200028950130000a0c08f4c9ccf30d10c687bcb805120a0889ff5c1092e5a1b9051800220e0a0c0109080a04030507060211102a2e0a2c0d55450000157a72746d1a206ff4fdd5fa5f6d62a278a04403e075d69d734cd4880732dce8edc6a3f528089230a08a95f4cebdcc02422e0a2c0d55450000157a72746d1a20b4bd0f0096a7648de1d19042fb7a79b96c0df48eea3488f498b08ad3d38fb2cc")); + } + + @Override + public void process(BattleNetPacket packet, Connection conn) throws Exception { + switch (packet.getHeader().getMethodId()) { + case 1: + processConnect(packet, conn); + break; + case 5: + // FUCK NODATA + break; + default: + log.error("Can't process weird ConnectionService method: " + packet.getHeader().getMethodId()); + break; + } + } +} diff --git a/src/main/java/com/alterdekim/services/FriendsService.java b/src/main/java/com/alterdekim/services/FriendsService.java new file mode 100644 index 0000000..b838c90 --- /dev/null +++ b/src/main/java/com/alterdekim/services/FriendsService.java @@ -0,0 +1,65 @@ +package com.alterdekim.services; + +import com.alterdekim.Connection; +import com.alterdekim.Protocol; +import com.alterdekim.utils.BattleNetPacket; +import com.alterdekim.utils.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FriendsService extends Service { + + private static final Logger log = LoggerFactory.getLogger(FriendsService.class); + + public FriendsService(String export_name) { + super(export_name); + } + + @Override + public void process(BattleNetPacket packet, Connection conn) throws Exception { + switch (packet.getHeader().getMethodId()) { + case 1: + //Protocol.SubscribeToFriendsRequest subscribeToFriendsRequest = Protocol.SubscribeToFriendsRequest.parseFrom(packet.getBody()); + + if( packet.getHeader().getToken() == 6 ) { + Protocol.SubscribeToFriendsResponse subscribeToFriendsResponse = Protocol.SubscribeToFriendsResponse.newBuilder() + .setMaxFriends(200) + .setMaxReceivedInvitations(200) + .setMaxSentInvitations(200) + .addRole(Protocol.Role.newBuilder() + .setId(1) + .setName("battle_tag_friend") + .build()) + .addRole(Protocol.Role.newBuilder() + .setId(2) + .setName("real_id_friend") + .build()) + .build(); + + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setStatus(0) + .setToken(packet.getHeader().getToken()) + .setSize(subscribeToFriendsResponse.getSerializedSize()) + .setObjectId(0) + .build(); + + conn.send(new BattleNetPacket(header, subscribeToFriendsResponse.toByteArray())); + } else if( packet.getHeader().getToken() == 7 ) { + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setStatus(0) + .setToken(packet.getHeader().getToken()) + .setSize(0) + .setObjectId(0) + .build(); + + conn.send(new BattleNetPacket(header, new byte[0])); + } + break; + default: + log.error("Can't process weird FriendsService method: " + packet.getHeader().getMethodId()); + break; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/alterdekim/services/GameUtilitiesService.java b/src/main/java/com/alterdekim/services/GameUtilitiesService.java new file mode 100644 index 0000000..7ce7a12 --- /dev/null +++ b/src/main/java/com/alterdekim/services/GameUtilitiesService.java @@ -0,0 +1,768 @@ +package com.alterdekim.services; + +import com.alterdekim.Connection; +import com.alterdekim.Protocol; +import com.alterdekim.utils.BattleNetPacket; +import com.alterdekim.utils.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GameUtilitiesService extends Service { + private static final Logger log = LoggerFactory.getLogger(GameUtilitiesService.class); + + public GameUtilitiesService(String export_name) { + super(export_name); + } + + @Override + public void process(BattleNetPacket packet, Connection conn) throws Exception { + switch (packet.getHeader().getMethodId()) { + case 1: + if( packet.getHeader().getToken() == 10 ) { + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(37) + .setStatus(0) + .build(); + conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318BB020A180A0570726F746F120F320D084918AC0220002800300F4078"))); + } else if( packet.getHeader().getToken() == 11 ) { + conn._send(Util.hexStringToByteArray("000d08041001180b200028d70130000a120900000000000000021100000000000000001212094743545702000002116739ab04000000001a1c575443472e5574696c4e6f74696669636174696f6e4d65737361676522130a0c6d6573736167655f74797065120318880222190a0c667261676d656e745f30303012093207800101a801ac0222120a0c6d6573736167655f73697a65120218072a1209000000000000000111000000000000000032120900000000000000011193710e1a000000003a004a0a0889ff5c1092e5a1b90552150a050d93710e1a120c0d6739ab0415474354571802000b08fe01180b2000281d30000a090a026964120318c6020a100a0570726f746f12073205080110af02000d08041001180c200028d70130000a120900000000000000021100000000000000001212094743545702000002116739ab04000000001a1c575443472e5574696c4e6f74696669636174696f6e4d65737361676522130a0c6d6573736167655f74797065120318880222190a0c667261676d656e745f30303012093207800101a801ac0222120a0c6d6573736167655f73697a65120218072a1209000000000000000111000000000000000032120900000000000000011193710e1a000000003a004a0a0889ff5c1092e5a1b90552150a050d93710e1a120c0d6739ab0415474354571802000d08041001180d200028d30130000a120900000000000000021100000000000000001212094743545702000002116739ab04000000001a1c575443472e5574696c4e6f74696669636174696f6e4d65737361676522130a0c6d6573736167655f74797065120318b00222150a0c667261676d656e745f3030301205320308a65622120a0c6d6573736167655f73697a65120218032a1209000000000000000111000000000000000032120900000000000000011193710e1a000000003a004a0a0889ff5c1092e5a1b90552150a050d93710e1a120c0d6739ab0415474354571802")); + } else if( packet.getHeader().getToken() == 15 ) { + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(29) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F120732050801108B02"))); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(16) + .setObjectId(0) + .setSize(213) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222170A0C667261676D656E745F303030120732050801108B0222120A0C6D6573736167655F73697A65120218052A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"))); + } else if( packet.getHeader().getToken() == 16 ) { + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(29) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110CD01"))); + + } else if( packet.getHeader().getToken() == 17 ) { + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(Util.hexStringToByteArray("0A090A026964120318BB020A180A0570726F746F120F320D081E18AC0220002800300F4078").length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318BB020A180A0570726F746F120F320D081E18AC0220002800300F4078"))); + } else if( packet.getHeader().getToken() == 19 ) { + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(29) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F120732050801109402"))); + + byte[] b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222170A0C667261676D656E745F30303012073205080110CD0122120A0C6D6573736167655F73697A65120218052A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222170A0C667261676D656E745F30303012073205080110940222120A0C6D6573736167655F73697A65120218052A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(20) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318B30222120A0C6D6573736167655F73697A65120218002A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(21) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318CB0222140A0C667261676D656E745F30303012043202080122120A0C6D6573736167655F73697A65120218022A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(22) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + } else if (packet.getHeader().getToken() == 20) { + byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110C702"); + + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180B22120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(23) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318E90122160A0C667261676D656E745F303030120632040806100022120A0C6D6573736167655F73697A65120218042A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(24) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + } else if( packet.getHeader().getToken() == 21 ) { + byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110C702"); + + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222170A0C667261676D656E745F30303012073205080110ED0122120A0C6D6573736167655F73697A65120218052A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(25) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180222120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(26) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180322120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(27) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180F22120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(28) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + } else if( packet.getHeader().getToken() == 22 ) { + byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110C702"); + + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901181122120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(29) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180E22120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(30) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318CA0122A4010A0C667261676D656E745F3030301293013290010A2608CFED81FB021200180020FD04280130FF0538004000480050A2A4F2B80560A2A4F2B80570030A2508969787FB0212001800201F280130FF053800400048005095A7F2B8056095A7F2B80570030A1E08A5C20A1206707265636F6E1800201F2805301F380040004800600070000A1F08C9BC0A1206707265636F6E180020FD042805301F3800400048006000700022130A0C6D6573736167655F73697A6512031890012A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(31) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180622120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(32) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + } else if( packet.getHeader().getToken() == 23 ) { + byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110B102"); + + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + } else if( packet.getHeader().getToken() == 24 ) { + byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110C702"); + + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180422120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(33) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901181722120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(34) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901181322120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(35) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180822120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(36) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901181422120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(37) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901181B22120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(38) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180722120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(39) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901181C22120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(40) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318E00122120A0C6D6573736167655F73697A65120218002A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(41) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318CF0122120A0C6D6573736167655F73697A65120218002A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(42) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318E801223A0A0C667261676D656E745F303030122A32280A12180030003800400148015003580070017800121218003000380040014801500358007001780022120A0C6D6573736167655F73697A65120218282A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(43) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318AC0222B2040A0C667261676D656E745F30303012A104329E0452080A066C61756E6368520A0A066E6178785F311000520A0A066E6178785F321000520A0A066E6178785F331000520A0A066E6178785F341000520A0A066E6178785F35100052110A0B6776675F70726F6D6F746510011800520F0A096776675F626567696E10011800520D0A096776675F6172656E61100052090A0562726D5F31100052090A0562726D5F32100052090A0562726D5F33100052090A0562726D5F34100052090A0562726D5F35100052120A0C62726D5F7072655F73616C651001180052130A0F62726D5F6E6F726D616C5F73616C65100052120A0C7467745F7072655F73616C651001180052130A0F7467745F6E6F726D616C5F73616C65100052090A056C6F655F31100052090A056C6F655F32100052090A056C6F655F33100052090A056C6F655F341000521A0A1466656173745F6F665F77696E7465725F7665696C1001180052150A117365745F726F746174696F6E5F32303136100052150A0F6F675F7072655F70757263686173651001180052120A0E6F675F6E6F726D616C5F73616C651000521E0A186170706C655F636861726974795F70726F6D6F5F3230313610011800521E0A186E6178785F6776675F7265616C5F6D6F6E65795F73616C651001180052240A1B7365745F726F746174696F6E5F323031365F667265657061636B73100018D6E3B40252240A1B7365745F726F746174696F6E5F323031365F71756573746C696E65100018D4E3B4025A0410EECB0722130A0C6D6573736167655F73697A651203189E042A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(44) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318840222BFAE010A0C667261676D656E745F30303012ADAE0132A9AE010A0B0A0308A2021028182820010A0F0A0508A202100110900318900320010A0D0A0308F90C10900318900320010A0F0A0508F90C100110C00C18C00C20010A0D0A0308ED0310900318900320010A0F0A0508ED03100110C00C18C00C20010A0B0A0308D9041064186420010A0F0A0508D904100110A00618A00620010A0D0A0308980710900318900320010A0F0A05089807100110C00C18C00C20010A0B0A0308B1081064186420010A0F0A0508B108100110A00618A00620010A0B0A030892051028182820010A0F0A05089205100110900318900320010A0B0A0308F7061064186420010A0F0A0508F706100110A00618A00620010A0B0A0308D2031064186420010A0F0A0508D203100110A00618A00620010A0D0A0308DC0A10900318900320010A0F0A0508DC0A100110C00C18C00C20010A0B0A0308A8081064186420010A0F0A0508A808100110A00618A00620010A0B0A0308DF161028180520000A0E0A0508B4051001109003183220000A0C0A0408BEAE021064181420000A0E0A0508FF03100110A006186420000A0D0A0308B80810C00C18900320000A0B0A0308AE061028180520000A0C0A0408F9AC021028180520000A0E0A0508C613100110A006186420000A0C0A04088AAD021028180520000A0E0A0508E5131001109003183220000A0B0A0308F7041064181420000A0E0A050888071001109003183220000A0E0A0508FB131001109003183220000A0B0A0308E2061028180520000A0D0A0308FA0610C00C18900320000A0E0A0508E1041001109003183220000A0D0A0408FDAF02109003186420000A0E0A0508A8031001109003183220000A0B0A0308F1131064181420000A0E0A0508C104100110A006186420000A0D0A0308FB1410C00C18900320000A0B0A0308F10F1028180520000A0B0A0308C4051064181420000A0E0A0508D50A100110A006186420000A0E0A040820100110801918C00C20000A0B0A0308F9111028180520000A0E0A0508BA131001109003183220000A0D0A0408D3AA02109003186420000A0F0A0608F5AC021001109003183220000A0B0A0308AC011028180520000A0B0A030890031028180520000A0C0A040880AD021064181420000A0E0A0508900F1001109003183220000A0E0A0508DB0F1001109003183220000A0C0A0408FDAE021028180520000A0F0A0508D513100110C00C18900320000A0B0A0308D2131028180520000A0C0A0308CD13109003186420000A0E0A0508A406100110A006186420000A0E0A05089347100110A006186420000A0B0A0308F6081028180520000A0B0A03089E011064181420000A0B0A0308E30F1028180520000A0B0A030888141028180520000A0B0A0308DC061028180520000A100A0608C2AE02100110801918C00C20000A0F0A0608F9AB02100110A006186420000A0F0A0608F9AC021001109003183220000A0E0A0508B906100110A006186420000A100A0608E9AC02100110801918C00C20000A0C0A03088305109003186420000A0B0A0308AF101028180520000A100A060886B102100110801918C00C20000A0C0A0308C10F109003186420000A0B0A0308900F1028180520000A0B0A030895141064181420000A0B0A0308EC051064181420000A0C0A0408DBAF021064181420000A0E0A05089E01100110A006186420000A0F0A0508E115100110C00C18900320000A0D0A0308F80C10C00C18900320000A0B0A03088D031028180520000A0F0A0508A110100110801918C00C20000A0E0A04084B100110C00C18900320000A0B0A030897101028180520000A0B0A0308FB051064181420000A0E0A0508DF02100110A006186420000A0C0A03089D10109003186420000A0E0A040824100110801918C00C20000A0F0A0608E2AF021001109003183220000A0E0A0508A414100110A006186420000A0D0A040856100110A006186420000A0B0A03088E051064181420000A0E0A0508C414100110A006186420000A0E0A0508B303100110A006186420000A0B0A0308900E1028180520000A0F0A05089B03100110801918C00C20000A0B0A0308E2071028180520000A0D0A04088DAE02109003186420000A0E0A0408EFAF0210C00C18900320000A0E0A0508E913100110A006186420000A100A060883AC02100110801918C00C20000A0F0A0608F6AE021001109003183220000A0E0A0508D9131001109003183220000A0E0A0508CB141001109003183220000A0A0A0208711064181420000A0B0A0308D9071028180520000A0F0A0608D9AE02100110A006186420000A0B0A0308F7111064181420000A0F0A0508D706100110801918C00C20000A0E0A05088104100110A006186420000A0C0A040885AD021028180520000A0E0A05089E02100110A006186420000A0B0A030880101028180520000A0E0A05089301100110A006186420000A0F0A0508DB06100110C00C18900320000A0B0A0308980D1064181420000A0F0A060888AC021001109003183220000A0F0A05088305100110C00C18900320000A0B0A0308FD111064181420000A0F0A0508D80F100110C00C18900320000A0E0A05088A03100110A006186420000A0E0A05088F141001109003183220000A0E0A0408A8AB0210C00C18900320000A0B0A0308CC081064181420000A0E0A0508E7161001109003183220000A0F0A0508E002100110C00C18900320000A0F0A0508EF08100110801918C00C20000A0B0A0308F8021028180520000A0E0A0508F60F1001109003183220000A0C0A040889AC021028180520000A0F0A0508A210100110801918C00C20000A0C0A040891AD021064181420000A0B0A0308DC0F1028180520000A0E0A0508B111100110A006186420000A0F0A05089417100110801918C00C20000A100A0608FEAF02100110801918C00C20000A0F0A05089C10100110C00C18900320000A0E0A0508D5161001109003183220000A0D0A04083D1001109003183220000A0F0A0508E10F100110801918C00C20000A0D0A0408C0AF02109003186420000A0D0A0308F60210C00C18900320000A0B0A030897061064181420000A0E0A05088601100110A006186420000A0C0A03088A01109003186420000A0E0A0508B6131001109003183220000A0E0A0508ED01100110A006186420000A0C0A0408A1AC021064181420000A0E0A0508FA0F100110A006186420000A0E0A05089D151001109003183220000A0E0A050882051001109003183220000A0D0A040871100110A006186420000A0F0A06088DAF021001109003183220000A0B0A03088D0F1064181420000A0C0A04089AAC021028180520000A0B0A0308C5081028180520000A0C0A0308B911109003186420000A0E0A0508E103100110A006186420000A0D0A0308DA0F10C00C18900320000A0C0A0408A9AF021028180520000A0B0A0308B8031064181420000A0B0A030899141064181420000A0F0A0608DBAF02100110A006186420000A0C0A0308B206109003186420000A0F0A0608DDAD02100110A006186420000A0B0A030899021064181420000A100A06089FB002100110801918C00C20000A0B0A0308BA011028180520000A0C0A0308B413109003186420000A0D0A03089A1410C00C18900320000A0C0A0308ED08109003186420000A0E0A0408E0AC0210C00C18900320000A0E0A0508B514100110A006186420000A0C0A040883AD021028180520000A0D0A0308E10F10C00C18900320000A0D0A04088DAC02109003186420000A0A0A0208251064181420000A0E0A05089014100110A006186420000A0F0A060893AD02100110A006186420000A0E0A0508B76C1001109003183220000A0E0A0508C9011001109003183220000A0E0A0508EC111001109003183220000A0E0A0508F405100110A006186420000A0B0A0308DD081064181420000A0B0A0308B3131064181420000A100A0608D9AF02100110C00C18900320000A0E0A0508BF141001109003183220000A0E0A0508FB0C1001109003183220000A0B0A020817109003186420000A0F0A0508BD13100110C00C18900320000A0C0A0308A204109003186420000A0E0A0508DC061001109003183220000A0B0A0308CB141028180520000A0B0A0308C4151064181420000A0F0A05088614100110C00C18900320000A0F0A0608B8AC02100110A006186420000A0D0A0308EC1510C00C18900320000A0C0A0308D013109003186420000A0E0A0508DE05100110A006186420000A0E0A0508FF0F1001109003183220000A0F0A0608F7AA021001109003183220000A0B0A0308C9041028180520000A0E0A0508F90E1001109003183220000A0F0A06089AAC021001109003183220000A0E0A0508C1161001109003183220000A0C0A0308D204109003186420000A0B0A030897151028180520000A0E0A0508F7031001109003183220000A0F0A0608E9AB021001109003183220000A0B0A0308BF161028180520000A0E0A0408E6AE0210C00C18900320000A0B0A0308CE061028180520000A0E0A0508C911100110A006186420000A0F0A0508D10F100110C00C18900320000A0B0A030890101028180520000A0F0A0608CEB102100110A006186420000A0F0A0508BA11100110C00C18900320000A0B0A0308D9151064181420000A0B0A0308C4161028180520000A0B0A0308CB051064181420000A0B0A030881101028180520000A0D0A0308C31610C00C18900320000A0E0A05088C0F1001109003183220000A0B0A0308ED091064181420000A0E0A0508C903100110A006186420000A0B0A0308DF151028180520000A0C0A0308EE02109003186420000A0E0A0508E90F1001109003183220000A0E0A0508F946100110A006186420000A0B0A0308E6161028180520000A0E0A0508C314100110A006186420000A0F0A0508B206100110C00C18900320000A100A0608A2AC02100110C00C18900320000A0F0A0508C20E100110C00C18900320000A0F0A0508EC15100110801918C00C20000A0E0A0508920E1001109003183220000A0C0A0408FEAE021028180520000A0F0A0508C50F100110C00C18900320000A0E0A0508BF17100110A006186420000A0B0A0308FF051028180520000A0E0A0508BF161001109003183220000A0E0A0508C80F100110A006186420000A0E0A0508F6061001109003183220000A0C0A03088609109003186420000A0E0A0508F704100110A006186420000A0F0A0508A810100110801918C00C20000A0F0A060886B002100110A006186420000A0E0A050892101001109003183220000A0E0A040809100110801918C00C20000A0B0A0308AD151064181420000A0B0A0308DB031064181420000A0E0A05088508100110A006186420000A0B0A0308B5141064181420000A0B0A0308C8161028180520000A0C0A0308BE0F109003186420000A0B0A030882121028180520000A0B0A0308F7051064181420000A0D0A0308C80310C00C18900320000A0F0A0508F013100110C00C18900320000A0E0A050897011001109003183220000A0E0A0508F4111001109003183220000A0B0A0308F60E1028180520000A0E0A0508D216100110A006186420000A0F0A0508D202100110801918C00C20000A0E0A0508E60F1001109003183220000A0B0A0308C4061028180520000A0C0A0308CE13109003186420000A0F0A0608DAB0021001109003183220000A0C0A0308CF14109003186420000A0B0A0308F6061028180520000A0B0A0308B4051028180520000A0B0A0308D20F1064181420000A0F0A0608B2AD021001109003183220000A0B0A030880041028180520000A0E0A05088A10100110A006186420000A0B0A0308C2081028180520000A0C0A0408B1B0021028180520000A0F0A060883AD021001109003183220000A100A0608A7AD02100110C00C18900320000A0B0A0308CE161028180520000A0E0A050885101001109003183220000A0B0A0308EB131028180520000A0C0A0308C814109003186420000A0E0A0508EE13100110A006186420000A0B0A0308F0111028180520000A0E0A05088910100110A006186420000A0F0A0508CB15100110C00C18900320000A0E0A05088E10100110A006186420000A0B0A0308880E1028180520000A0E0A050880041001109003183220000A0E0A0508C4061001109003183220000A0E0A0508AE031001109003183220000A0B0A0308AE031028180520000A0E0A0508D307100110A006186420000A0E0A0508C2151001109003183220000A0B0A03089A041028180520000A0B0A0308D3071064181420000A0A0A02082D1028180520000A0E0A0508B3011001109003183220000A0E0A05088B141001109003183220000A0D0A0408BDAC02109003186420000A0E0A0508FA051001109003183220000A0E0A05088B10100110A006186420000A0E0A0508CF131001109003183220000A0E0A0508F40F1001109003183220000A0C0A04088CAC021064181420000A0B0A0308A0151064181420000A0E0A0508C415100110A006186420000A0C0A0308C50F109003186420000A0F0A0508B90D100110801918C00C20000A0A0A02085F1064181420000A0E0A0508FD021001109003183220000A0D0A04081E1001109003183220000A0C0A03089609109003186420000A100A06088AB002100110801918C00C20000A0D0A03089D0D10C00C18900320000A0C0A0408B6AC021064181420000A0E0A0508CC161001109003183220000A0F0A05088609100110C00C18900320000A0E0A0508F80F100110A006186420000A0C0A04088BAF021064181420000A0E0A050893141001109003183220000A0B0A0308E90F1028180520000A0F0A0508CE0F100110C00C18900320000A0F0A0608D0AF021001109003183220000A0B0A0308E3111064181420000A0E0A0508A9151001109003183220000A0D0A0408DCAF02109003186420000A0E0A0508D3161001109003183220000A0C0A0408DDAD021064181420000A100A0608C4AB02100110C00C18900320000A0F0A0608F6AA021001109003183220000A0C0A040893AD021064181420000A0E0A0508DF141001109003183220000A0E0A0408CFB10210C00C18900320000A0F0A0608F1AF02100110A006186420000A0E0A0508F00F1001109003183220000A0E0A0408C9AF0210C00C18900320000A0C0A0408F2AF021028180520000A0D0A0308B40310C00C18900320000A0D0A0308841710C00C18900320000A0E0A0508D2131001109003183220000A0E0A0508810E100110A006186420000A0E0A0508FD051001109003183220000A0E0A0508AB021001109003183220000A0F0A0508A615100110C00C18900320000A0E0A0508F90F1001109003183220000A0F0A060886AD021001109003183220000A0F0A0508C001100110C00C18900320000A0E0A0508BE161001109003183220000A0F0A0508A010100110801918C00C20000A0B0A0308C9131064181420000A0E0A050896141001109003183220000A0C0A02080910C00C18900320000A0E0A0508F50F1001109003183220000A0F0A0508C803100110801918C00C20000A0E0A0508E4131001109003183220000A0B0A0308EE0F1064181420000A0D0A0308930F10C00C18900320000A0F0A05089F10100110801918C00C20000A0C0A0308DE14109003186420000A0E0A0508BB161001109003183220000A0B0A0308B7171064181420000A0D0A0308D61110C00C18900320000A0F0A0608F2AF021001109003183220000A0F0A0508AF04100110801918C00C20000A0B0A030895031028180520000A0B0A03088E171064181420000A0D0A0308BA0410C00C18900320000A0E0A0508D1131001109003183220000A0C0A0308A805109003186420000A0F0A05088F06100110C00C18900320000A0B0A0308F9031028180520000A0F0A05088005100110801918C00C20000A0C0A0408F9B0021028180520000A0B0A0308E4151064181420000A0E0A050883091001109003183220000A0E0A0508A015100110A006186420000A0F0A05088710100110C00C18900320000A0C0A0408BBAF021028180520000A0F0A05089007100110801918C00C20000A0C0A040882AD021028180520000A0E0A0508C5081001109003183220000A0E0A0508C1131001109003183220000A0F0A0508B911100110C00C18900320000A0B0A0308DF141028180520000A0E0A050899071001109003183220000A0B0A0308D5161028180520000A0B0A03088C0E1028180520000A0F0A0608B0B002100110A006186420000A0A0A0208161028180520000A0E0A05088C10100110A006186420000A0F0A06088CAC02100110A006186420000A0E0A0508F70F1001109003183220000A0B0A030887041028180520000A0F0A0508ED08100110C00C18900320000A0F0A0508C703100110C00C18900320000A0E0A0508CE061001109003183220000A0B0A03088C101064181420000A0F0A0508A610100110801918C00C20000A0B0A03088D081064181420000A0C0A0308DE16109003186420000A0F0A0508F602100110801918C00C20000A0B0A0308DD041064181420000A0B0A0308ED041028180520000A0E0A0508A2141001109003183220000A0B0A03088F141028180520000A0F0A0508D30F100110801918C00C20000A0E0A0508B717100110A006186420000A0E0A0508C50E1001109003183220000A0A0A02080C1064181420000A0B0A0308C3131028180520000A0E0A0508E006100110A006186420000A0B0A0308BF141028180520000A0B0A0308B76C1028180520000A0B0A030883141064181420000A0B0A03088F091064181420000A100A0608C7AE02100110C00C18900320000A0E0A0508F711100110A006186420000A0B0A0308D2111028180520000A0B0A03088A101064181420000A0A0A0208441028180520000A0E0A05089F031001109003183220000A0E0A0508F70C100110A006186420000A0B0A0308CC161028180520000A0C0A04088F9A021064181420000A0E0A0508B2141001109003183220000A0F0A0508A209100110801918C00C20000A0B0A0308FF031064181420000A0D0A0308840E10C00C18900320000A0B0A0308F20F1064181420000A0B0A030880071064181420000A0E0A0508EE111001109003183220000A0C0A0308E40F109003186420000A0B0A0308DC021028180520000A0D0A0308C20610C00C18900320000A0B0A0308CE031028180520000A0E0A0508DA131001109003183220000A0E0A0508C4131001109003183220000A0E0A0508F9111001109003183220000A0D0A0308A21010C00C18900320000A0E0A0508F0111001109003183220000A0E0A05088F10100110A006186420000A0E0A0508D9071001109003183220000A0B0A0308D4041064181420000A0E0A0508E9011001109003183220000A0B0A030887031064181420000A0E0A05089902100110A006186420000A0F0A0608FEAE021001109003183220000A0C0A03088710109003186420000A0D0A0308D71310C00C18900320000A0B0A0308A4071064181420000A0E0A0508D5031001109003183220000A0B0A0308E50F1064181420000A0F0A0508A614100110C00C18900320000A0E0A0508DE071001109003183220000A0E0A0508CE031001109003183220000A0C0A0408F5AC021028180520000A0C0A0408D4AF021028180520000A0F0A0508FB0E100110801918C00C20000A0C0A0308E915109003186420000A0F0A0508E20F100110C00C18900320000A0F0A0508C814100110C00C18900320000A0E0A0508C40E1001109003183220000A0B0A0308E8011028180520000A0B0A0308FD051028180520000A0E0A05089706100110A006186420000A0E0A0508DF151001109003183220000A0B0A03089F031028180520000A0E0A0408C0AC0210C00C18900320000A0C0A0308D613109003186420000A0E0A0508AD15100110A006186420000A0B0A03088E0E1028180520000A0F0A05088914100110C00C18900320000A0F0A0508A315100110C00C18900320000A0E0A05089310100110A006186420000A0B0A03088B141028180520000A0E0A05088C011001109003183220000A0E0A0508D404100110A006186420000A0C0A02082010C00C18900320000A0E0A0508D1111001109003183220000A0E0A0508AE10100110A006186420000A0C0A0408CEB1021064181420000A0D0A03088B0F10C00C18900320000A0F0A0508A515100110801918C00C20000A0E0A050884101001109003183220000A100A0608B1AF02100110C00C18900320000A0E0A0508C405100110A006186420000A0B0A030893011064181420000A0D0A0308890610C00C18900320000A0B0A030888071028180520000A0E0A0508A705100110A006186420000A0E0A040886B10210C00C18900320000A0B0A030892101028180520000A0E0A0508870E100110A006186420000A0E0A0508D40A1001109003183220000A0C0A0308A615109003186420000A0B0A0308CF161028180520000A0D0A0308A31010C00C18900320000A0C0A0308F508109003186420000A0F0A0508B914100110C00C18900320000A0B0A0308D4051028180520000A0B0A0308B9061064181420000A0E0A0508E507100110A006186420000A0E0A0508E30F1001109003183220000A0E0A0508E20C100110A006186420000A0E0A0508E9121001109003183220000A0C0A0308B702109003186420000A0E0A0508C9041001109003183220000A0B0A0308D8141064181420000A0B0A0308CD161028180520000A100A0608BDAC02100110C00C18900320000A0B0A030895101064181420000A0C0A0408A0AB021064181420000A0E0A05089A021001109003183220000A0E0A0508AE061001109003183220000A0B0A0308DB0A1064181420000A0E0A050890101001109003183220000A0D0A0308FB0810C00C18900320000A0B0A0308CD151028180520000A0B0A0308C3141064181420000A0B0A0308E1031064181420000A0B0A03088D101064181420000A0C0A0308E115109003186420000A0D0A0308D20210C00C18900320000A0C0A0308D10F109003186420000A0E0A05089914100110A006186420000A0E0A0508F20B100110A006186420000A0C0A0408C5AE021028180520000A0B0A030885041064181420000A0B0A0308EA0F1028180520000A0B0A0308AD101028180520000A100A0608A0B002100110801918C00C20000A100A0608E0AC02100110801918C00C20000A0D0A03089F1010C00C18900320000A0B0A0308E8121028180520000A0C0A03089810109003186420000A100A0608D3AE02100110801918C00C20000A0C0A03089A10109003186420000A0E0A050894141001109003183220000A0B0A0308C3011028180520000A0F0A0608CEAE02100110A006186420000A0B0A03089A021028180520000A0B0A030885081064181420000A0F0A05088A01100110C00C18900320000A0B0A0308D2141028180520000A0E0A05088703100110A006186420000A0C0A0408F1AF021064181420000A0D0A0308900710C00C18900320000A0C0A0408D0AF021028180520000A0F0A0508DE14100110C00C18900320000A0F0A0608D4AE02100110A006186420000A0F0A0508B413100110C00C18900320000A100A0608CDAF02100110C00C18900320000A0C0A0408F7AA021028180520000A0E0A0508D50F1001109003183220000A0F0A06088BAF02100110A006186420000A0E0A0508BB13100110A006186420000A0E0A05089403100110A006186420000A0D0A04082D1001109003183220000A0E0A0508CD151001109003183220000A0D0A0308D70610C00C18900320000A0E0A0508B7041001109003183220000A0F0A060880AF021001109003183220000A0B0A0308FC0F1028180520000A0E0A0508EB131001109003183220000A0B0A0308A5091028180520000A0E0A05088D031001109003183220000A0B0A0308DB0F1028180520000A0C0A0408AFAC021064181420000A0B0A0308810A1028180520000A0C0A0308BB03109003186420000A0F0A060884AD021001109003183220000A0E0A0508C509100110A006186420000A0E0A0508E2061001109003183220000A0B0A0308DF021064181420000A0B0A0308C4141064181420000A0E0A0508900E1001109003183220000A0C0A040888AC021028180520000A0F0A060891AD02100110A006186420000A0F0A05088B0F100110801918C00C20000A0B0A0308FB011028180520000A0D0A0308DA0D10C00C18900320000A0E0A0508EB16100110A006186420000A0E0A05089514100110A006186420000A0C0A0308BD13109003186420000A0B0A0308E1041028180520000A0F0A0508C90F100110801918C00C20000A0C0A0408CEAE021064181420000A0E0A0508E8121001109003183220000A0E0A0508EA0F1001109003183220000A0B0A0308F8131064181420000A0F0A05088412100110801918C00C20000A0D0A0408F2AE02109003186420000A0E0A0508BA161001109003183220000A0C0A0408ECAE021028180520000A0B0A0308D60F1028180520000A0E0A05088310100110A006186420000A100A0608A8AB02100110801918C00C20000A0D0A0308FB0E10C00C18900320000A0F0A0608B4AC021001109003183220000A0F0A0508CE13100110C00C18900320000A0C0A03089910109003186420000A0E0A0508FB11100110A006186420000A0F0A05089A10100110C00C18900320000A0C0A0308B914109003186420000A0E0A0508E2151001109003183220000A0C0A0408FBAA021064181420000A0F0A0508A510100110801918C00C20000A0B0A030891101064181420000A0B0A03089B151028180520000A0E0A0508AF101001109003183220000A0F0A0608DBB0021001109003183220000A0E0A0508E50F100110A006186420000A0D0A0308F80810C00C18900320000A0F0A05089002100110C00C18900320000A0F0A0608B8AD021001109003183220000A0E0A0508C3011001109003183220000A0D0A0408161001109003183220000A0B0A0308D2151064181420000A0C0A0308A315109003186420000A0E0A050886061001109003183220000A0B0A03088F0F1028180520000A0E0A05088504100110A006186420000A0D0A0308EF0F10C00C18900320000A0D0A0408A7AD02109003186420000A0E0A050897681001109003183220000A0B0A03088A031064181420000A100A0608C9AF02100110801918C00C20000A0E0A0508F2011001109003183220000A0F0A0508A710100110801918C00C20000A0C0A0308A614109003186420000A0D0A040887AB02109003186420000A0C0A0308C115109003186420000A0B0A0308C60F1064181420000A0B0A0308B0101028180520000A0E0A0508FB05100110A006186420000A0D0A0408B1AF02109003186420000A0F0A060888B002100110A006186420000A0E0A050881051001109003183220000A0B0A0308DE071028180520000A0B0A0308F9461064181420000A0F0A0508850E100110801918C00C20000A0B0A030880121028180520000A0B0A0308D9131028180520000A0D0A0308C50410C00C18900320000A0B0A0308C8131064181420000A0F0A0508C316100110801918C00C20000A0D0A0408CDAF02109003186420000A0E0A0408CBAC0210C00C18900320000A0E0A0508F705100110A006186420000A0E0A0508BA011001109003183220000A0C0A0308C70F109003186420000A0F0A0508D204100110C00C18900320000A0B0A0308FB131028180520000A0E0A0508FA11100110A006186420000A0E0A050895031001109003183220000A0D0A0408A9AD02109003186420000A0B0A0308ED021028180520000A0E0A0508E70F100110A006186420000A0C0A0308C001109003186420000A0C0A040888B0021064181420000A0E0A050896101001109003183220000A0B0A0308E9121028180520000A0D0A0308A61010C00C18900320000A0E0A0508E00F100110A006186420000A0B0A0308D2161064181420000A0B0A0308FA051028180520000A0E0A0508D814100110A006186420000A0B0A0308ED0F1064181420000A0B0A0308F5041064181420000A0B0A0308F70F1028180520000A0E0A0508CD161001109003183220000A0C0A0408F6AA021028180520000A0C0A0308E107109003186420000A0C0A0308DB06109003186420000A0C0A0408F9AB021064181420000A0E0A0508B714100110A006186420000A0B0A03089D021028180520000A0B0A0308C4131028180520000A0B0A0308C9011028180520000A0E0A0508810A1001109003183220000A0B0A0308C9031064181420000A0F0A0608E8AF021001109003183220000A0D0A0308B01510C00C18900320000A0F0A0508F80D100110C00C18900320000A0C0A040888AF021064181420000A0E0A05088D0E1001109003183220000A0F0A06088AAD021001109003183220000A100A0608F2AE02100110C00C18900320000A0B0A03089E021064181420000A0B0A0308FE0D1064181420000A0F0A0508ED16100110C00C18900320000A0F0A0608FFAF02100110A006186420000A0E0A0508BC051001109003183220000A0F0A060880AD02100110A006186420000A0F0A0608F2B002100110A006186420000A0B0A0308BB161028180520000A0C0A0408BEAB021028180520000A0C0A0408CFAF021028180520000A0B0A030882051028180520000A0E0A0508E311100110A006186420000A0F0A0508D80A100110C00C18900320000A0E0A0508D311100110A006186420000A0F0A05088414100110C00C18900320000A0E0A0508E415100110A006186420000A100A0608AEAB02100110801918C00C20000A0B0A0308F50F1028180520000A0B0A030893071064181420000A0F0A0608C4AE021001109003183220000A0C0A04088EAC021064181420000A0C0A0408D191021064181420000A0E0A0508CA08100110A006186420000A0B0A0308810E1064181420000A0F0A05089B10100110C00C18900320000A0F0A0508C20F100110801918C00C20000A0D0A0408F9AA02109003186420000A0E0A05088610100110A006186420000A0E0A0508CF161001109003183220000A0C0A0408D9AE021064181420000A0E0A040883AC0210C00C18900320000A0B0A0308F5131028180520000A0D0A0408FFAD02109003186420000A0D0A0308A41510C00C18900320000A0F0A05089A14100110801918C00C20000A0E0A0508E2081001109003183220000A0E0A0508F713100110A006186420000A0B0A0308DA131028180520000A0E0A0508EA161001109003183220000A0F0A0608BBAF021001109003183220000A0F0A0508F80C100110801918C00C20000A0F0A0508A310100110801918C00C20000A0B0A02084B109003186420000A0A0A0208561064181420000A0F0A0508A314100110801918C00C20000A0E0A0508AB061001109003183220000A100A0608CBAC02100110801918C00C20000A0E0A0508CB13100110A006186420000A0A0A02083D1028180520000A0B0A030886101064181420000A0F0A0508B403100110801918C00C20000A0F0A06088F9A02100110A006186420000A0E0A050881101001109003183220000A0E0A0508CE15100110A006186420000A0B0A0308D50A1064181420000A0D0A0308820E10C00C18900320000A0E0A0508CB0F100110A006186420000A0B0A0308F5051028180520000A0B0A0308D90D1028180520000A0F0A0508FB14100110801918C00C20000A100A0608B0AF02100110C00C18900320000A0B0A0308A7051064181420000A0E0A0408BFAC0210C00C18900320000A0C0A0408CBAF021028180520000A0E0A0408D8AC0210C00C18900320000A0C0A0408FAAA021064181420000A0B0A0308F90F1028180520000A0E0A0508D215100110A006186420000A0E0A050890151001109003183220000A0F0A0608AFAC02100110A006186420000A0B0A0308C0141028180520000A0F0A0508AC04100110801918C00C20000A0F0A0608C5AE021001109003183220000A0B0A0308CD0F1064181420000A0B0A0308E9131064181420000A0D0A03089E1010C00C18900320000A0C0A03089B10109003186420000A0E0A0508F807100110A006186420000A0E0A0508F9031001109003183220000A0B0A0308BA131028180520000A0B0A0308E2111028180520000A0B0A0308C9111064181420000A0B0A0308D3161028180520000A0E0A050882121001109003183220000A0C0A02082410C00C18900320000A0B0A0308FA0C1064181420000A0B0A0308E6111064181420000A0E0A0508B803100110A006186420000A0F0A0508E911100110801918C00C20000A0F0A0508FF0D100110801918C00C20000A0E0A0508940F1001109003183220000A0E0A0508D60A100110A006186420000A0B0A030896141028180520000A0B0A0308C5091064181420000A0C0A040884B0021064181420000A0E0A0508F5161001109003183220000A0F0A0508BC14100110C00C18900320000A100A0608E6AE02100110801918C00C20000A0F0A0508A410100110801918C00C20000A0E0A0508ED09100110A006186420000A0E0A0508C9071001109003183220000A0B0A0308FB0F1028180520000A0D0A04080C100110A006186420000A0E0A05088F0F1001109003183220000A0B0A030894101028180520000A0C0A0308C703109003186420000A0B0A0308EA161028180520000A0F0A0608A0AB02100110A006186420000A0B0A0308FB061064181420000A0D0A0308E81110C00C18900320000A0D0A0408FEAA02109003186420000A0D0A0308EF0810C00C18900320000A100A060892AC02100110C00C18900320000A0E0A0508FB0F1001109003183220000A0D0A03089B0310C00C18900320000A0F0A0508C914100110801918C00C20000A100A060881B102100110C00C18900320000A0E0A0508D015100110A006186420000A0F0A0508EF0F100110801918C00C20000A0C0A0408D2AE021028180520000A0C0A0408C4AE021028180520000A0B0A0308D1111028180520000A0F0A0508E915100110C00C18900320000A0C0A0308F80D109003186420000A0B0A0308C9161028180520000A0F0A060884B002100110A006186420000A0B0A030882161028180520000A0F0A0508BE0F100110C00C18900320000A0E0A0508F20F100110A006186420000A0B0A0308B2141028180520000A0E0A0508C0151001109003183220000A0E0A0508EE0F100110A006186420000A0B0A0308FE071028180520000A0B0A0308CB0F1064181420000A0E0A0508E611100110A006186420000A0D0A040825100110A006186420000A0B0A0308F7131064181420000A0B0A0308A4061064181420000A0D0A0308941710C00C18900320000A0E0A0508A106100110A006186420000A0B0A0308A1061064181420000A0B0A0308E7161028180520000A0C0A04088DAF021028180520000A0D0A0308FF0D10C00C18900320000A100A0608C0AC02100110801918C00C20000A0B0A0308CA081064181420000A0B0A0308A8031028180520000A0F0A0508BB03100110C00C18900320000A0E0A0508FB06100110A006186420000A0F0A05089609100110C00C18900320000A0B0A0308F4111028180520000A0B0A0308C7171028180520000A0B0A0308890F1064181420000A0B0A03088A0E1028180520000A0E0A0508F8021001109003183220000A0C0A03089C10109003186420000A0B0A030891171064181420000A100A0608A7AC02100110C00C18900320000A0B0A0308F70D1028180520000A0E0A0408AEAB0210C00C18900320000A0C0A03089101109003186420000A0D0A04085F100110A006186420000A0F0A0608CFAF021001109003183220000A0D0A0308A81010C00C18900320000A0F0A060889AC021001109003183220000A0C0A0308BA11109003186420000A0E0A0508C308100110A006186420000A0B0A0308F70C1064181420000A0C0A0408FAB0021064181420000A0B0A03088E0F1064181420000A0B0A0308CB131064181420000A0E0A040817100110C00C18900320000A0B0A0308BE161028180520000A0C0A03088B08109003186420000A0B0A0308F80F1064181420000A0B0A0308E6041028180520000A0E0A050887041001109003183220000A0F0A0508BD14100110801918C00C20000A0E0A0508C8161001109003183220000A100A0608A4AC02100110C00C18900320000A0B0A0308E5131028180520000A0E0A0408E9AC0210C00C18900320000A0F0A06089DAC02100110A006186420000A100A0608EFAF02100110801918C00C20000A0B0A0308F4051064181420000A0C0A03088616109003186420000A0B0A030894141028180520000A0D0A0308A40310C00C18900320000A0B0A0308EE131064181420000A0E0A050882101001109003183220000A0D0A0308FC1310C00C18900320000A0B0A0308AE101064181420000A0F0A0508DF0F100110C00C18900320000A0C0A0408F2B0021064181420000A0B0A0308C7131028180520000A0D0A0308800510C00C18900320000A0B0A0308D20A1028180520000A0E0A0508D1141001109003183220000A0E0A0508ED021001109003183220000A0E0A0508DE15100110A006186420000A0B0A0308CF131028180520000A0F0A05089910100110C00C18900320000A0C0A0308950F109003186420000A0B0A0308BF171064181420000A0E0A0508D3131001109003183220000A0D0A0308ED0510C00C18900320000A0B0A03088A061028180520000A0B0A030896101028180520000A0B0A0308E20C1064181420000A0B0A0308C2151028180520000A0F0A0608A1AC02100110A006186420000A0D0A0408C7AE02109003186420000A0E0A0408D3AE0210C00C18900320000A0F0A0508D511100110801918C00C20000A0E0A0508EA041001109003183220000A0E0A0508A5091001109003183220000A0F0A0508EC0F100110C00C18900320000A0B0A0308D40A1028180520000A0F0A0508C115100110C00C18900320000A0B0A0308E00F1064181420000A0C0A04089DAC021064181420000A0B0A03088E101064181420000A0F0A0608FDAE021001109003183220000A0F0A05088417100110801918C00C20000A0B0A0308A2141028180520000A0B0A0308E0061064181420000A0F0A060881B0021001109003183220000A0B0A0308D4111028180520000A0F0A0508EB02100110801918C00C20000A0B0A0308A4141064181420000A0F0A0508D002100110801918C00C20000A0B0A0308F2011028180520000A100A0608A9AD02100110C00C18900320000A0B0A0308C2161028180520000A0E0A050880121001109003183220000A0C0A0308D513109003186420000A0B0A0308DC011064181420000A0C0A040880AF021028180520000A0D0A0308871710C00C18900320000A0E0A0508D60F1001109003183220000A0B0A0308D4081028180520000A0E0A0508FA0C100110A006186420000A0E0A0508C3131001109003183220000A0F0A0508930F100110801918C00C20000A0B0A0308910E1028180520000A0E0A0508E6161001109003183220000A0E0A0508DD0F100110A006186420000A0C0A0308E002109003186420000A0D0A04088AAE02109003186420000A0B0A03089D151028180520000A0E0A0508870F1001109003183220000A0B0A0308C1041064181420000A100A0608F9AA02100110C00C18900320000A0B0A030894031064181420000A0B0A0308C9071028180520000A0E0A0408C4AC0210C00C18900320000A0F0A05088906100110801918C00C20000A0E0A05089B151001109003183220000A0E0A050896061001109003183220000A0F0A0508B808100110801918C00C20000A0D0A0308F21310C00C18900320000A0E0A0508FA0D100110A006186420000A0C0A0308A708109003186420000A0F0A0508BA14100110801918C00C20000A0B0A0308C5031064181420000A0E0A0508FB011001109003183220000A0E0A0508890F100110A006186420000A0B0A0308B1111064181420000A0E0A0508DC01100110A006186420000A0E0A0508F2111001109003183220000A0E0A0508F811100110A006186420000A0E0A0508ED13100110A006186420000A0B0A0308F60F1028180520000A0B0A0308EC111028180520000A0E0A05088810100110A006186420000A0B0A0308E5071064181420000A0E0A0508D20F100110A006186420000A0F0A05089D0D100110801918C00C20000A0E0A0508F311100110A006186420000A0F0A0508C207100110801918C00C20000A0D0A0308EB0210C00C18900320000A0D0A0308AF0410C00C18900320000A0C0A0308F013109003186420000A0B0A030882101028180520000A0F0A0508D301100110C00C18900320000A0C0A0408DDAE021028180520000A0E0A0508C60F100110A006186420000A0E0A05088E0F100110A006186420000A0B0A0308FB111064181420000A0E0A0508DF161001109003183220000A0E0A0508DB03100110A006186420000A0D0A0308CA1410C00C18900320000A0E0A0508D2141001109003183220000A0C0A040886AD021028180520000A0F0A0608D4AF021001109003183220000A0E0A0508D40F100110A006186420000A0B0A0308F3111064181420000A0F0A060885AD021001109003183220000A0E0A0508F60E1001109003183220000A0B0A030899071028180520000A0E0A0508DB0A100110A006186420000A0E0A050897101001109003183220000A0D0A0308BC1510C00C18900320000A0D0A0408A7AC02109003186420000A0F0A0508CF14100110C00C18900320000A0F0A0608F4AF02100110A006186420000A0B0A0308890E1028180520000A0E0A0508C2081001109003183220000A0B0A0308A9151028180520000A0E0A0508DC15100110A006186420000A0E0A0508D915100110A006186420000A0B0A0308B4141064181420000A0C0A0308D90F109003186420000A0B0A0308E2151028180520000A0E0A0508CC08100110A006186420000A0E0A0508F111100110A006186420000A0E0A0508C0141001109003183220000A0E0A0508C7131001109003183220000A0C0A0308DF0F109003186420000A0B0A0308CE151064181420000A0C0A0308F305109003186420000A0B0A0308D8131028180520000A0E0A0508C90D100110A006186420000A0C0A0408FEAC021028180520000A0F0A06088EAC02100110A006186420000A0E0A0508F813100110A006186420000A0F0A0508A805100110C00C18900320000A0E0A0508F504100110A006186420000A0B0A0308F1111064181420000A100A0608AEB002100110C00C18900320000A0B0A0308BC051028180520000A0F0A0508C206100110801918C00C20000A0E0A0508D4111001109003183220000A0B0A0308E9011028180520000A0E0A0508DE0F100110A006186420000A0E0A0508FD0D1001109003183220000A100A0608FDAF02100110C00C18900320000A0B0A0308FF0F1028180520000A0F0A0508F914100110801918C00C20000A0B0A0308C40F1028180520000A0B0A0308CE141064181420000A0B0A0308F8071064181420000A0E0A0508D8131001109003183220000A0E0A0508C503100110A006186420000A0B0A030886061028180520000A0E0A0508D711100110A006186420000A100A0608DCAF02100110C00C18900320000A0F0A0508E811100110801918C00C20000A0C0A0408B8AC021064181420000A0F0A0508FC13100110801918C00C20000A0E0A05089D06100110A006186420000A0C0A0408DAB0021028180520000A0B0A0308EA041028180520000A0B0A0308C3081064181420000A0B0A0308F90E1028180520000A0E0A0508F10F1001109003183220000A0E0A0508C0071001109003183220000A0B0A0308920E1028180520000A0B0A030889101064181420000A0F0A0508950F100110C00C18900320000A0E0A0508E8011001109003183220000A0E0A0508CE14100110A006186420000A0E0A0508EC05100110A006186420000A0B0A0308FD0D1028180520000A0B0A0308CA161028180520000A0F0A0608F7AB021001109003183220000A0E0A0408FEAF0210C00C18900320000A0B0A03088D0E1028180520000A0D0A0308FA1410C00C18900320000A0C0A0308920F109003186420000A0F0A0508C515100110801918C00C20000A0E0A050882161001109003183220000A0E0A05088F0E1001109003183220000A100A0608FFAD02100110C00C18900320000A0E0A0408A0B00210C00C18900320000A0F0A05088717100110801918C00C20000A0F0A0508E107100110C00C18900320000A0B0A0308BA161028180520000A0E0A05089117100110A006186420000A0C0A0308BC14109003186420000A100A06088DAC02100110C00C18900320000A0E0A0508980D100110A006186420000A0C0A0308FD0F109003186420000A100A0608D8AC02100110801918C00C20000A0B0A0308E7111064181420000A0E0A0508E6041001109003183220000A0D0A0408D9AF02109003186420000A0E0A05089E07100110A006186420000A0F0A0508A403100110801918C00C20000A0B0A0308C90D1064181420000A0E0A0508CB16100110A006186420000A0F0A0608FBAA02100110A006186420000A0F0A0508E40F100110C00C18900320000A0E0A050890031001109003183220000A0D0A0408AEB002109003186420000A0C0A0408E8AF021028180520000A0B0A0308CB161064181420000A0F0A0508BF08100110C00C18900320000A0E0A0508C40F1001109003183220000A0E0A0508DD0A1001109003183220000A0E0A05088A061001109003183220000A0E0A0508B2081001109003183220000A0E0A0508CF151001109003183220000A0B0A0308D5081064181420000A0E0A0508DB091001109003183220000A100A0608C0AF02100110C00C18900320000A0D0A0308A11010C00C18900320000A0C0A0308910F109003186420000A0B0A0308E70F1064181420000A0B0A0308F6071064181420000A0B0A030893471064181420000A0F0A0608B1B0021001109003183220000A0B0A030897011028180520000A0C0A0308E20F109003186420000A0F0A0608FAAC021001109003183220000A0F0A0608FBAB02100110A006186420000A0B0A0308ED011064181420000A0E0A0508FE0D100110A006186420000A0C0A0408B9AB021064181420000A0C0A0408B0B0021064181420000A0E0A0508DC0F1001109003183220000A0E0A0508F30F1001109003183220000A0B0A0308870E1064181420000A0D0A0408221001109003183220000A0F0A0608CBAF021001109003183220000A0E0A0508CA161001109003183220000A0B0A0308C8041028180520000A0F0A0508FA0E100110801918C00C20000A0F0A05088B08100110C00C18900320000A0D0A0308851710C00C18900320000A0F0A0608ADB002100110A006186420000A0B0A0308F2051028180520000A0D0A0408A4AC02109003186420000A0B0A0308F50D1028180520000A0D0A0308C51510C00C18900320000A0C0A0408FFAF021064181420000A100A0608C4AC02100110801918C00C20000A0E0A05088E0E1001109003183220000A0B0A0308EB161064181420000A0B0A030883091028180520000A0D0A0308F91410C00C18900320000A0E0A0508890E1001109003183220000A0F0A0508AA06100110C00C18900320000A0D0A0308E91110C00C18900320000A0E0A0508EE01100110A006186420000A0C0A0408DBB0021028180520000A0F0A0508A715100110801918C00C20000A0C0A0408E2AF021028180520000A0E0A050881171001109003183220000A0B0A0308B7141064181420000A0B0A0308F8111064181420000A0F0A0508D613100110C00C18900320000A0D0A0308BA1410C00C18900320000A0B0A030883101064181420000A0F0A0508B702100110C00C18900320000A0B0A0308DE0F1064181420000A0F0A0608A9AF021001109003183220000A0B0A0308FE0C1064181420000A0B0A0308C6131064181420000A0B0A0308E4131028180520000A0F0A0608E0B002100110A006186420000A0F0A0608B6AC02100110A006186420000A100A0608BFAC02100110801918C00C20000A0F0A0508FB08100110801918C00C20000A0E0A0508910E1001109003183220000A0B0A030891141028180520000A0D0A040881B102109003186420000A0B0A0308C0071028180520000A0B0A0308E7071028180520000A0D0A0308C90F10C00C18900320000A0E0A0508A407100110A006186420000A0F0A0508EE02100110C00C18900320000A0B0A0308FD021028180520000A0B0A030886011064181420000A0E0A0508B0101001109003183220000A0B0A030882081064181420000A0B0A0308880F1028180520000A0E0A04089FB00210C00C18900320000A0E0A0508CB05100110A006186420000A0F0A060882B0021001109003183220000A0F0A0508A708100110C00C18900320000A0B0A0308AB061028180520000A0F0A0508FD0F100110C00C18900320000A0B0A0308CF151028180520000A0B0A0308D5031028180520000A0E0A05088E17100110A006186420000A0B0A0308EE061028180520000A0D0A0308841210C00C18900320000A0E0A05088007100110A006186420000A0B0A03089D061064181420000A0B0A03088C021028180520000A100A06088DAE02100110C00C18900320000A0E0A0508D2111001109003183220000A0B0A0308F7031028180520000A0D0A0308B20210C00C18900320000A0B0A03088F0E1028180520000A0B0A0308FA111064181420000A0B0A0308BB131064181420000A0E0A0508ED041001109003183220000A0D0A0308AC0410C00C18900320000A0B0A0308C1161028180520000A0F0A0608FAB002100110A006186420000A0F0A0508C504100110801918C00C20000A0E0A0508FC0F1001109003183220000A100A0608FEAA02100110C00C18900320000A0F0A0608ECAE021001109003183220000A0E0A0508FE0C100110A006186420000A0B0A0308F30C1028180520000A0B0A0308C40E1028180520000A0E0A0508FD11100110A006186420000A0B0A0308D3131028180520000A0D0A0308D51110C00C18900320000A0E0A05089307100110A006186420000A0C0A0408ADB0021064181420000A0B0A030890151028180520000A0E0A05089D021001109003183220000A0F0A06088DAD021001109003183220000A0B0A030881171028180520000A100A0608D3AA02100110C00C18900320000A0E0A0508F5131001109003183220000A0C0A0308BF08109003186420000A0E0A05088D10100110A006186420000A0C0A03088D14109003186420000A0F0A0508B015100110801918C00C20000A0C0A040884AD021028180520000A0B0A0308E2081028180520000A0B0A030893101064181420000A0B0A0308E7131028180520000A0F0A05089D10100110C00C18900320000A0E0A0508D4081001109003183220000A0E0A0508C615100110A006186420000A0B0A0308940F1028180520000A0E0A05088E05100110A006186420000A0E0A0508E8151001109003183220000A0E0A0508CE161001109003183220000A0F0A0508A415100110801918C00C20000A0F0A0608BEAB021001109003183220000A0D0A0308B90D10C00C18900320000A0E0A05088C0E1001109003183220000A0F0A0508C815100110801918C00C20000A0C0A0308CE0F109003186420000A0E0A0508C8041001109003183220000A0F0A0508BA04100110801918C00C20000A0F0A05088517100110801918C00C20000A0E0A0508B8131001109003183220000A0F0A060888AF02100110A006186420000A0B0A0308FA0F1064181420000A0B0A0308ED131064181420000A0B0A0308D1141028180520000A0F0A05088D14100110C00C18900320000A0E0A04088AB00210C00C18900320000A0F0A05089F02100110C00C18900320000A0C0A0308D301109003186420000A0C0A0308C20E109003186420000A0C0A03088614109003186420000A0F0A0508D90F100110C00C18900320000A0E0A0508F50D1001109003183220000A0B0A0308DE051064181420000A0D0A040892AC02109003186420000A0F0A0508F213100110801918C00C20000A0B0A0308E60F1028180520000A0C0A040881B0021028180520000A0F0A0508D611100110801918C00C20000A100A060887AB02100110C00C18900320000A0B0A0308D60A1064181420000A0C0A040882B0021028180520000A0E0A05088D08100110A006186420000A0B0A0308DA041028180520000A0C0A0308D80A109003186420000A0F0A05088C14100110C00C18900320000A0D0A0308A51510C00C18900320000A0F0A0508DE16100110C00C18900320000A0B0A0308F00F1028180520000A0B0A0308AB021028180520000A0C0A03088914109003186420000A0E0A050880101001109003183220000A0B0A0308870F1028180520000A0D0A0408A2AC02109003186420000A0F0A0508ED05100110801918C00C20000A0E0A050897151001109003183220000A0D0A0308A31410C00C18900320000A0B0A0308EB111028180520000A0F0A05088616100110C00C18900320000A0B0A0308BF131028180520000A0F0A0508FA14100110801918C00C20000A0F0A0608F9B0021001109003183220000A100A0608CFB102100110801918C00C20000A0B0A0308B9171064181420000A0D0A0308850E10C00C18900320000A0B0A03088C0F1028180520000A0E0A05089668100110A006186420000A0F0A0508820E100110801918C00C20000A0F0A0608FEAC021001109003183220000A0E0A050891141001109003183220000A0E0A0508F70D1001109003183220000A0F0A0508910F100110C00C18900320000A0B0A03088B101064181420000A0E0A0508B917100110A006186420000A0D0A0308A71010C00C18900320000A0B0A0308DD0A1028180520000A0F0A05089810100110C00C18900320000A0E0A0508F6081001109003183220000A0B0A0308D40F1064181420000A0E0A0508E2071001109003183220000A0E0A0508B313100110A006186420000A0B0A030885101028180520000A0E0A0408C2AE0210C00C18900320000A0D0A0308BD1410C00C18900320000A0E0A0508D508100110A006186420000A0F0A0508840E100110801918C00C20000A0E0A05088C021001109003183220000A0E0A0508DD08100110A006186420000A0E0A05088A0E1001109003183220000A0B0A0308D50F1028180520000A0E0A0508FE071001109003183220000A0F0A0508D713100110801918C00C20000A0E0A0508ED0F100110A006186420000A0B0A03089E071064181420000A0C0A0408C9B0021028180520000A0E0A0508880E1001109003183220000A0E0A05088F09100110A006186420000A0B0A030893141028180520000A0C0A03089F02109003186420000A0B0A030897681028180520000A0C0A03088C14109003186420000A0F0A0508F808100110801918C00C20000A0B0A0308C80F1064181420000A0C0A0308EC0F109003186420000A100A06088AAE02100110C00C18900320000A0D0A0308C20F10C00C18900320000A0C0A03088F06109003186420000A0B0A0308E8151028180520000A0B0A0308F2111028180520000A0E0A0508EE061001109003183220000A0D0A0308A41010C00C18900320000A0F0A05089304100110C00C18900320000A0B0A0308B8131028180520000A0C0A0408B8AD021028180520000A0D0A0308C81510C00C18900320000A0F0A0508F305100110C00C18900320000A0E0A0508D4051001109003183220000A0F0A0508E80F100110801918C00C20000A0E0A0508EB111001109003183220000A0E0A05088D0F100110A006186420000A0E0A0508E2111001109003183220000A0E0A0508FC10100110A006186420000A0F0A0608BEAE02100110A006186420000A0E0A0508C9161001109003183220000A0E0A05089A041001109003183220000A0D0A0308C91410C00C18900320000A0B0A0308B2081028180520000A0D0A0308DA0610C00C18900320000A0F0A0508C10F100110C00C18900320000A0C0A0408D4AE021064181420000A0F0A0508D013100110C00C18900320000A0E0A05088208100110A006186420000A0B0A0308B3011028180520000A0C0A040886B0021064181420000A0A0A0208451028180520000A0B0A0308EE111028180520000A0D0A0408B0AF02109003186420000A0F0A0508DA0F100110801918C00C20000A0B0A0308D0151064181420000A0B0A0308DC151064181420000A0B0A0308C50E1028180520000A0F0A05089E10100110801918C00C20000A0B0A0308EE011064181420000A0E0A0508E7071001109003183220000A0C0A0308ED16109003186420000A0E0A0508D90D1001109003183220000A0B0A0308C1131028180520000A0C0A0308CB15109003186420000A0B0A0308FB0C1028180520000A0D0A0408451001109003183220000A0C0A03088414109003186420000A0C0A0408F4AF021064181420000A0C0A0408FBAB021064181420000A0E0A0508AD101001109003183220000A0E0A0508CD0F100110A006186420000A0E0A0508B414100110A006186420000A0B0A030896061028180520000A0D0A0308D00210C00C18900320000A0E0A0508E7131001109003183220000A0B0A0308B3031064181420000A0D0A0308A20910C00C18900320000A0B0A0308B7041028180520000A0C0A0408E0B0021064181420000A0D0A0308FA0E10C00C18900320000A0E0A0508AC011001109003183220000A0B0A0308F5161028180520000A0F0A0508EB0F100110C00C18900320000A0C0A0308D80F109003186420000A0F0A0508CD13100110C00C18900320000A0D0A0308D30F10C00C18900320000A0B0A03088C011028180520000A0F0A0508B202100110801918C00C20000A0E0A0508880F1001109003183220000A0B0A030881051028180520000A0B0A0308DB091028180520000A0E0A0508DA041001109003183220000A0D0A0408441001109003183220000A0A0A02081E1028180520000A0E0A05088314100110A006186420000A0D0A0308A01010C00C18900320000A0E0A0508FF051001109003183220000A0E0A0508F607100110A006186420000A0F0A0608DDAE021001109003183220000A0B0A0308D3111064181420000A0E0A0508D70F100110A006186420000A0B0A0308FE0F1028180520000A0B0A0308DE151064181420000A0E0A0508F2051001109003183220000A0D0A03088E0410C00C18900320000A0B0A0308B6131028180520000A0C0A0408E9AB021028180520000A0B0A030881041064181420000A0E0A05089510100110A006186420000A0C0A0408B4AC021028180520000A0B0A0308FC101064181420000A0E0A0508C2161001109003183220000A0F0A0508C70F100110C00C18900320000A0D0A0308E80F10C00C18900320000A0F0A0508CA14100110801918C00C20000A0D0A0408C4AB02109003186420000A0E0A0508BF131001109003183220000A0C0A0408B2AD021028180520000A0B0A030890141064181420000A0F0A05089101100110C00C18900320000A0B0A03088F101064181420000A0E0A05089110100110A006186420000A0F0A05088E04100110801918C00C20000A0F0A0608B9AB02100110A006186420000A0C0A0408F6AE021028180520000A0F0A060887AC021001109003183220000A0E0A0508F5051001109003183220000A0B0A0308D7111064181420000A0B0A0308C6151064181420000A0E0A0508F30C1001109003183220000A0D0A0308A71510C00C18900320000A0E0A0508D20A1001109003183220000A0B0A0308DD0F1064181420000A0E0A0508C913100110A006186420000A0C0A0408F7AB021028180520000A0F0A0608D2AE021001109003183220000A0F0A0608D19102100110A006186420000A0E0A0508C7171001109003183220000A0F0A05088707100110C00C18900320000A0C0A03089304109003186420000A0C0A0408C1AB021028180520000A0F0A05089B14100110C00C18900320000A0D0A0308C20710C00C18900320000A0B0A0308F40F1028180520000A0B0A030884101028180520000A0C0A03088707109003186420000A0F0A0508F508100110C00C18900320000A0C0A04088DAD021028180520000A0F0A0608FAAA02100110A006186420000A0A0A0208221028180520000A0B0A0308F30F1028180520000A0E0A050888141001109003183220000A0F0A0608C1AB021001109003183220000A0C0A03089B14109003186420000A0B0A0308F20B1064181420000A0F0A0508BC15100110801918C00C20000A0C0A0308EB0F109003186420000A0E0A0508E711100110A006186420000A0B0A0308D70F1064181420000A0F0A0508FA06100110801918C00C20000A0E0A0508DD04100110A006186420000A0B0A030896681064181420000A0C0A0308AA06109003186420000A0B0A0308D1131028180520000A0E0A0508C813100110A006186420000A0F0A0508A204100110C00C18900320000A0C0A0408FAAC021028180520000A0B0A030888101064181420000A0D0A0308A51010C00C18900320000A0E0A0508DC021001109003183220000A0E0A050894101001109003183220000A0E0A0508C4161001109003183220000A0F0A0608C9B0021001109003183220000A0F0A060882AD021001109003183220000A0C0A040887AC021028180520000A0C0A03089002109003186420000A0F0A0508920F100110C00C18900320000A0B0A0308FA0D1064181420000A0E0A0508F113100110A006186420000A0B0A0308C0151028180520000A0E0A0508FE0F100110900318322000100522140A0C6D6573736167655F73697A65120418A9AE012A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(45) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F747970651203188F0222410A0C667261676D656E745F3030301231322F0A0D08E00F1005181F2016280630121003180A2064281F483C503C5A0D08E00F1005180320002800300065AAAAAABD22120A0C6D6573736167655F73697A651202182F2A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(46) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F747970651203188E0222430A0C667261676D656E745F303030123332310A060801180120000A09080110FD04180120000A060804180620010A09080410FD04180120000A09080410AD0A1805200122120A0C6D6573736167655F73697A65120218312A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(47) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318860222140A0C667261676D656E745F30303012043202080022120A0C6D6573736167655F73697A65120218022A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(48) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F747970651203189602221D0A0C667261676D656E745F303030120D320B0800100018BF843D20D00F22120A0C6D6573736167655F73697A651202180B2A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(49) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318F10122480A0C667261676D656E745F303030123832360A04081818030A0B08013080E08380C0E180180A090802308080808080100A04081418020A04081518010A04080818040A04080A180122120A0C6D6573736167655F73697A65120218362A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(50) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318B20222120A0C6D6573736167655F73697A65120218002A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(51) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F747970651203189B0222F5010A0C667261676D656E745F30303012E40132E1010A1708021001180020462A0D08021A090A0508B706100010020A1708031001180020462A0D08021A090A0508B503100010020A1708041002180C20502A0D08041A090A0508BC08100010020A1708051001180020462A0D08021A090A0508CF06100010020A1708061001180020462A0D08021A090A0508D10A100010020A1708071001180020462A0D08021A090A0508A503100010020A1708081001180020462A0D08021A090A05089309100010020A1708091001180020462A0D08021A090A0508D607100010020A17080A1001180020462A0D08021A090A0508AC071000100222130A0C6D6573736167655F73697A65120318E1012A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(52) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318EE0122E34F0A0C667261676D656E745F30303012D24F32CF4F0AB4010A14393931303030313530323130303030373233383211A4703D0AD7A3FC3F1A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E6172656E6170617373222D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E6172656E61706173732A060802100018013A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E6172656E61706173730AB1010A1439393130303031353033313030303037323338331185EB51B81E8505401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657232222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F73746572322A060801100118023A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F73746572320AB1010A143939313030303135303431303030303732333834117B14AE47E1FA21401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657237222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F73746572372A060801100118073A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F73746572370AB4010A143939313030303135303531303030303732333835113D0AD7A370FD31401A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F737465723135222D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657231352A0608011001180F3A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657231350AB4010A143939313030303135303631303030303732333836111F85EB51B87E46401A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F737465723430222D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657234302A060801100118283A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657234300AC5010A1439393130303031383038303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303157303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030312A0608031001180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030315A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AC5010A1439393130303031383039303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303157303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030322A0608031002180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030325A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AC5010A1439393130303031383130303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303157303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030332A0608031003180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030335A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AC5010A1439393130303031383131303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303157303034222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030342A0608031004180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030345A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AE2010A1439393130303031383132303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303142303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030312A060803100118012A060803100318012A060803100218012A060803100418012A060803100518013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030315A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650ADA010A1439393130303031383133303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303142303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030322A060803100318012A060803100218012A060803100418012A060803100518013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030325A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AD2010A1439393130303031383134303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303142303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030332A060803100318012A060803100418012A060803100518013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030335A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AC5010A1439393130303031393232303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303157303035222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030352A0608031005180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030355A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650ACA010A1439393130303031393233303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303142303034222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030342A060803100418012A060803100518013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030345A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AB6010A143939323030303139323332303030303032313633117B14AE47E1FA21401A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030312228636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030312A070806108C1618012A060805101A18013A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030314A066C61756E63680AB6010A143939323030303139323632303030303032313636117B14AE47E1FA21401A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030332228636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030332A070806108D1618012A060805101B18013A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030334A066C61756E63680AB6010A143939323030303139333232303030303032313732117B14AE47E1FA21401A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030322228636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030322A070806108A1618012A060805101918013A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030324A066C61756E63680A270A143939323030303334353632303030303033373536111F85EB51B87E4F402A0608011001183C0ACB010A1439393230303033343539323030303030333735391A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657232222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F73746572322A060801100918023A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F73746572325A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650ACB010A1439393230303033343632323030303030333736321A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657237222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F73746572372A060801100918073A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F73746572375A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650ACE010A1439393230303033343635323030303030333736351A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657231352230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657231352A0608011009180F3A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657231355A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650ACE010A1439393230303033343638323030303030333736381A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657234302230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657234302A060801100918283A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657234305A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650A380A1439393230303033343731323030303030333737312A0608011009183C5A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AC5010A14393932303031313935323230303030313330343411F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303257303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030312A0608041006180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030314A0F62726D5F6E6F726D616C5F73616C650AC5010A14393932303031313935353230303030313330343711F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303257303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030322A0608041007180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030324A0F62726D5F6E6F726D616C5F73616C650AC5010A14393932303031313935383230303030313330353011F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303257303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030332A0608041008180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030334A0F62726D5F6E6F726D616C5F73616C650AC5010A14393932303031313936313230303030313330353311F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303257303034222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030342A0608041009180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030344A0F62726D5F6E6F726D616C5F73616C650AC5010A14393932303031313936343230303030313330353611F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303257303035222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030352A060804100A180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030354A0F62726D5F6E6F726D616C5F73616C650AE2010A143939323030313139363732303030303133303539113D0AD7A370FD35401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030312A060804100618012A060804100718012A060804100818012A060804100918012A060804100A18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030314A0F62726D5F6E6F726D616C5F73616C650ADA010A143939323030313139373032303030303133303632113D0AD7A370FD31401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030322A060804100718012A060804100818012A060804100918012A060804100A18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030324A0F62726D5F6E6F726D616C5F73616C650AD2010A143939323030313139373332303030303133303635117B14AE47E1FA2B401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030332A060804100818012A060804100918012A060804100A18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030334A0F62726D5F6E6F726D616C5F73616C650ACA010A143939323030313139373632303030303133303638117B14AE47E1FA21401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303034222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030342A060804100918012A060804100A18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030344A0F62726D5F6E6F726D616C5F73616C650AEA010A143939323030313139373932303030303133303731113D0AD7A370FD35401A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E413030324230303170222D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303031702A060804100618012A060804100718012A060804100818012A060804100918012A060804100A18012A060805101218013A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303031704A0C62726D5F7072655F73616C650AD6010A143939323030313539383732303030303137343537111F85EB51B87E46401A31636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F737465723530702231636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F737465723530702A060805101F18012A060801100A18323A31636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F737465723530704A0C7467745F7072655F73616C650ACB010A1439393330303030313836333030303030303138361185EB51B81E8505401A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657232222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F73746572322A060801100A18023A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F73746572324A0F7467745F6E6F726D616C5F73616C650ACB010A143939333030303031383733303030303030313837117B14AE47E1FA21401A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657237222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F73746572372A060801100A18073A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F73746572374A0F7467745F6E6F726D616C5F73616C650ACE010A143939333030303031383833303030303030313838113D0AD7A370FD31401A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657231352230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657231352A060801100A180F3A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657231354A0F7467745F6E6F726D616C5F73616C650ACE010A143939333030303031393033303030303030313930111F85EB51B87E46401A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657234302230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657234302A060801100A18283A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657234304A0F7467745F6E6F726D616C5F73616C650A380A143939333030303031393133303030303030313931111F85EB51B87E4F402A060801100A183C4A0F7467745F6E6F726D616C5F73616C650AC0010A143939333030303333303233303030303032353736117B14AE47E1FA21401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303342303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030332A060807100D18012A060807100E18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030334A056C6F655F310ABB010A14393933303030333330373330303030303235353911F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303357303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030312A060807100B180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030314A056C6F655F310ABB010A14393933303030333330383330303030303235363311F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303357303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030322A060807100C180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030324A056C6F655F310ABB010A14393933303030333330393330303030303235383411F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303357303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030332A060807100D180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030334A056C6F655F310ABB010A14393933303030333331303330303030303235383511F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303357303034222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030342A060807100E180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030344A056C6F655F310AD0010A143939333030303333313133303030303032353836113D0AD7A370FD31401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303342303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030312A060807100B18012A060807100C18012A060807100D18012A060807100E18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030314A056C6F655F310AC8010A143939333030303333313233303030303032353837117B14AE47E1FA2B401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303342303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030322A060807100C18012A060807100D18012A060807100E18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030324A056C6F655F310ACD010A143939333030303434313633303030303034303032113D0AD7A370FD31401A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657231352230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657231352A060801100B180F3A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657231354A0E6F675F6E6F726D616C5F73616C650ACD010A143939333030303434313733303030303034303033111F85EB51B87E46401A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657234302230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657234302A060801100B18283A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657234304A0E6F675F6E6F726D616C5F73616C650A370A143939333030303434313833303030303034313034111F85EB51B87E4F402A060801100B183C4A0E6F675F6E6F726D616C5F73616C650AD9010A143939333030303434373033303030303034303838111F85EB51B87E46401A31636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F737465723530702231636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F737465723530702A060801100B18322A060805102D18013A31636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F737465723530704A0F6F675F7072655F70757263686173650ACA010A1439393330303034343737333030303030343039351185EB51B81E8505401A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657232222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F73746572322A060801100B18023A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F73746572324A0E6F675F6E6F726D616C5F73616C650ACA010A143939333030303434373833303030303034303936117B14AE47E1FA21401A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657237222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F73746572372A060801100B18073A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F73746572374A0E6F675F6E6F726D616C5F73616C650ABA010A1439393330303035303434333030303030343636351A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030342228636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030342A08080610CDB10218013A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030344A186170706C655F636861726974795F70726F6D6F5F323031365002100428D80432040864100132150864100A1A0F7467745F6E6F726D616C5F73616C6532140864100B1A0E6F675F6E6F726D616C5F73616C6538960122130A0C6D6573736167655F73697A65120318CF4F2A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(53) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318BE0222730A0C667261676D656E745F303030126332610A090802120508920210000A0808031204081F10000A090804120508FD0410000A0908051205089F0510000A090806120508AD0610000A090807120508A20710000A090808120508AA0810000A090809120508FD0610000A08080A12040807100022120A0C6D6573736167655F73697A65120218612A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(54) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901181522120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(55) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318EC0122140A0C667261676D656E745F30303012043202080022120A0C6D6573736167655F73697A65120218022A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(56) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C50222120A0C6D6573736167655F73697A65120218002A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(57) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + } else if( packet.getHeader().getToken() == 25 ) { + byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110ED01"); + + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + } else if( packet.getHeader().getToken() == 27 ) { + byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110FD01"); + + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318FC0122A82F0A0C667261676D656E745F30303012972F32942F0A28080210011801200130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A28080310011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A31080F100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A310818100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A31083E100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A31083F100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A28084110011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A31084F100218FFFFFFFFFFFFFFFFFF01280130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A28086110011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A2908D80110011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A2908D90110011801280130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A130801100018FFFFFFFFFFFFFFFFFF01280148010A130804100018FFFFFFFFFFFFFFFFFF01280148010A130805100018FFFFFFFFFFFFFFFFFF01280148010A130806100018FFFFFFFFFFFFFFFFFF01280148010A130807100018FFFFFFFFFFFFFFFFFF01280148010A130808100018FFFFFFFFFFFFFFFFFF01280148010A130809100018FFFFFFFFFFFFFFFFFF01280148010A13080A100018FFFFFFFFFFFFFFFFFF01280148010A13080D100018FFFFFFFFFFFFFFFFFF01280148010A13080E100018FFFFFFFFFFFFFFFFFF01280148010A130810100018FFFFFFFFFFFFFFFFFF01280148010A130811100018FFFFFFFFFFFFFFFFFF01280148010A130812100018FFFFFFFFFFFFFFFFFF01280148010A130813100018FFFFFFFFFFFFFFFFFF01280148010A130814100018FFFFFFFFFFFFFFFFFF01280148010A130815100018FFFFFFFFFFFFFFFFFF01280148010A130816100018FFFFFFFFFFFFFFFFFF01280148010A130817100018FFFFFFFFFFFFFFFFFF01280148010A130819100018FFFFFFFFFFFFFFFFFF01280148010A13081A100018FFFFFFFFFFFFFFFFFF01280148010A13081B100018FFFFFFFFFFFFFFFFFF01280148010A13081C100018FFFFFFFFFFFFFFFFFF01280148010A13081D100018FFFFFFFFFFFFFFFFFF01280148010A13081E100018FFFFFFFFFFFFFFFFFF01280148010A130837100018FFFFFFFFFFFFFFFFFF01280148010A130839100018FFFFFFFFFFFFFFFFFF01280148010A13083A100018FFFFFFFFFFFFFFFFFF01280148010A13083B100018FFFFFFFFFFFFFFFFFF01280148010A13083C100018FFFFFFFFFFFFFFFFFF01280148010A13083D100018FFFFFFFFFFFFFFFFFF01280148010A130842100018FFFFFFFFFFFFFFFFFF01280148010A130843100018FFFFFFFFFFFFFFFFFF01280148010A130844100018FFFFFFFFFFFFFFFFFF01280148010A130846100018FFFFFFFFFFFFFFFFFF01280148010A130847100018FFFFFFFFFFFFFFFFFF01280148010A130848100018FFFFFFFFFFFFFFFFFF01280148010A130849100018FFFFFFFFFFFFFFFFFF01280148010A13084A100018FFFFFFFFFFFFFFFFFF01280148010A13084B100018FFFFFFFFFFFFFFFFFF01280148010A13084C100018FFFFFFFFFFFFFFFFFF01280148010A13084D100018FFFFFFFFFFFFFFFFFF01280148010A13084E100018FFFFFFFFFFFFFFFFFF01280148010A130850100018FFFFFFFFFFFFFFFFFF01280148010A130851100018FFFFFFFFFFFFFFFFFF01280148010A130852100018FFFFFFFFFFFFFFFFFF01280148010A130853100018FFFFFFFFFFFFFFFFFF01280148010A130854100018FFFFFFFFFFFFFFFFFF01280148010A130855100018FFFFFFFFFFFFFFFFFF01280148010A130856100018FFFFFFFFFFFFFFFFFF01280148010A130857100018FFFFFFFFFFFFFFFFFF01280148010A130858100018FFFFFFFFFFFFFFFFFF01280148010A130859100018FFFFFFFFFFFFFFFFFF01280148010A13085A100018FFFFFFFFFFFFFFFFFF01280148010A13085B100018FFFFFFFFFFFFFFFFFF01280148010A13085C100018FFFFFFFFFFFFFFFFFF01280148010A13085D100018FFFFFFFFFFFFFFFFFF01280148010A13085E100018FFFFFFFFFFFFFFFFFF01280148010A13085F100018FFFFFFFFFFFFFFFFFF01280148010A130860100018FFFFFFFFFFFFFFFFFF01280148010A130862100018FFFFFFFFFFFFFFFFFF01280148010A130863100018FFFFFFFFFFFFFFFFFF01280148010A130864100018FFFFFFFFFFFFFFFFFF01280148010A130865100018FFFFFFFFFFFFFFFFFF01280148010A130866100018FFFFFFFFFFFFFFFFFF01280148010A130867100018FFFFFFFFFFFFFFFFFF01280148010A130868100018FFFFFFFFFFFFFFFFFF01280148010A130869100018FFFFFFFFFFFFFFFFFF01280148010A13086A100018FFFFFFFFFFFFFFFFFF01280148010A13086B100018FFFFFFFFFFFFFFFFFF01280148010A13086C100018FFFFFFFFFFFFFFFFFF01280148010A13086D100018FFFFFFFFFFFFFFFFFF01280148010A13086E100018FFFFFFFFFFFFFFFFFF01280148010A130870100018FFFFFFFFFFFFFFFFFF01280148010A130871100018FFFFFFFFFFFFFFFFFF01280148010A130872100018FFFFFFFFFFFFFFFFFF01280148010A130873100018FFFFFFFFFFFFFFFFFF01280148010A130874100018FFFFFFFFFFFFFFFFFF01280148010A130875100018FFFFFFFFFFFFFFFFFF01280148010A130876100018FFFFFFFFFFFFFFFFFF01280148010A130877100018FFFFFFFFFFFFFFFFFF01280148010A130878100018FFFFFFFFFFFFFFFFFF01280148010A130879100018FFFFFFFFFFFFFFFFFF01280148010A13087F100018FFFFFFFFFFFFFFFFFF01280148010A14088001100018FFFFFFFFFFFFFFFFFF01280148010A14088101100018FFFFFFFFFFFFFFFFFF01280148010A14088201100018FFFFFFFFFFFFFFFFFF01280148010A14088301100018FFFFFFFFFFFFFFFFFF01280148010A14088401100018FFFFFFFFFFFFFFFFFF01280148010A14088501100018FFFFFFFFFFFFFFFFFF01280148010A14088601100018FFFFFFFFFFFFFFFFFF01280148010A14088701100018FFFFFFFFFFFFFFFFFF01280148010A14088801100018FFFFFFFFFFFFFFFFFF01280148010A14088901100018FFFFFFFFFFFFFFFFFF01280148010A14088A01100018FFFFFFFFFFFFFFFFFF01280148010A14088B01100018FFFFFFFFFFFFFFFFFF01280148010A14088C01100018FFFFFFFFFFFFFFFFFF01280148010A14088D01100018FFFFFFFFFFFFFFFFFF01280148010A14088E01100018FFFFFFFFFFFFFFFFFF01280148010A14088F01100018FFFFFFFFFFFFFFFFFF01280148010A14089001100018FFFFFFFFFFFFFFFFFF01280148010A14089101100018FFFFFFFFFFFFFFFFFF01280148010A14089201100018FFFFFFFFFFFFFFFFFF01280148010A14089301100018FFFFFFFFFFFFFFFFFF01280148010A14089401100018FFFFFFFFFFFFFFFFFF01280148010A14089501100018FFFFFFFFFFFFFFFFFF01280148010A14089601100018FFFFFFFFFFFFFFFFFF01280148010A14089701100018FFFFFFFFFFFFFFFFFF01280148010A14089801100018FFFFFFFFFFFFFFFFFF01280148010A14089901100018FFFFFFFFFFFFFFFFFF01280148010A14089A01100018FFFFFFFFFFFFFFFFFF01280148010A14089B01100018FFFFFFFFFFFFFFFFFF01280148010A14089C01100018FFFFFFFFFFFFFFFFFF01280148010A14089D01100018FFFFFFFFFFFFFFFFFF01280148010A14089E01100018FFFFFFFFFFFFFFFFFF01280148010A14089F01100018FFFFFFFFFFFFFFFFFF01280148010A1408A001100018FFFFFFFFFFFFFFFFFF01280148010A1408A101100018FFFFFFFFFFFFFFFFFF01280148010A1408A201100018FFFFFFFFFFFFFFFFFF01280148010A1408A301100018FFFFFFFFFFFFFFFFFF01280148010A1408A401100018FFFFFFFFFFFFFFFFFF01280148010A1408A501100018FFFFFFFFFFFFFFFFFF01280148010A1408A601100018FFFFFFFFFFFFFFFFFF01280148010A1408A701100018FFFFFFFFFFFFFFFFFF01280148010A1408A801100018FFFFFFFFFFFFFFFFFF01280148010A1408A901100018FFFFFFFFFFFFFFFFFF01280148010A1408AA01100018FFFFFFFFFFFFFFFFFF01280148010A1408AB01100018FFFFFFFFFFFFFFFFFF01280148010A1408AC01100018FFFFFFFFFFFFFFFFFF01280148010A1408AD01100018FFFFFFFFFFFFFFFFFF01280148010A1408AE01100018FFFFFFFFFFFFFFFFFF01280148010A1408AF01100018FFFFFFFFFFFFFFFFFF01280148010A1408B001100018FFFFFFFFFFFFFFFFFF01280148010A1408B101100018FFFFFFFFFFFFFFFFFF01280148010A1408B201100018FFFFFFFFFFFFFFFFFF01280148010A1408B301100018FFFFFFFFFFFFFFFFFF01280148010A1408B401100018FFFFFFFFFFFFFFFFFF01280148010A1408B501100018FFFFFFFFFFFFFFFFFF01280148010A1408B601100018FFFFFFFFFFFFFFFFFF01280148010A1408B701100018FFFFFFFFFFFFFFFFFF01280148010A1408B801100018FFFFFFFFFFFFFFFFFF01280148010A1408B901100018FFFFFFFFFFFFFFFFFF01280148010A1408BA01100018FFFFFFFFFFFFFFFFFF01280148010A1408BB01100018FFFFFFFFFFFFFFFFFF01280148010A1408BC01100018FFFFFFFFFFFFFFFFFF01280148010A1408BD01100018FFFFFFFFFFFFFFFFFF01280148010A1408BE01100018FFFFFFFFFFFFFFFFFF01280148010A1408BF01100018FFFFFFFFFFFFFFFFFF01280148010A1408C001100018FFFFFFFFFFFFFFFFFF01280148010A1408C101100018FFFFFFFFFFFFFFFFFF01280148010A1408C201100018FFFFFFFFFFFFFFFFFF01280148010A1408C301100018FFFFFFFFFFFFFFFFFF01280148010A1408C401100018FFFFFFFFFFFFFFFFFF01280148010A1408C501100018FFFFFFFFFFFFFFFFFF01280148010A1408C601100018FFFFFFFFFFFFFFFFFF01280148010A1408C701100018FFFFFFFFFFFFFFFFFF01280148010A1408C801100018FFFFFFFFFFFFFFFFFF01280148010A1408C901100018FFFFFFFFFFFFFFFFFF01280148010A1408CA01100018FFFFFFFFFFFFFFFFFF01280148010A1408CB01100018FFFFFFFFFFFFFFFFFF01280148010A1408CD01100018FFFFFFFFFFFFFFFFFF01280148010A1408CE01100018FFFFFFFFFFFFFFFFFF01280148010A1408CF01100018FFFFFFFFFFFFFFFFFF01280148010A1408D001100018FFFFFFFFFFFFFFFFFF01280148010A1408D101100018FFFFFFFFFFFFFFFFFF01280148010A1408D201100018FFFFFFFFFFFFFFFFFF01280148010A1408D301100018FFFFFFFFFFFFFFFFFF01280148010A1408D401100018FFFFFFFFFFFFFFFFFF01280148010A1408D501100018FFFFFFFFFFFFFFFFFF01280148010A1408D701100018FFFFFFFFFFFFFFFFFF01280148010A1408DA01100018FFFFFFFFFFFFFFFFFF01280148010A1408DC01100018FFFFFFFFFFFFFFFFFF01280148010A1408DD01100018FFFFFFFFFFFFFFFFFF01280148010A1408E801100018FFFFFFFFFFFFFFFFFF01280148010A1408E901100018FFFFFFFFFFFFFFFFFF01280148010A1408EA01100018FFFFFFFFFFFFFFFFFF01280148010A1408EB01100018FFFFFFFFFFFFFFFFFF01280148010A1408EC01100018FFFFFFFFFFFFFFFFFF01280148010A1408ED01100018FFFFFFFFFFFFFFFFFF01280148010A1408EE01100018FFFFFFFFFFFFFFFFFF01280148010A1408EF01100018FFFFFFFFFFFFFFFFFF01280148010A14088402100018FFFFFFFFFFFFFFFFFF01280148010A14088502100018FFFFFFFFFFFFFFFFFF01280148010A14088602100018FFFFFFFFFFFFFFFFFF01280148010A14088702100018FFFFFFFFFFFFFFFFFF01280148010A14088802100018FFFFFFFFFFFFFFFFFF01280148010A14088902100018FFFFFFFFFFFFFFFFFF01280148010A14088A02100018FFFFFFFFFFFFFFFFFF01280148010A14088B02100018FFFFFFFFFFFFFFFFFF01280148010A14088C02100018FFFFFFFFFFFFFFFFFF01280148010A14088D02100018FFFFFFFFFFFFFFFFFF01280148010A14088E02100018FFFFFFFFFFFFFFFFFF01280148010A14088F02100018FFFFFFFFFFFFFFFFFF01280148010A14089002100018FFFFFFFFFFFFFFFFFF01280148010A14089102100018FFFFFFFFFFFFFFFFFF01280148010A14089202100018FFFFFFFFFFFFFFFFFF01280148010A14089302100018FFFFFFFFFFFFFFFFFF01280148010A14089402100018FFFFFFFFFFFFFFFFFF01280148010A14089502100018FFFFFFFFFFFFFFFFFF01280148010A14089602100018FFFFFFFFFFFFFFFFFF01280148010A14089702100018FFFFFFFFFFFFFFFFFF01280148010A14089802100018FFFFFFFFFFFFFFFFFF01280148010A14089902100018FFFFFFFFFFFFFFFFFF01280148010A14089A02100018FFFFFFFFFFFFFFFFFF01280148010A14089B02100018FFFFFFFFFFFFFFFFFF01280148010A14089C02100018FFFFFFFFFFFFFFFFFF01280148010A1408A102100018FFFFFFFFFFFFFFFFFF01280148010A1408A202100018FFFFFFFFFFFFFFFFFF01280148010A1408A302100018FFFFFFFFFFFFFFFFFF01280148010A1408A402100018FFFFFFFFFFFFFFFFFF01280148010A1408A502100018FFFFFFFFFFFFFFFFFF01280148010A1408A602100018FFFFFFFFFFFFFFFFFF01280148010A1408A702100018FFFFFFFFFFFFFFFFFF01280148010A1408A802100018FFFFFFFFFFFFFFFFFF01280148010A1408A902100018FFFFFFFFFFFFFFFFFF01280148010A1408AA02100018FFFFFFFFFFFFFFFFFF01280148010A1408AB02100018FFFFFFFFFFFFFFFFFF01280148010A1408AC02100018FFFFFFFFFFFFFFFFFF01280148010A1408AD02100018FFFFFFFFFFFFFFFFFF01280148010A1408AE02100018FFFFFFFFFFFFFFFFFF01280148010A1408AF02100018FFFFFFFFFFFFFFFFFF01280148010A1408B002100018FFFFFFFFFFFFFFFFFF01280148010A1408B102100018FFFFFFFFFFFFFFFFFF01280148010A1408B202100018FFFFFFFFFFFFFFFFFF01280148010A1408B302100018FFFFFFFFFFFFFFFFFF01280148010A1408B402100018FFFFFFFFFFFFFFFFFF01280148010A1408B502100018FFFFFFFFFFFFFFFFFF01280148010A1408B602100018FFFFFFFFFFFFFFFFFF01280148010A1408B702100018FFFFFFFFFFFFFFFFFF01280148010A1408B802100018FFFFFFFFFFFFFFFFFF01280148010A1408B902100018FFFFFFFFFFFFFFFFFF01280148010A1408BA02100018FFFFFFFFFFFFFFFFFF01280148010A1408BB02100018FFFFFFFFFFFFFFFFFF01280148010A1408BC02100018FFFFFFFFFFFFFFFFFF01280148010A1408BD02100018FFFFFFFFFFFFFFFFFF01280148010A1408BE02100018FFFFFFFFFFFFFFFFFF01280148010A1408BF02100018FFFFFFFFFFFFFFFFFF01280148010A1408C002100018FFFFFFFFFFFFFFFFFF01280148010A1408C102100018FFFFFFFFFFFFFFFFFF01280148010A1408C202100018FFFFFFFFFFFFFFFFFF01280148010A1408C302100018FFFFFFFFFFFFFFFFFF01280148010A1408C402100018FFFFFFFFFFFFFFFFFF01280148010A1408C502100018FFFFFFFFFFFFFFFFFF01280148010A1408C602100018FFFFFFFFFFFFFFFFFF01280148010A1408C702100018FFFFFFFFFFFFFFFFFF01280148010A1408C802100018FFFFFFFFFFFFFFFFFF01280148010A1408C902100018FFFFFFFFFFFFFFFFFF01280148010A1408CA02100018FFFFFFFFFFFFFFFFFF01280148010A1408CB02100018FFFFFFFFFFFFFFFFFF01280148010A1408CC02100018FFFFFFFFFFFFFFFFFF01280148010A1408CD02100018FFFFFFFFFFFFFFFFFF01280148010A1408CE02100018FFFFFFFFFFFFFFFFFF01280148010A1408CF02100018FFFFFFFFFFFFFFFFFF01280148010A1408D002100018FFFFFFFFFFFFFFFFFF01280148010A1408D102100018FFFFFFFFFFFFFFFFFF01280148010A1408D202100018FFFFFFFFFFFFFFFFFF012801480122130A0C6D6573736167655F73697A65120318942F2A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(59) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + } else if( packet.getHeader().getToken() == 28 ) { + byte[] b = Util.hexStringToByteArray("0A090A02696412031889020A0F0A0570726F746F1206320408002001"); + + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + } else if( packet.getHeader().getToken() == 29 ) { + byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110C702"); + + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180C22120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(60) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318D40122120A0C6D6573736167655F73697A65120218002A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(61) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + } else if( packet.getHeader().getToken() == 30 ) { + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(0) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, new byte[0])); + + byte[] b = Util.hexStringToByteArray("1252AA064F0A12094743545702000002116739AB040000000012190A170A0A08CE840110021809200012091884B6DAFCCEBDCC02121E0A1C0A0A08CE8401100218082000120E3A0C0D4743545715746174731804"); + + header = Protocol.Header.newBuilder() + .setServiceId(5) + .setMethodId(6) + .setToken(62) + .setObjectId(2) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + } + break; + default: + log.error("Can't process weird GameUtilitiesService method: " + packet.getHeader().getMethodId()); + break; + } + } +} diff --git a/src/main/java/com/alterdekim/services/PresenceService.java b/src/main/java/com/alterdekim/services/PresenceService.java new file mode 100644 index 0000000..4b21099 --- /dev/null +++ b/src/main/java/com/alterdekim/services/PresenceService.java @@ -0,0 +1,211 @@ +package com.alterdekim.services; + +import com.alterdekim.Connection; +import com.alterdekim.Protocol; +import com.alterdekim.exampleProtocol; +import com.alterdekim.utils.BattleNetPacket; +import com.alterdekim.utils.Util; +import com.google.protobuf.AbstractMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.charset.StandardCharsets; + +public class PresenceService extends Service { + + private static final Logger log = LoggerFactory.getLogger(PresenceService.class); + + public PresenceService(String export_name) { + super(export_name); + } + + @Override + public void process(BattleNetPacket packet, Connection conn) throws Exception { + switch (packet.getHeader().getMethodId()) { + case 1: + Protocol.SubscribeRequest subscribeRequest = Protocol.SubscribeRequest.parseFrom(packet.getBody()); + Protocol.Header header = Protocol.Header.newBuilder(packet.getHeader()) + .setServiceId(254) + .setSize(0) + .setObjectId(0) + .setToken(packet.getHeader().getToken()) + .setStatus(0) + .build(); + conn.send(new BattleNetPacket(header, new byte[0])); + + if( subscribeRequest.getObjectId() == 1 ) { + byte[] nickname = "Asmodeus#66666".getBytes(StandardCharsets.US_ASCII); + // byte[] bb = Util.hexStringToByteArray("1A"+Util.intToHex(98+nickname.length)+"AA06"+Util.intToHex(95+nickname.length)+"0A120900000000000000011193710E1A0000000012190A170A0A08CE84011001180620001209189AB1D8B499BCCC02121A0A180A0A08CE8401100118012000120A2A086A6F686E20626F6E12210A1F0A0A08CE840110011804200012102A"+Util.intToHex(nickname.length)+Util.bytesToHex(nickname)); + byte[] bb = Util.hexStringToByteArray("1A71AA066E0A120900000000000000011193710E1A0000000012190A170A0A08CE84011001180620001209189AB1D8B499BCCC02121A0A180A0A08CE8401100118012000120A2A086A6F686E20626F6E12210A1F0A0A08CE840110011804200012"+Util.intToHex(nickname.length+2)+"2A"+Util.intToHex(nickname.length)+Util.bytesToHex(nickname)); + bb[1] = (byte) (98 + nickname.length); + bb[4] = (byte) (95 + nickname.length); + bb[81] = (byte) (18 + nickname.length); + header = Protocol.Header.newBuilder(packet.getHeader()) + .setServiceId(5) + .setMethodId(1) + .setSize(bb.length) + .setObjectId(1) + .setToken(7) + .setStatus(0) + .build(); + // FIRST + /*Protocol.AddNotification addNotification = Protocol.AddNotification.parseFrom(Util.hexStringToByteArray("1A71AA066E0A120900000000000000011193710E1A0000000012190A170A0A08CE84011001180620001209189AB1D8B499BCCC02121A0A180A0A08CE8401100118012000120A2A086A6F686E20626F6E12210A1F0A0A08CE840110011804200012112A0F517569726B794F7263233239363838")); + System.out.println(addNotification);*/ + System.out.println(Util.bytesToHex(bb)); + + conn.send(new BattleNetPacket(header, bb)); + + + } else if( subscribeRequest.getObjectId() == 2 ) { + byte[] nickname = "Asmodeus#66666".getBytes(StandardCharsets.US_ASCII); + byte[] bb = Util.hexStringToByteArray("1ADB01AA06D7010A12094743545702000002116739AB040000000012210A1F0A0A08CE840110021805200012"+Util.intToHex(nickname.length+2)+"2A"+Util.intToHex(nickname.length)+Util.bytesToHex(nickname)+"12240A220A0A08CE8401100218072000121452120900000000000000011193710E1A0000000012190A170A0A08CE84011002180420001209189AB1D8B499BCCC0212120A100A0A08CE84011002180C20001202100012120A100A0A08CE84011002180120001202100012160A140A0A08CE84011002180320001206420457544347121D0A1B0A0A08CE8401100218062000120D2A0B3433373135343139352331"); + bb[1] = (byte) (204 + nickname.length); + bb[5] = (byte) (200 + nickname.length); + bb[28] = (byte) (18 + nickname.length); + bb[30] = (byte) (16 + nickname.length); + header = Protocol.Header.newBuilder(packet.getHeader()) + .setServiceId(5) + .setMethodId(1) + .setSize(bb.length) + .setObjectId(2) + .setToken(8) + .setStatus(0) + .build(); + // SECOND + /*Protocol.AddNotification addNotification = Protocol.AddNotification.parseFrom(Util.hexStringToByteArray("1ADB01AA06D7010A12094743545702000002116739AB040000000012210A1F0A0A08CE840110021805200012112A0F517569726B794F726323323936383812240A220A0A08CE8401100218072000121452120900000000000000011193710E1A0000000012190A170A0A08CE84011002180420001209189AB1D8B499BCCC0212120A100A0A08CE84011002180C20001202100012120A100A0A08CE84011002180120001202100012160A140A0A08CE84011002180320001206420457544347121D0A1B0A0A08CE8401100218062000120D2A0B3433373135343139352331")); + System.out.println(addNotification);*/ + + conn.send(new BattleNetPacket(header, bb)); + + header = Protocol.Header.newBuilder(packet.getHeader()) + .setServiceId(5) + .setMethodId(6) + .setSize(68) + .setObjectId(2) + .setToken(10) + .setStatus(0) + .build(); + conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("1242AA063F0A12094743545702000002116739AB040000000012170A150A0808CE840110021804120918F182EAF5CEBDCC0212100A0E0A0808CE84011002180112021001"))); + + } + break; + case 3: + if( packet.getHeader().getToken() == 12 ) { + /* Protocol.Header header1 = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(0) + .setStatus(0) + .build(); + conn.send(new BattleNetPacket(header1, new byte[0]));*/ + conn._send(Util.hexStringToByteArray("000c08fe011800200028950130000a0c08f4c9ccf30d10c687bcb805120a0889ff5c1092e5a1b9051800220e0a0c0109080a04030507060211102a2e0a2c0d55450000157a72746d1a206ff4fdd5fa5f6d62a278a04403e075d69d734cd4880732dce8edc6a3f528089230a08a95f4cebdcc02422e0a2c0d55450000157a72746d1a20b4bd0f0096a7648de1d19042fb7a79b96c0df48eea3488f498b08ad3d38fb2cc")); + } else if( packet.getHeader().getToken() == 13 ) { + Protocol.Header header1 = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(0) + .setStatus(0) + .build(); + conn.send(new BattleNetPacket(header1, new byte[0])); + + header1 = Protocol.Header.newBuilder() + .setServiceId(5) + .setMethodId(6) + .setToken(14) + .setObjectId(2) + .setSize(Util.hexStringToByteArray("1233AA06300A12094743545702000002116739AB0400000000121A0A180A0A08C786D1BA0510021813120A2A083833383836303830").length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header1, Util.hexStringToByteArray("1233AA06300A12094743545702000002116739AB0400000000121A0A180A0A08C786D1BA0510021813120A2A083833383836303830"))); + } else if( packet.getHeader().getToken() == 18 ) { + Protocol.Header header1 = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(0) + .setStatus(0) + .build(); + conn.send(new BattleNetPacket(header1, new byte[0])); + + byte[] b = Util.hexStringToByteArray("122BAA06280A12094743545702000002116739AB040000000012120A100A0A08C786D1BA051002180112021000"); + + header1 = Protocol.Header.newBuilder() + .setServiceId(5) + .setMethodId(6) + .setToken(17) + .setObjectId(2) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header1, b)); + + b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318CA0222140A0C667261676D656E745F30303012043202080122120A0C6D6573736167655F73697A65120218022A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802"); + + header = Protocol.Header.newBuilder() + .setServiceId(4) + .setMethodId(1) + .setToken(18) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + + } else if( packet.getHeader().getToken() == 26 ) { + Protocol.Header header1 = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(0) + .setStatus(0) + .build(); + conn.send(new BattleNetPacket(header1, new byte[0])); + + byte[] b = Util.hexStringToByteArray("1231AA062E0A12094743545702000002116739AB040000000012180A160A0A08C786D1BA051002181212083206190000190000"); + + header = Protocol.Header.newBuilder() + .setServiceId(5) + .setMethodId(6) + .setToken(58) + .setObjectId(2) + .setSize(b.length) + .setStatus(0) + .build(); + + conn.send(new BattleNetPacket(header, b)); + } else if( packet.getHeader().getToken() == 32 ) { + byte[] b = Util.hexStringToByteArray("0D5545000015737368001A20BEC5292231D7686AF00CE64E0C58CC6E360EA950AAFFAC6A114F03A958E275F3"); + + Protocol.Header header1 = Protocol.Header.newBuilder() + .setServiceId(254) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .setSize(b.length) + .setStatus(0) + .build(); + conn.send(new BattleNetPacket(header1, b)); + + b = Util.hexStringToByteArray("1230AA062D0A12094743545702000002116739AB040000000012170A150A0A08C786D1BA0510021811120732050103000000"); + + header = Protocol.Header.newBuilder() + .setServiceId(5) + .setMethodId(6) + .setToken(63) + .setObjectId(2) + .setSize(b.length) + .setStatus(0) + .build(); + conn.send(new BattleNetPacket(header, b)); + } + break; + default: + log.error("Can't process weird PresenceService method: " + packet.getHeader().getMethodId()); + break; + } + } +} diff --git a/src/main/java/com/alterdekim/services/ResourcesService.java b/src/main/java/com/alterdekim/services/ResourcesService.java new file mode 100644 index 0000000..9588b1b --- /dev/null +++ b/src/main/java/com/alterdekim/services/ResourcesService.java @@ -0,0 +1,44 @@ +package com.alterdekim.services; + +import com.alterdekim.Connection; +import com.alterdekim.Protocol; +import com.alterdekim.utils.BattleNetPacket; +import com.alterdekim.utils.Util; +import com.google.protobuf.ByteString; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ResourcesService extends Service { + + private static final Logger log = LoggerFactory.getLogger(ResourcesService.class); + + public ResourcesService(String export_name) { + super(export_name); + } + + @Override + public void process(BattleNetPacket packet, Connection conn) throws Exception { + switch (packet.getHeader().getMethodId()) { + case 1: + // Protocol.ContentHandleRequest contentHandleRequest = Protocol.ContentHandleRequest.parseFrom(packet.getBody()); + Protocol.ContentHandle contentHandle = Protocol.ContentHandle.newBuilder() + .setRegion(17749) + .setUsage(1885762681) + .setHash(ByteString.copyFrom(Util.hexStringToByteArray("5b2f9b39434a1c4e3f970a76c1e97a8548c95da2ad52a6d37cf9d793dedd887d"))) + .build(); + + Protocol.Header header = Protocol.Header.newBuilder() + .setServiceId(254) + .setSize(contentHandle.getSerializedSize()) + .setStatus(0) + .setToken(packet.getHeader().getToken()) + .setObjectId(0) + .build(); + conn.send(new BattleNetPacket(header, contentHandle.toByteArray())); + break; + default: + log.error("Can't process weird ResourcesService method: " + packet.getHeader().getMethodId()); + break; + } + } +} diff --git a/src/main/java/com/alterdekim/services/Service.java b/src/main/java/com/alterdekim/services/Service.java new file mode 100644 index 0000000..c5e63b8 --- /dev/null +++ b/src/main/java/com/alterdekim/services/Service.java @@ -0,0 +1,29 @@ +package com.alterdekim.services; + +import com.alterdekim.Connection; +import com.alterdekim.utils.BattleNetPacket; +import com.alterdekim.utils.Compute32; + +public abstract class Service { + + private final int SERVICE_HASH; + private int SERVICE_ID; + + public Service( String export_name ) { + this.SERVICE_HASH = Compute32.Hash(export_name); + } + + public int getSERVICEID() { + return this.SERVICE_ID; + } + + public void setSERVICE_ID(int SERVICE_ID) { + this.SERVICE_ID = SERVICE_ID; + } + + public int getSERVICE_HASH() { + return SERVICE_HASH; + } + + public abstract void process(BattleNetPacket packet, Connection conn) throws Exception; +} diff --git a/src/main/java/com/alterdekim/utils/BattleNetErrors.java b/src/main/java/com/alterdekim/utils/BattleNetErrors.java new file mode 100644 index 0000000..e6c90c3 --- /dev/null +++ b/src/main/java/com/alterdekim/utils/BattleNetErrors.java @@ -0,0 +1,1243 @@ +package com.alterdekim.utils; + +public enum BattleNetErrors// : uint +{ + // Token: 0x04000CAF RID: 3247 + ERROR_OK, + // Token: 0x04000CB0 RID: 3248 + ERROR_INTERNAL, + // Token: 0x04000CB1 RID: 3249 + ERROR_TIMED_OUT, + // Token: 0x04000CB2 RID: 3250 + ERROR_DENIED, + // Token: 0x04000CB3 RID: 3251 + ERROR_NOT_EXISTS, + // Token: 0x04000CB4 RID: 3252 + ERROR_NOT_STARTED, + // Token: 0x04000CB5 RID: 3253 + ERROR_IN_PROGRESS, + // Token: 0x04000CB6 RID: 3254 + ERROR_INVALID_ARGS, + // Token: 0x04000CB7 RID: 3255 + ERROR_INVALID_SUBSCRIBER, + // Token: 0x04000CB8 RID: 3256 + ERROR_WAITING_FOR_DEPENDENCY, + // Token: 0x04000CB9 RID: 3257 + ERROR_NO_AUTH, + // Token: 0x04000CBA RID: 3258 + ERROR_PARENTAL_CONTROL_RESTRICTION, + // Token: 0x04000CBB RID: 3259 + ERROR_NO_GAME_ACCOUNT, + // Token: 0x04000CBC RID: 3260 + ERROR_NOT_IMPLEMENTED, + // Token: 0x04000CBD RID: 3261 + ERROR_OBJECT_REMOVED, + // Token: 0x04000CBE RID: 3262 + ERROR_INVALID_ENTITY_ID, + // Token: 0x04000CBF RID: 3263 + ERROR_INVALID_ENTITY_ACCOUNT_ID, + // Token: 0x04000CC0 RID: 3264 + ERROR_INVALID_ENTITY_GAME_ACCOUNT_ID, + // Token: 0x04000CC1 RID: 3265 + ERROR_INVALID_AGENT_ID/* = 19*/, + // Token: 0x04000CC2 RID: 3266 + ERROR_INVALID_TARGET_ID, + // Token: 0x04000CC3 RID: 3267 + ERROR_MODULE_NOT_LOADED, + // Token: 0x04000CC4 RID: 3268 + ERROR_MODULE_NO_ENTRY_POINT, + // Token: 0x04000CC5 RID: 3269 + ERROR_MODULE_SIGNATURE_INCORRECT, + // Token: 0x04000CC6 RID: 3270 + ERROR_MODULE_CREATE_FAILED, + // Token: 0x04000CC7 RID: 3271 + ERROR_NO_PROGRAM, + // Token: 0x04000CC8 RID: 3272 + ERROR_API_NOT_BOUND, + // Token: 0x04000CC9 RID: 3273 + ERROR_API_NOT_READY, + // Token: 0x04000CCA RID: 3274 + ERROR_BAD_VERSION, + // Token: 0x04000CCB RID: 3275 + ERROR_ATTRIBUTE_TOO_MANY_ATTRIBUTES_SET, + // Token: 0x04000CCC RID: 3276 + ERROR_ATTRIBUTE_MAX_SIZE_EXCEEDED, + // Token: 0x04000CCD RID: 3277 + ERROR_ATTRIBUTE_QUOTA_EXCEEDED, + // Token: 0x04000CCE RID: 3278 + ERROR_SERVER_POOL_SERVER_DISAPPEARED, + // Token: 0x04000CCF RID: 3279 + ERROR_SERVER_IS_PRIVATE, + // Token: 0x04000CD0 RID: 3280 + ERROR_DISABLED, + // Token: 0x04000CD1 RID: 3281 + ERROR_MODULE_NOT_FOUND/* = 36*/, + // Token: 0x04000CD2 RID: 3282 + ERROR_SERVER_BUSY, + // Token: 0x04000CD3 RID: 3283 + ERROR_NO_BATTLETAG, + // Token: 0x04000CD4 RID: 3284 + ERROR_INCOMPLETE_PROFANITY_FILTERS, + // Token: 0x04000CD5 RID: 3285 + ERROR_INVALID_REGION, + // Token: 0x04000CD6 RID: 3286 + ERROR_EXISTS_ALREADY, + // Token: 0x04000CD7 RID: 3287 + ERROR_INVALID_SERVER_THUMBPRINT, + // Token: 0x04000CD8 RID: 3288 + ERROR_PHONE_LOCK, + // Token: 0x04000CD9 RID: 3289 + ERROR_SQUELCHED, + // Token: 0x04000CDA RID: 3290 + ERROR_TARGET_OFFLINE, + // Token: 0x04000CDB RID: 3291 + ERROR_BAD_SERVER, + // Token: 0x04000CDC RID: 3292 + ERROR_NO_COOKIE, + // Token: 0x04000CDD RID: 3293 + ERROR_EXPIRED_COOKIE, + // Token: 0x04000CDE RID: 3294 + ERROR_TOKEN_NOT_FOUND, + // Token: 0x04000CDF RID: 3295 + ERROR_GAME_ACCOUNT_NO_TIME, + // Token: 0x04000CE0 RID: 3296 + ERROR_GAME_ACCOUNT_NO_PLAN, + // Token: 0x04000CE1 RID: 3297 + ERROR_GAME_ACCOUNT_BANNED, + // Token: 0x04000CE2 RID: 3298 + ERROR_GAME_ACCOUNT_SUSPENDED, + // Token: 0x04000CE3 RID: 3299 + ERROR_GAME_ACCOUNT_ALREADY_SELECTED, + // Token: 0x04000CE4 RID: 3300 + ERROR_GAME_ACCOUNT_CANCELLED, + // Token: 0x04000CE5 RID: 3301 + ERROR_SESSION_DUPLICATE/**/, + // Token: 0x04000CE6 RID: 3302 + ERROR_SESSION_DISCONNECTED, + // Token: 0x04000CE7 RID: 3303 + ERROR_SESSION_DATA_CHANGED, + // Token: 0x04000CE8 RID: 3304 + ERROR_SESSION_UPDATE_FAILED, + // Token: 0x04000CE9 RID: 3305 + ERROR_SESSION_NOT_FOUND, + // Token: 0x04000CEA RID: 3306 + ERROR_ADMIN_KICK/**/, + // Token: 0x04000CEB RID: 3307 + ERROR_UNPLANNED_MAINTENANCE, + // Token: 0x04000CEC RID: 3308 + ERROR_PLANNED_MAINTENANCE, + // Token: 0x04000CED RID: 3309 + ERROR_SERVICE_FAILURE_ACCOUNT, + // Token: 0x04000CEE RID: 3310 + ERROR_SERVICE_FAILURE_SESSION, + // Token: 0x04000CEF RID: 3311 + ERROR_SERVICE_FAILURE_AUTH, + // Token: 0x04000CF0 RID: 3312 + ERROR_SERVICE_FAILURE_RISK, + // Token: 0x04000CF1 RID: 3313 + ERROR_BAD_PROGRAM, + // Token: 0x04000CF2 RID: 3314 + ERROR_BAD_LOCALE, + // Token: 0x04000CF3 RID: 3315 + ERROR_BAD_PLATFORM, + // Token: 0x04000CF4 RID: 3316 + ERROR_LOCALE_RESTRICTED_LA/**/, + // Token: 0x04000CF5 RID: 3317 + ERROR_LOCALE_RESTRICTED_RU, + // Token: 0x04000CF6 RID: 3318 + ERROR_LOCALE_RESTRICTED_KO, + // Token: 0x04000CF7 RID: 3319 + ERROR_LOCALE_RESTRICTED_TW, + // Token: 0x04000CF8 RID: 3320 + ERROR_LOCALE_RESTRICTED, + // Token: 0x04000CF9 RID: 3321 + ERROR_ACCOUNT_NEEDS_MAINTENANCE, + // Token: 0x04000CFA RID: 3322 + ERROR_MODULE_API_ERROR, + // Token: 0x04000CFB RID: 3323 + ERROR_MODULE_BAD_CACHE_HANDLE, + // Token: 0x04000CFC RID: 3324 + ERROR_MODULE_ALREADY_LOADED, + // Token: 0x04000CFD RID: 3325 + ERROR_NETWORK_BLACKLISTED, + // Token: 0x04000CFE RID: 3326 + ERROR_OK_DEPRECATED/**/, + // Token: 0x04000CFF RID: 3327 + ERROR_LOGON_MODULE_REQUIRED/**/, + // Token: 0x04000D00 RID: 3328 + ERROR_LOGON_MODULE_NOT_CONFIGURED, + // Token: 0x04000D01 RID: 3329 + ERROR_LOGON_MODULE_TIMEOUT, + // Token: 0x04000D02 RID: 3330 + ERROR_LOGON_AGREEMENT_REQUIRED/**/, + // Token: 0x04000D03 RID: 3331 + ERROR_LOGON_AGREEMENT_NOT_CONFIGURED, + // Token: 0x04000D04 RID: 3332 + ERROR_LOGON_INVALID_SERVER_PROOF/**/, + // Token: 0x04000D05 RID: 3333 + ERROR_LOGON_WEB_VERIFY_TIMEOUT, + // Token: 0x04000D06 RID: 3334 + ERROR_CHALLENGE_SMS_TOO_SOON, + // Token: 0x04000D07 RID: 3335 + ERROR_CHALLENGE_SMS_THROTTLED, + // Token: 0x04000D08 RID: 3336 + ERROR_CHALLENGE_SMS_TEMP_OUTAGE, + // Token: 0x04000D09 RID: 3337 + ERROR_CHALLENGE_NO_CHALLENGE, + // Token: 0x04000D0A RID: 3338 + ERROR_CHALLENGE_NOT_PICKED, + // Token: 0x04000D0B RID: 3339 + ERROR_CHALLENGE_ALREADY_PICKED, + // Token: 0x04000D0C RID: 3340 + ERROR_CHALLENGE_IN_PROGRESS, + // Token: 0x04000D0D RID: 3341 + ERROR_RPC_WRITE_FAILED, + // Token: 0x04000D0E RID: 3342 + ERROR_RPC_SERVICE_NOT_BOUND, + // Token: 0x04000D0F RID: 3343 + ERROR_RPC_TOO_MANY_REQUESTS, + // Token: 0x04000D10 RID: 3344 + ERROR_RPC_PEER_UNKNOWN, + // Token: 0x04000D11 RID: 3345 + ERROR_RPC_PEER_UNAVAILABLE, + // Token: 0x04000D12 RID: 3346 + ERROR_RPC_PEER_DISCONNECTED, + // Token: 0x04000D13 RID: 3347 + ERROR_RPC_REQUEST_TIMED_OUT, + // Token: 0x04000D14 RID: 3348 + ERROR_RPC_CONNECTION_TIMED_OUT, + // Token: 0x04000D15 RID: 3349 + ERROR_RPC_MALFORMED_RESPONSE, + // Token: 0x04000D16 RID: 3350 + ERROR_RPC_ACCESS_DENIED, + // Token: 0x04000D17 RID: 3351 + ERROR_RPC_INVALID_SERVICE, + // Token: 0x04000D18 RID: 3352 + ERROR_RPC_INVALID_METHOD, + // Token: 0x04000D19 RID: 3353 + ERROR_RPC_INVALID_OBJECT, + // Token: 0x04000D1A RID: 3354 + ERROR_RPC_MALFORMED_REQUEST, + // Token: 0x04000D1B RID: 3355 + ERROR_RPC_QUOTA_EXCEEDED, + // Token: 0x04000D1C RID: 3356 + ERROR_RPC_NOT_IMPLEMENTED, + // Token: 0x04000D1D RID: 3357 + ERROR_RPC_SERVER_ERROR, + // Token: 0x04000D1E RID: 3358 + ERROR_RPC_SHUTDOWN, + // Token: 0x04000D1F RID: 3359 + ERROR_RPC_DISCONNECT, + // Token: 0x04000D20 RID: 3360 + ERROR_RPC_DISCONNECT_IDLE, + // Token: 0x04000D21 RID: 3361 + ERROR_RPC_PROTOCOL_ERROR, + // Token: 0x04000D22 RID: 3362 + ERROR_RPC_NOT_READY, + // Token: 0x04000D23 RID: 3363 + ERROR_RPC_FORWARD_FAILED, + // Token: 0x04000D24 RID: 3364 + ERROR_RPC_ENCRYPTION_FAILED, + // Token: 0x04000D25 RID: 3365 + ERROR_RPC_INVALID_ADDRESS, + // Token: 0x04000D26 RID: 3366 + ERROR_RPC_METHOD_DISABLED, + // Token: 0x04000D27 RID: 3367 + ERROR_RPC_SHARD_NOT_FOUND, + // Token: 0x04000D28 RID: 3368 + ERROR_PRESENCE_INVALID_FIELD_ID, + // Token: 0x04000D29 RID: 3369 + ERROR_PRESENCE_NO_VALID_SUBSCRIBERS, + // Token: 0x04000D2A RID: 3370 + ERROR_PRESENCE_ALREADY_SUBSCRIBED, + // Token: 0x04000D2B RID: 3371 + ERROR_PRESENCE_CONSUMER_NOT_FOUND, + // Token: 0x04000D2C RID: 3372 + ERROR_PRESENCE_CONSUMER_IS_NULL, + // Token: 0x04000D2D RID: 3373 + ERROR_PRESENCE_TEMPORARY_OUTAGE, + // Token: 0x04000D2E RID: 3374 + ERROR_FRIENDS_TOO_MANY_SENT_INVITATIONS, + // Token: 0x04000D2F RID: 3375 + ERROR_FRIENDS_TOO_MANY_RECEIVED_INVITATIONS, + // Token: 0x04000D30 RID: 3376 + ERROR_FRIENDS_FRIENDSHIP_ALREADY_EXISTS, + // Token: 0x04000D31 RID: 3377 + ERROR_FRIENDS_FRIENDSHIP_DOES_NOT_EXIST, + // Token: 0x04000D32 RID: 3378 + ERROR_FRIENDS_INVITATION_ALREADY_EXISTS, + // Token: 0x04000D33 RID: 3379 + ERROR_FRIENDS_INVALID_INVITATION, + // Token: 0x04000D34 RID: 3380 + ERROR_FRIENDS_ALREADY_SUBSCRIBED, + // Token: 0x04000D35 RID: 3381 + ERROR_FRIENDS_ACCOUNT_BLOCKED, + // Token: 0x04000D36 RID: 3382 + ERROR_FRIENDS_NOT_SUBSCRIBED, + // Token: 0x04000D37 RID: 3383 + ERROR_FRIENDS_INVALID_ROLE_ID, + // Token: 0x04000D38 RID: 3384 + ERROR_FRIENDS_DISABLED_ROLE_ID, + // Token: 0x04000D39 RID: 3385 + ERROR_FRIENDS_NOTE_MAX_SIZE_EXCEEDED, + // Token: 0x04000D3A RID: 3386 + ERROR_FRIENDS_UPDATE_FRIEND_STATE_FAILED, + // Token: 0x04000D3B RID: 3387 + ERROR_FRIENDS_INVITEE_AT_MAX_FRIENDS, + // Token: 0x04000D3C RID: 3388 + ERROR_FRIENDS_INVITER_AT_MAX_FRIENDS, + // Token: 0x04000D3D RID: 3389 + ERROR_WHISPER_UNDELIVERABLE, + // Token: 0x04000D3E RID: 3390 + ERROR_WHISPER_MAX_SIZE_EXCEEDED, + // Token: 0x04000D3F RID: 3391 + ERROR_USER_MANAGER_ALREADY_BLOCKED, + // Token: 0x04000D40 RID: 3392 + ERROR_USER_MANAGER_NOT_BLOCKED, + // Token: 0x04000D41 RID: 3393 + ERROR_USER_MANAGER_CANNOT_BLOCK_SELF, + // Token: 0x04000D42 RID: 3394 + ERROR_USER_MANAGER_ALREADY_REGISTERED, + // Token: 0x04000D43 RID: 3395 + ERROR_USER_MANAGER_NOT_REGISTERED, + // Token: 0x04000D44 RID: 3396 + ERROR_USER_MANAGER_TOO_MANY_BLOCKED_ENTITIES, + // Token: 0x04000D45 RID: 3397 + ERROR_USER_MANAGER_TOO_MANY_IDS, + // Token: 0x04000D46 RID: 3398 + ERROR_USER_MANAGER_BLOCK_RECORD_UNAVAILABLE, + // Token: 0x04000D47 RID: 3399 + ERROR_USER_MANAGER_BLOCK_ENTITY_FAILED, + // Token: 0x04000D48 RID: 3400 + ERROR_USER_MANAGER_UNBLOCK_ENTITY_FAILED, + // Token: 0x04000D49 RID: 3401 + ERROR_USER_MANAGER_CANNOT_BLOCK_FRIEND, + // Token: 0x04000D4A RID: 3402 + ERROR_CHANNEL_FULL, + // Token: 0x04000D4B RID: 3403 + ERROR_CHANNEL_NO_CHANNEL, + // Token: 0x04000D4C RID: 3404 + ERROR_CHANNEL_NOT_MEMBER, + // Token: 0x04000D4D RID: 3405 + ERROR_CHANNEL_ALREADY_MEMBER, + // Token: 0x04000D4E RID: 3406 + ERROR_CHANNEL_NO_SUCH_MEMBER, + // Token: 0x04000D4F RID: 3407 + ERROR_CHANNEL_INVALID_CHANNEL_ID, + // Token: 0x04000D50 RID: 3408 + ERROR_CHANNEL_NO_SUCH_INVITATION, + // Token: 0x04000D51 RID: 3409 + ERROR_CHANNEL_TOO_MANY_INVITATIONS, + // Token: 0x04000D52 RID: 3410 + ERROR_CHANNEL_INVITATION_ALREADY_EXISTS, + // Token: 0x04000D53 RID: 3411 + ERROR_CHANNEL_INVALID_CHANNEL_SIZE, + // Token: 0x04000D54 RID: 3412 + ERROR_CHANNEL_INVALID_ROLE_ID, + // Token: 0x04000D55 RID: 3413 + ERROR_CHANNEL_ROLE_NOT_ASSIGNABLE, + // Token: 0x04000D56 RID: 3414 + ERROR_CHANNEL_INSUFFICIENT_PRIVILEGES, + // Token: 0x04000D57 RID: 3415 + ERROR_CHANNEL_INSUFFICIENT_PRIVACY_LEVEL, + // Token: 0x04000D58 RID: 3416 + ERROR_CHANNEL_INVALID_PRIVACY_LEVEL, + // Token: 0x04000D59 RID: 3417 + ERROR_CHANNEL_TOO_MANY_CHANNELS_JOINED, + // Token: 0x04000D5A RID: 3418 + ERROR_CHANNEL_INVITATION_ALREADY_SUBSCRIBED, + // Token: 0x04000D5B RID: 3419 + ERROR_CHANNEL_INVALID_CHANNEL_DELEGATE, + // Token: 0x04000D5C RID: 3420 + ERROR_CHANNEL_SLOT_ALREADY_RESERVED, + // Token: 0x04000D5D RID: 3421 + ERROR_CHANNEL_SLOT_NOT_RESERVED, + // Token: 0x04000D5E RID: 3422 + ERROR_CHANNEL_NO_RESERVED_SLOTS_AVAILABLE, + // Token: 0x04000D5F RID: 3423 + ERROR_CHANNEL_INVALID_ROLE_SET, + // Token: 0x04000D60 RID: 3424 + ERROR_CHANNEL_REQUIRE_FRIEND_VALIDATION, + // Token: 0x04000D61 RID: 3425 + ERROR_CHANNEL_MEMBER_OFFLINE, + // Token: 0x04000D62 RID: 3426 + ERROR_CHANNEL_RECEIVED_TOO_MANY_INVITATIONS, + // Token: 0x04000D63 RID: 3427 + ERROR_CHANNEL_INVITATION_INVALID_GAME_ACCOUNT_SELECTED, + // Token: 0x04000D64 RID: 3428 + ERROR_CHANNEL_UNREACHABLE, + // Token: 0x04000D65 RID: 3429 + ERROR_CHANNEL_INVITATION_NOT_SUBSCRIBED, + // Token: 0x04000D66 RID: 3430 + ERROR_CHANNEL_INVALID_MESSAGE_SIZE, + // Token: 0x04000D67 RID: 3431 + ERROR_CHANNEL_MAX_MESSAGE_SIZE_EXCEEDED, + // Token: 0x04000D68 RID: 3432 + ERROR_CHANNEL_CONFIG_NOT_FOUND, + // Token: 0x04000D69 RID: 3433 + ERROR_CHANNEL_INVALID_CHANNEL_TYPE, + // Token: 0x04000D6A RID: 3434 + ERROR_LOCAL_STORAGE_FILE_OPEN_ERROR, + // Token: 0x04000D6B RID: 3435 + ERROR_LOCAL_STORAGE_FILE_CREATE_ERROR, + // Token: 0x04000D6C RID: 3436 + ERROR_LOCAL_STORAGE_FILE_READ_ERROR, + // Token: 0x04000D6D RID: 3437 + ERROR_LOCAL_STORAGE_FILE_WRITE_ERROR, + // Token: 0x04000D6E RID: 3438 + ERROR_LOCAL_STORAGE_FILE_DELETE_ERROR, + // Token: 0x04000D6F RID: 3439 + ERROR_LOCAL_STORAGE_FILE_COPY_ERROR, + // Token: 0x04000D70 RID: 3440 + ERROR_LOCAL_STORAGE_FILE_DECOMPRESS_ERROR, + // Token: 0x04000D71 RID: 3441 + ERROR_LOCAL_STORAGE_FILE_HASH_MISMATCH, + // Token: 0x04000D72 RID: 3442 + ERROR_LOCAL_STORAGE_FILE_USAGE_MISMATCH, + // Token: 0x04000D73 RID: 3443 + ERROR_LOCAL_STORAGE_DATABASE_INIT_ERROR, + // Token: 0x04000D74 RID: 3444 + ERROR_LOCAL_STORAGE_DATABASE_NEEDS_REBUILD, + // Token: 0x04000D75 RID: 3445 + ERROR_LOCAL_STORAGE_DATABASE_INSERT_ERROR, + // Token: 0x04000D76 RID: 3446 + ERROR_LOCAL_STORAGE_DATABASE_LOOKUP_ERROR, + // Token: 0x04000D77 RID: 3447 + ERROR_LOCAL_STORAGE_DATABASE_UPDATE_ERROR, + // Token: 0x04000D78 RID: 3448 + ERROR_LOCAL_STORAGE_DATABASE_DELETE_ERROR, + // Token: 0x04000D79 RID: 3449 + ERROR_LOCAL_STORAGE_DATABASE_SHRINK_ERROR, + // Token: 0x04000D7A RID: 3450 + ERROR_LOCAL_STORAGE_CACHE_CRAWL_ERROR, + // Token: 0x04000D7B RID: 3451 + ERROR_LOCAL_STORAGE_DATABASE_INDEX_TRIGGER_ERROR, + // Token: 0x04000D7C RID: 3452 + ERROR_LOCAL_STORAGE_DATABASE_REBUILD_IN_PROGRESS, + // Token: 0x04000D7D RID: 3453 + ERROR_LOCAL_STORAGE_OK_BUT_NOT_IN_CACHE, + // Token: 0x04000D7E RID: 3454 + ERROR_LOCAL_STORAGE_FILE_RENAME_ERROR, + // Token: 0x04000D7F RID: 3455 + ERROR_LOCAL_STORAGE_DATABASE_REBUILD_INTERRUPTED, + // Token: 0x04000D80 RID: 3456 + ERROR_LOCAL_STORAGE_DATABASE_NOT_INITIALIZED, + // Token: 0x04000D81 RID: 3457 + ERROR_LOCAL_STORAGE_DIRECTORY_CREATE_ERROR, + // Token: 0x04000D82 RID: 3458 + ERROR_LOCAL_STORAGE_FILEKEY_NOT_FOUND, + // Token: 0x04000D83 RID: 3459 + ERROR_REGISTRY_CREATE_KEY_ERROR, + // Token: 0x04000D84 RID: 3460 + ERROR_REGISTRY_OPEN_KEY_ERROR, + // Token: 0x04000D85 RID: 3461 + ERROR_REGISTRY_READ_ERROR, + // Token: 0x04000D86 RID: 3462 + ERROR_REGISTRY_WRITE_ERROR, + // Token: 0x04000D87 RID: 3463 + ERROR_REGISTRY_TYPE_ERROR, + // Token: 0x04000D88 RID: 3464 + ERROR_REGISTRY_DELETE_ERROR, + // Token: 0x04000D89 RID: 3465 + ERROR_REGISTRY_ENCRYPT_ERROR, + // Token: 0x04000D8A RID: 3466 + ERROR_REGISTRY_DECRYPT_ERROR, + // Token: 0x04000D8B RID: 3467 + ERROR_REGISTRY_KEY_SIZE_ERROR, + // Token: 0x04000D8C RID: 3468 + ERROR_REGISTRY_VALUE_SIZE_ERROR, + // Token: 0x04000D8D RID: 3469 + ERROR_REGISTRY_NOT_FOUND, + // Token: 0x04000D8E RID: 3470 + ERROR_REGISTRY_MALFORMED_STRING, + // Token: 0x04000D8F RID: 3471 + ERROR_ACCOUNT_MISSING_CONFIG, + // Token: 0x04000D90 RID: 3472 + ERROR_ACCOUNT_DATA_NOT_FOUND, + // Token: 0x04000D91 RID: 3473 + ERROR_ACCOUNT_ALREADY_SUBSCRIBED, + // Token: 0x04000D92 RID: 3474 + ERROR_ACCOUNT_NOT_SUBSCRIBED, + // Token: 0x04000D93 RID: 3475 + ERROR_ACCOUNT_FAILED_TO_PARSE_TIMEZONE_DATA, + // Token: 0x04000D94 RID: 3476 + ERROR_ACCOUNT_LOAD_FAILED, + // Token: 0x04000D95 RID: 3477 + ERROR_ACCOUNT_LOAD_CANCELLED, + // Token: 0x04000D96 RID: 3478 + ERROR_ACCOUNT_DATABASE_INVALIDATE_FAILED, + // Token: 0x04000D97 RID: 3479 + ERROR_ACCOUNT_CACHE_INVALIDATE_FAILED, + // Token: 0x04000D98 RID: 3480 + ERROR_ACCOUNT_SUBSCRIPTION_PENDING, + // Token: 0x04000D99 RID: 3481 + ERROR_ACCOUNT_UNKNOWN_REGION, + // Token: 0x04000D9A RID: 3482 + ERROR_ACCOUNT_DATA_FAILED_TO_PARSE, + // Token: 0x04000D9B RID: 3483 + ERROR_DATABASE_BINDING_COUNT_MISMATCH, + // Token: 0x04000D9C RID: 3484 + ERROR_DATABASE_BINDING_PARSE_FAIL, + // Token: 0x04000D9D RID: 3485 + ERROR_DATABASE_RESULTSET_COLUMNS_MISMATCH, + // Token: 0x04000D9E RID: 3486 + ERROR_DATABASE_DEADLOCK, + // Token: 0x04000D9F RID: 3487 + ERROR_DATABASE_DUPLICATE_KEY, + // Token: 0x04000DA0 RID: 3488 + ERROR_DATABASE_CANNOT_CONNECT, + // Token: 0x04000DA1 RID: 3489 + ERROR_DATABASE_STATEMENT_FAILED, + // Token: 0x04000DA2 RID: 3490 + ERROR_DATABASE_TRANSACTION_NOT_STARTED, + // Token: 0x04000DA3 RID: 3491 + ERROR_DATABASE_TRANSACTION_NOT_ENDED, + // Token: 0x04000DA4 RID: 3492 + ERROR_DATABASE_TRANSACTION_LEAK, + // Token: 0x04000DA5 RID: 3493 + ERROR_DATABASE_TRANSACTION_STATE_BAD, + // Token: 0x04000DA6 RID: 3494 + ERROR_DATABASE_SERVER_GONE, + // Token: 0x04000DA7 RID: 3495 + ERROR_DATABASE_BINDING_NOT_NULLABLE, + // Token: 0x04000DA8 RID: 3496 + ERROR_DATABASE_BINDING_INVALID_INTEGER, + // Token: 0x04000DA9 RID: 3497 + ERROR_DATABASE_BINDING_INVALID_FLOAT, + // Token: 0x04000DAA RID: 3498 + ERROR_DATABASE_BINDING_INVALID_TEMPORAL, + // Token: 0x04000DAB RID: 3499 + ERROR_DATABASE_BINDING_INVALID_PROTOBUF, + // Token: 0x04000DAC RID: 3500 + ERROR_PARTY_INVALID_PARTY_ID, + // Token: 0x04000DAD RID: 3501 + ERROR_PARTY_ALREADY_IN_PARTY, + // Token: 0x04000DAE RID: 3502 + ERROR_PARTY_NOT_IN_PARTY, + // Token: 0x04000DAF RID: 3503 + ERROR_PARTY_INVITATION_UNDELIVERABLE, + // Token: 0x04000DB0 RID: 3504 + ERROR_PARTY_INVITATION_ALREADY_EXISTS, + // Token: 0x04000DB1 RID: 3505 + ERROR_PARTY_TOO_MANY_PARTY_INVITATIONS, + // Token: 0x04000DB2 RID: 3506 + ERROR_PARTY_TOO_MANY_RECEIVED_INVITATIONS, + // Token: 0x04000DB3 RID: 3507 + ERROR_PARTY_NO_SUCH_TYPE, + // Token: 0x04000DB4 RID: 3508 + ERROR_GAMES_NO_SUCH_FACTORY, + // Token: 0x04000DB5 RID: 3509 + ERROR_GAMES_NO_SUCH_GAME, + // Token: 0x04000DB6 RID: 3510 + ERROR_GAMES_NO_SUCH_REQUEST, + // Token: 0x04000DB7 RID: 3511 + ERROR_GAMES_NO_SUCH_PARTY_MEMBER, + // Token: 0x04000DB8 RID: 3512 + ERROR_RESOURCES_OFFLINE, + // Token: 0x04000DB9 RID: 3513 + ERROR_GAME_SERVER_CREATE_GAME_REFUSED, + // Token: 0x04000DBA RID: 3514 + ERROR_GAME_SERVER_ADD_PLAYERS_REFUSED, + // Token: 0x04000DBB RID: 3515 + ERROR_GAME_SERVER_REMOVE_PLAYERS_REFUSED, + // Token: 0x04000DBC RID: 3516 + ERROR_GAME_SERVER_FINISH_GAME_REFUSED, + // Token: 0x04000DBD RID: 3517 + ERROR_GAME_SERVER_NO_SUCH_GAME, + // Token: 0x04000DBE RID: 3518 + ERROR_GAME_SERVER_NO_SUCH_PLAYER, + // Token: 0x04000DBF RID: 3519 + ERROR_GAME_SERVER_CREATE_GAME_REFUSED_TRANSIENT, + // Token: 0x04000DC0 RID: 3520 + ERROR_GAME_SERVER_ADD_PLAYERS_REFUSED_TRANSIENT, + // Token: 0x04000DC1 RID: 3521 + ERROR_GAME_SERVER_REMOVE_PLAYERS_REFUSED_TRANSIENT, + // Token: 0x04000DC2 RID: 3522 + ERROR_GAME_SERVER_FINISH_GAME_REFUSED_TRANSIENT, + // Token: 0x04000DC3 RID: 3523 + ERROR_GAME_SERVER_CREATE_GAME_REFUSED_BUSY, + // Token: 0x04000DC4 RID: 3524 + ERROR_GAME_SERVER_ADD_PLAYERS_REFUSED_BUSY, + // Token: 0x04000DC5 RID: 3525 + ERROR_GAME_SERVER_REMOVE_PLAYERS_REFUSED_BUSY, + // Token: 0x04000DC6 RID: 3526 + ERROR_GAME_SERVER_FINISH_GAME_REFUSED_BUSY, + // Token: 0x04000DC7 RID: 3527 + ERROR_GAME_SERVER_NO_SERVER, + // Token: 0x04000DC8 RID: 3528 + ERROR_GAME_MASTER_INVALID_FACTORY, + // Token: 0x04000DC9 RID: 3529 + ERROR_GAME_MASTER_INVALID_GAME, + // Token: 0x04000DCA RID: 3530 + ERROR_GAME_MASTER_GAME_FULL, + // Token: 0x04000DCB RID: 3531 + ERROR_GAME_MASTER_REGISTER_FAILED, + // Token: 0x04000DCC RID: 3532 + ERROR_GAME_MASTER_NO_GAME_SERVER, + // Token: 0x04000DCD RID: 3533 + ERROR_GAME_MASTER_NO_UTILITY_SERVER, + // Token: 0x04000DCE RID: 3534 + ERROR_GAME_MASTER_NO_GAME_VERSION, + // Token: 0x04000DCF RID: 3535 + ERROR_GAME_MASTER_GAME_JOIN_FAILED, + // Token: 0x04000DD0 RID: 3536 + ERROR_GAME_MASTER_ALREADY_REGISTERED, + // Token: 0x04000DD1 RID: 3537 + ERROR_GAME_MASTER_NO_FACTORY, + // Token: 0x04000DD2 RID: 3538 + ERROR_GAME_MASTER_MULTIPLE_GAME_VERSIONS, + // Token: 0x04000DD3 RID: 3539 + ERROR_GAME_MASTER_INVALID_PLAYER, + // Token: 0x04000DD4 RID: 3540 + ERROR_GAME_MASTER_INVALID_GAME_REQUEST, + // Token: 0x04000DD5 RID: 3541 + ERROR_GAME_MASTER_INSUFFICIENT_PRIVILEGES, + // Token: 0x04000DD6 RID: 3542 + ERROR_GAME_MASTER_ALREADY_IN_GAME, + // Token: 0x04000DD7 RID: 3543 + ERROR_GAME_MASTER_INVALID_GAME_SERVER_RESPONSE, + // Token: 0x04000DD8 RID: 3544 + ERROR_GAME_MASTER_GAME_ACCOUNT_LOOKUP_FAILED, + // Token: 0x04000DD9 RID: 3545 + ERROR_GAME_MASTER_GAME_ENTRY_CANCELLED, + // Token: 0x04000DDA RID: 3546 + ERROR_GAME_MASTER_GAME_ENTRY_ABORTED_CLIENT_DROPPED, + // Token: 0x04000DDB RID: 3547 + ERROR_GAME_MASTER_GAME_ENTRY_ABORTED_BY_SERVICE, + // Token: 0x04000DDC RID: 3548 + ERROR_GAME_MASTER_NO_AVAILABLE_CAPACITY, + // Token: 0x04000DDD RID: 3549 + ERROR_GAME_MASTER_INVALID_TEAMID, + // Token: 0x04000DDE RID: 3550 + ERROR_GAME_MASTER_CREATION_IN_PROGRESS, + // Token: 0x04000DDF RID: 3551 + ERROR_NOTIFICATION_INVALID_CLIENT_ID, + // Token: 0x04000DE0 RID: 3552 + ERROR_NOTIFICATION_DUPLICATE_NAME, + // Token: 0x04000DE1 RID: 3553 + ERROR_NOTIFICATION_NAME_NOT_FOUND, + // Token: 0x04000DE2 RID: 3554 + ERROR_NOTIFICATION_INVALID_SERVER, + // Token: 0x04000DE3 RID: 3555 + ERROR_NOTIFICATION_QUOTA_EXCEEDED, + // Token: 0x04000DE4 RID: 3556 + ERROR_NOTIFICATION_INVALID_NOTIFICATION_TYPE, + // Token: 0x04000DE5 RID: 3557 + ERROR_ACHIEVEMENTS_NOTHING_TO_UPDATE, + // Token: 0x04000DE6 RID: 3558 + ERROR_ACHIEVEMENTS_INVALID_PARAMS, + // Token: 0x04000DE7 RID: 3559 + ERROR_ACHIEVEMENTS_NOT_REGISTERED, + // Token: 0x04000DE8 RID: 3560 + ERROR_ACHIEVEMENTS_NOT_READY, + // Token: 0x04000DE9 RID: 3561 + ERROR_ACHIEVEMENTS_FAILED_TO_PARSE_STATIC_DATA, + // Token: 0x04000DEA RID: 3562 + ERROR_ACHIEVEMENTS_UNKNOWN_ID, + // Token: 0x04000DEB RID: 3563 + ERROR_ACHIEVEMENTS_MISSING_SNAPSHOT, + // Token: 0x04000DEC RID: 3564 + ERROR_ACHIEVEMENTS_ALREADY_REGISTERED, + // Token: 0x04000DED RID: 3565 + ERROR_ACHIEVEMENTS_TOO_MANY_REGISTRATIONS, + // Token: 0x04000DEE RID: 3566 + ERROR_ACHIEVEMENTS_ALREADY_IN_PROGRESS, + // Token: 0x04000DEF RID: 3567 + ERROR_ACHIEVEMENTS_TEMPORARY_OUTAGE, + // Token: 0x04000DF0 RID: 3568 + ERROR_ACHIEVEMENTS_INVALID_PROGRAMID, + // Token: 0x04000DF1 RID: 3569 + ERROR_ACHIEVEMENTS_MISSING_RECORD, + // Token: 0x04000DF2 RID: 3570 + ERROR_ACHIEVEMENTS_REGISTRATION_PENDING, + // Token: 0x04000DF3 RID: 3571 + ERROR_ACHIEVEMENTS_ENTITY_ID_NOT_FOUND, + // Token: 0x04000DF4 RID: 3572 + ERROR_ACHIEVEMENTS_ACHIEVEMENT_ID_NOT_FOUND, + // Token: 0x04000DF5 RID: 3573 + ERROR_ACHIEVEMENTS_CRITERIA_ID_NOT_FOUND, + // Token: 0x04000DF6 RID: 3574 + ERROR_ACHIEVEMENTS_STATIC_DATA_MISMATCH, + // Token: 0x04000DF7 RID: 3575 + ERROR_ACHIEVEMENTS_WRONG_THREAD, + // Token: 0x04000DF8 RID: 3576 + ERROR_ACHIEVEMENTS_CALLBACK_IS_NULL, + // Token: 0x04000DF9 RID: 3577 + ERROR_ACHIEVEMENTS_AUTO_REGISTER_PENDING, + // Token: 0x04000DFA RID: 3578 + ERROR_ACHIEVEMENTS_NOT_INITIALIZED, + // Token: 0x04000DFB RID: 3579 + ERROR_ACHIEVEMENTS_ACHIEVEMENT_ID_ALREADY_EXISTS, + // Token: 0x04000DFC RID: 3580 + ERROR_ACHIEVEMENTS_FAILED_TO_DOWNLOAD_STATIC_DATA, + // Token: 0x04000DFD RID: 3581 + ERROR_SEARCH_INVALID_RANGE, + // Token: 0x04000DFE RID: 3582 + ERROR_SEARCH_DISABLED, + // Token: 0x04000DFF RID: 3583 + ERROR_SEARCH_UNIVERSE_NOT_LICENSED, + // Token: 0x04000E00 RID: 3584 + ERROR_SEARCH_UNIVERSE_DISABLED_LICENSE, + // Token: 0x04000E01 RID: 3585 + ERROR_SEARCH_TOO_MANY_RESULTS, + // Token: 0x04000E02 RID: 3586 + ERROR_SEARCH_REFUSED_BUSY, + // Token: 0x04000E03 RID: 3587 + ERROR_EXCHANGE_OBJECT_PROVIDER_VALIDATE_ORDER_BOOK_REFUSED_TRANSIENT, + // Token: 0x04000E04 RID: 3588 + ERROR_EXCHANGE_OBJECT_PROVIDER_AUTHORIZE_REFUSED_TRANSIENT, + // Token: 0x04000E05 RID: 3589 + ERROR_EXCHANGE_OBJECT_PROVIDER_SETTLE_REFUSED_TRANSIENT, + // Token: 0x04000E06 RID: 3590 + ERROR_EXCHANGE_OBJECT_PROVIDER_CANCEL_REFUSED_TRANSIENT, + // Token: 0x04000E07 RID: 3591 + ERROR_EXCHANGE_OBJECT_PROVIDER_GET_OBJECT_STATISTICS_REFUSED_TRANSIENT, + // Token: 0x04000E08 RID: 3592 + ERROR_EXCHANGE_OBJECT_PROVIDER_GET_PAYMENT_METHODS_REFUSED_TRANSIENT, + // Token: 0x04000E09 RID: 3593 + ERROR_EXCHANGE, + // Token: 0x04000E0A RID: 3594 + ERROR_EXCHANGE_ALREADY_EXISTS, + // Token: 0x04000E0B RID: 3595 + ERROR_EXCHANGE_ORDER_BOOK_CREATION_FAILED, + // Token: 0x04000E0C RID: 3596 + ERROR_EXCHANGE_ORDER_BOOK_NOT_FOUND, + // Token: 0x04000E0D RID: 3597 + ERROR_EXCHANGE_OBJECT_NOT_VALID, + // Token: 0x04000E0E RID: 3598 + ERROR_EXCHANGE_ACCOUNT_NOT_VALID, + // Token: 0x04000E0F RID: 3599 + ERROR_EXCHANGE_ORDER_BOOK_CLOSED, + // Token: 0x04000E10 RID: 3600 + ERROR_EXCHANGE_CANNOT_BID_ON_OWN_OFFER, + // Token: 0x04000E11 RID: 3601 + ERROR_EXCHANGE_INVALID_TOKEN, + // Token: 0x04000E12 RID: 3602 + ERROR_EXCHANGE_SUBSCRIPTION_FAILED, + // Token: 0x04000E13 RID: 3603 + ERROR_EXCHANGE_ALREADY_SUBSCRIBED, + // Token: 0x04000E14 RID: 3604 + ERROR_EXCHANGE_NOT_SUBSCRIBED, + // Token: 0x04000E15 RID: 3605 + ERROR_EXCHANGE_SOURCE_INVALID, + // Token: 0x04000E16 RID: 3606 + ERROR_EXCHANGE_TYPE_INVALID, + // Token: 0x04000E17 RID: 3607 + ERROR_EXCHANGE_NO_OBJECT_PROVIDERS, + // Token: 0x04000E18 RID: 3608 + ERROR_EXCHANGE_PARTITION_ID_INVALID, + // Token: 0x04000E19 RID: 3609 + ERROR_EXCHANGE_SPECIALIST_INVALID, + // Token: 0x04000E1A RID: 3610 + ERROR_EXCHANGE_CURRENCY_INVALID, + // Token: 0x04000E1B RID: 3611 + ERROR_EXCHANGE_DURATION_INVALID, + // Token: 0x04000E1C RID: 3612 + ERROR_EXCHANGE_START_DELAY_INVALID, + // Token: 0x04000E1D RID: 3613 + ERROR_EXCHANGE_STARTING_PRICE_INVALID, + // Token: 0x04000E1E RID: 3614 + ERROR_EXCHANGE_RESERVED_PRICE_INVALID, + // Token: 0x04000E1F RID: 3615 + ERROR_EXCHANGE_TRADE_NOW_PRICE_INVALID, + // Token: 0x04000E20 RID: 3616 + ERROR_EXCHANGE_DISABLED, + // Token: 0x04000E21 RID: 3617 + ERROR_EXCHANGE_SPECIALIST_DISABLED, + // Token: 0x04000E22 RID: 3618 + ERROR_EXCHANGE_ORDERACTION_DISABLED, + // Token: 0x04000E23 RID: 3619 + ERROR_EXCHANGE_ORDERTYPE_DISABLED, + // Token: 0x04000E24 RID: 3620 + ERROR_EXCHANGE_SOURCE_DISABLED, + // Token: 0x04000E25 RID: 3621 + ERROR_EXCHANGE_OFFER_NOT_FOUND, + // Token: 0x04000E26 RID: 3622 + ERROR_EXCHANGE_BID_NOT_FOUND, + // Token: 0x04000E27 RID: 3623 + ERROR_EXCHANGE_ORDER_BOOK_ID_MISMATCHED, + // Token: 0x04000E28 RID: 3624 + ERROR_EXCHANGE_CANCEL_REASON_INVALID, + // Token: 0x04000E29 RID: 3625 + ERROR_EXCHANGE_OBJECT_TYPE_INVALID, + // Token: 0x04000E2A RID: 3626 + ERROR_EXCHANGE_TOO_MANY_RESULTS, + // Token: 0x04000E2B RID: 3627 + ERROR_EXCHANGE_DISABLED_LICENSE, + // Token: 0x04000E2C RID: 3628 + ERROR_EXCHANGE_CURRENCY_NOT_LICENSED, + // Token: 0x04000E2D RID: 3629 + ERROR_EXCHANGE_CURRENCY_MISMATCHED, + // Token: 0x04000E2E RID: 3630 + ERROR_EXCHANGE_PROGRAM_INVALID, + // Token: 0x04000E2F RID: 3631 + ERROR_EXCHANGE_AMOUNT_INVALID, + // Token: 0x04000E30 RID: 3632 + ERROR_EXCHANGE_ORDER_INVALID, + // Token: 0x04000E31 RID: 3633 + ERROR_EXCHANGE_CURRENT_PRICE_INVALID, + // Token: 0x04000E32 RID: 3634 + ERROR_EXCHANGE_MAXIMUM_PRICE_INVALID, + // Token: 0x04000E33 RID: 3635 + ERROR_EXCHANGE_CURRENCY_DISABLED, + // Token: 0x04000E34 RID: 3636 + ERROR_EXCHANGE_AMOUNT_INVALID_TICKSIZE, + // Token: 0x04000E35 RID: 3637 + ERROR_EXCHANGE_NOTCLOSED_OFFER_LIMIT_REACHED, + // Token: 0x04000E36 RID: 3638 + ERROR_EXCHANGE_CURRENCY_RMT_RESTRICTED, + // Token: 0x04000E37 RID: 3639 + ERROR_EXCHANGE_ORDER_WITH_CLAIMABLE_LIMIT_REACHED, + // Token: 0x04000E38 RID: 3640 + ERROR_EXCHANGE_STARTING_PRICE_MIN_UNIT_PRICE_INVALID, + // Token: 0x04000E39 RID: 3641 + ERROR_EXCHANGE_STARTING_PRICE_MAX_UNIT_PRICE_INVALID, + // Token: 0x04000E3A RID: 3642 + ERROR_EXCHANGE_STARTING_PRICE_MIN_TOTAL_PRICE_INVALID, + // Token: 0x04000E3B RID: 3643 + ERROR_EXCHANGE_STARTING_PRICE_MAX_TOTAL_PRICE_INVALID, + // Token: 0x04000E3C RID: 3644 + ERROR_EXCHANGE_RESERVED_PRICE_MIN_UNIT_PRICE_INVALID, + // Token: 0x04000E3D RID: 3645 + ERROR_EXCHANGE_RESERVED_PRICE_MAX_UNIT_PRICE_INVALID, + // Token: 0x04000E3E RID: 3646 + ERROR_EXCHANGE_RESERVED_PRICE_MIN_TOTAL_PRICE_INVALID, + // Token: 0x04000E3F RID: 3647 + ERROR_EXCHANGE_RESERVED_PRICE_MAX_TOTAL_PRICE_INVALID, + // Token: 0x04000E40 RID: 3648 + ERROR_EXCHANGE_TRADE_NOW_PRICE_MIN_UNIT_PRICE_INVALID, + // Token: 0x04000E41 RID: 3649 + ERROR_EXCHANGE_TRADE_NOW_PRICE_MAX_UNIT_PRICE_INVALID, + // Token: 0x04000E42 RID: 3650 + ERROR_EXCHANGE_TRADE_NOW_PRICE_MIN_TOTAL_PRICE_INVALID, + // Token: 0x04000E43 RID: 3651 + ERROR_EXCHANGE_TRADE_NOW_PRICE_MAX_TOTAL_PRICE_INVALID, + // Token: 0x04000E44 RID: 3652 + ERROR_EXCHANGE_CURRENT_PRICE_MIN_UNIT_PRICE_INVALID, + // Token: 0x04000E45 RID: 3653 + ERROR_EXCHANGE_CURRENT_PRICE_MAX_UNIT_PRICE_INVALID, + // Token: 0x04000E46 RID: 3654 + ERROR_EXCHANGE_CURRENT_PRICE_MIN_TOTAL_PRICE_INVALID, + // Token: 0x04000E47 RID: 3655 + ERROR_EXCHANGE_CURRENT_PRICE_MAX_TOTAL_PRICE_INVALID, + // Token: 0x04000E48 RID: 3656 + ERROR_EXCHANGE_MAXIMUM_PRICE_MIN_UNIT_PRICE_INVALID, + // Token: 0x04000E49 RID: 3657 + ERROR_EXCHANGE_MAXIMUM_PRICE_MAX_UNIT_PRICE_INVALID, + // Token: 0x04000E4A RID: 3658 + ERROR_EXCHANGE_MAXIMUM_PRICE_MIN_TOTAL_PRICE_INVALID, + // Token: 0x04000E4B RID: 3659 + ERROR_EXCHANGE_MAXIMUM_PRICE_MAX_TOTAL_PRICE_INVALID, + // Token: 0x04000E4C RID: 3660 + ERROR_EXCHANGE_INVALID_FILL_OR_KILL_BID, + // Token: 0x04000E4D RID: 3661 + ERROR_EXCHANGE_REQUEST_INPROCESS, + // Token: 0x04000E4E RID: 3662 + ERROR_EXCHANGE_BID_AUTHORIZE_INPROGRESS, + // Token: 0x04000E4F RID: 3663 + ERROR_EXCHANGE_OFFER_AUTHORIZE_INPROGRESS, + // Token: 0x04000E50 RID: 3664 + ERROR_EXCHANGE_PARTITION_BUSY, + // Token: 0x04000E51 RID: 3665 + ERROR_EXCHANGE_SUBSCRIBE_REQUEST_REFUSED_BUSY, + // Token: 0x04000E52 RID: 3666 + ERROR_EXCHANGE_BUSY, + // Token: 0x04000E53 RID: 3667 + ERROR_EXCHANGE_ACCESS_NOT_GRANTED, + // Token: 0x04000E54 RID: 3668 + ERROR_EXCHANGE_STATUS_INVALID, + // Token: 0x04000E55 RID: 3669 + ERROR_EXCHANGE_NOTIFICATION_TYPE_INVALID, + // Token: 0x04000E56 RID: 3670 + ERROR_EXCHANGE_DATABASE, + // Token: 0x04000E57 RID: 3671 + ERROR_EXCHANGE_DATABASE_MAINTENANCE, + // Token: 0x04000E58 RID: 3672 + ERROR_EXCHANGE_DATABASE_USERCANCEL, + // Token: 0x04000E59 RID: 3673 + ERROR_EXCHANGE_DATABASE_OUTBID, + // Token: 0x04000E5A RID: 3674 + ERROR_EXCHANGE_DATABASE_INSUFFICIENTAMOUNT, + // Token: 0x04000E5B RID: 3675 + ERROR_EXCHANGE_DATABASE_TOTALPRICETOOLOW, + // Token: 0x04000E5C RID: 3676 + ERROR_EXCHANGE_DATABASE_CLOSEFORFILLORKILL, + // Token: 0x04000E5D RID: 3677 + ERROR_EXCHANGE_DATABASE_UNKNOWNSPECIALIST, + // Token: 0x04000E5E RID: 3678 + ERROR_EXCHANGE_DATABASE_DATANOTFOUND, + // Token: 0x04000E5F RID: 3679 + ERROR_EXCHANGE_DATABASE_DUPLICATEDATA, + // Token: 0x04000E60 RID: 3680 + ERROR_EXCHANGE_DATABASE_ALREADYCANCELED, + // Token: 0x04000E61 RID: 3681 + ERROR_EXCHANGE_DATABASE_ORDERSTILLACTIVE, + // Token: 0x04000E62 RID: 3682 + ERROR_EXCHANGE_DATABASE_AUTHORIZATIONFAILED, + // Token: 0x04000E63 RID: 3683 + ERROR_EXCHANGE_DATABASE_ALREADYCOMPLETED, + // Token: 0x04000E64 RID: 3684 + ERROR_EXCHANGE_DATABASE_ENDTIMENOTPASSED, + // Token: 0x04000E65 RID: 3685 + ERROR_EXCHANGE_DATABASE_TRADENOWPRICEREACHED, + // Token: 0x04000E66 RID: 3686 + ERROR_EXCHANGE_DATABASE_INSUFFICIENTMAXUNITPRICE, + // Token: 0x04000E67 RID: 3687 + ERROR_EXCHANGE_DATABASE_NOTENOUGHUNITPRICE, + // Token: 0x04000E68 RID: 3688 + ERROR_EXCHANGE_DATABASE_ZEROAMOUNT, + // Token: 0x04000E69 RID: 3689 + ERROR_EXCHANGE_DATABASE_SETTLEAMOUNTMISMATCH, + // Token: 0x04000E6A RID: 3690 + ERROR_EXCHANGE_DATABASE_STARTTIMENOTPASSED, + // Token: 0x04000E6B RID: 3691 + ERROR_EXCHANGE_DATABASE_LESSTHANRESERVEPRICE, + // Token: 0x04000E6C RID: 3692 + ERROR_EXCHANGE_DATABASE_NOTAUTHORIZED, + // Token: 0x04000E6D RID: 3693 + ERROR_EXCHANGE_DATABASE_NOTIMPLEMENTED, + // Token: 0x04000E6E RID: 3694 + ERROR_EXCHANGE_DATABASE_LESSTHANOUTBIDPRICE, + // Token: 0x04000E6F RID: 3695 + ERROR_EXCHANGE_DATABASE_RECORDNOTFOUND, + // Token: 0x04000E70 RID: 3696 + ERROR_EXCHANGE_DATABASE_PARENTSETTLEFAILED, + // Token: 0x04000E71 RID: 3697 + ERROR_EXCHANGE_DATABASE_INVALIDOPERATION, + // Token: 0x04000E72 RID: 3698 + ERROR_EXCHANGE_DATABASE_RISKPENDING, + // Token: 0x04000E73 RID: 3699 + ERROR_EXCHANGE_DATABASE_REFUNDNOTFOUND, + // Token: 0x04000E74 RID: 3700 + ERROR_EXCHANGE_DATABASE_SETTLEPENDING, + // Token: 0x04000E75 RID: 3701 + ERROR_EXCHANGE_DATABASE_RISKFAILED, + // Token: 0x04000E76 RID: 3702 + ERROR_EXCHANGE_DATABASE_ORDERBOOKNOTFOUND, + // Token: 0x04000E77 RID: 3703 + ERROR_EXCHANGE_DATABASE_ORDERBOOKCLOSEFAILED, + // Token: 0x04000E78 RID: 3704 + ERROR_EXCHANGE_DATABASE_ORDERBOOKINVALIDID, + // Token: 0x04000E79 RID: 3705 + ERROR_EXCHANGE_DATABASE_ORDERBOOKCLOSED, + // Token: 0x04000E7A RID: 3706 + ERROR_EXCHANGE_DATABASE_ORDERBOOKDUPACTIVE, + // Token: 0x04000E7B RID: 3707 + ERROR_EXCHANGE_DATABASE_OFFERNOTFOUND, + // Token: 0x04000E7C RID: 3708 + ERROR_EXCHANGE_DATABASE_OFFERCANCELED, + // Token: 0x04000E7D RID: 3709 + ERROR_EXCHANGE_DATABASE_OFFERCLOSED, + // Token: 0x04000E7E RID: 3710 + ERROR_EXCHANGE_DATABASE_OFFERNOTACTIVATED, + // Token: 0x04000E7F RID: 3711 + ERROR_EXCHANGE_DATABASE_OFFERAUTHNOTFOUND, + // Token: 0x04000E80 RID: 3712 + ERROR_EXCHANGE_DATABASE_OFFERAUTHINPROCESS, + // Token: 0x04000E81 RID: 3713 + ERROR_EXCHANGE_DATABASE_OFFERCANCELNOTFOUND, + // Token: 0x04000E82 RID: 3714 + ERROR_EXCHANGE_DATABASE_OFFERSETTLENOTFOUND, + // Token: 0x04000E83 RID: 3715 + ERROR_EXCHANGE_DATABASE_OFFEREXPIRED, + // Token: 0x04000E84 RID: 3716 + ERROR_EXCHANGE_DATABASE_OFFERALREADYEXISTS, + // Token: 0x04000E85 RID: 3717 + ERROR_EXCHANGE_DATABASE_OFFERBADOWNER, + // Token: 0x04000E86 RID: 3718 + ERROR_EXCHANGE_DATABASE_BIDNOTFOUND, + // Token: 0x04000E87 RID: 3719 + ERROR_EXCHANGE_DATABASE_BIDALREADYEXISTS, + // Token: 0x04000E88 RID: 3720 + ERROR_EXCHANGE_DATABASE_BIDFROMSAMEACCOUNT, + // Token: 0x04000E89 RID: 3721 + ERROR_EXCHANGE_DATABASE_BIDAUTHNOTFOUND, + // Token: 0x04000E8A RID: 3722 + ERROR_EXCHANGE_DATABASE_BIDCANCELNOTFOUND, + // Token: 0x04000E8B RID: 3723 + ERROR_EXCHANGE_DATABASE_BIDSETTLENOTFOUND, + // Token: 0x04000E8C RID: 3724 + ERROR_EXCHANGE_DATABASE_BIDCLOSED, + // Token: 0x04000E8D RID: 3725 + ERROR_EXCHANGE_DATABASE_BIDCANCELED, + // Token: 0x04000E8E RID: 3726 + ERROR_EXCHANGE_DATABASE_BIDEXPIRED, + // Token: 0x04000E8F RID: 3727 + ERROR_EXCHANGE_DATABASE_BIDAUTHINPROCESS, + // Token: 0x04000E90 RID: 3728 + ERROR_EXCHANGE_DATABASE_BIDBADOWNER, + // Token: 0x04000E91 RID: 3729 + ERROR_EXCHANGE_DATABASE_FEECOUPONNEGATIVE, + // Token: 0x04000E92 RID: 3730 + ERROR_EXCHANGE_DATABASE_FEEINACTIVE, + // Token: 0x04000E93 RID: 3731 + ERROR_EXCHANGE_DATABASE_FEEEVENTNOTFOUND, + // Token: 0x04000E94 RID: 3732 + ERROR_EXCHANGE_DATABASE_FEEEVENTTOOMANY, + // Token: 0x04000E95 RID: 3733 + ERROR_EXCHANGE_DATABASE_COUPONNOTFOUND, + // Token: 0x04000E96 RID: 3734 + ERROR_EXCHANGE_DATABASE_COUPONBOOKNOTFOUND, + // Token: 0x04000E97 RID: 3735 + ERROR_EXCHANGE_DATABASE_ORDERINVALIDADDRESS, + // Token: 0x04000E98 RID: 3736 + ERROR_EXCHANGE_DATABASE_CSCANCELSTART, + // Token: 0x04000E99 RID: 3737 + ERROR_EXCHANGE_DATABASE_CSCANCELEND, + // Token: 0x04000E9A RID: 3738 + ERROR_EXCHANGE_DATABASE_EXCEPTION_NOTSPECIFIED, + // Token: 0x04000E9B RID: 3739 + ERROR_EXCHANGE_DATABASE_EXCEPTION_NOTENOUGHDEFINITIONS, + // Token: 0x04000E9C RID: 3740 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADPARTITIONID, + // Token: 0x04000E9D RID: 3741 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADORDERBOOKID, + // Token: 0x04000E9E RID: 3742 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADPROGRESS, + // Token: 0x04000E9F RID: 3743 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADSETTLEAMOUNT, + // Token: 0x04000EA0 RID: 3744 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADOFFERID, + // Token: 0x04000EA1 RID: 3745 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADOFFERAMOUNT, + // Token: 0x04000EA2 RID: 3746 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADOFFERPRICING, + // Token: 0x04000EA3 RID: 3747 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADOFFERTIMING, + // Token: 0x04000EA4 RID: 3748 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADOFFERMONEYACCOUNT, + // Token: 0x04000EA5 RID: 3749 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADOFFERITEMACCOUNT, + // Token: 0x04000EA6 RID: 3750 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADOFFERSETTLEAMOUNT, + // Token: 0x04000EA7 RID: 3751 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADOFFERSETTLEPRICE, + // Token: 0x04000EA8 RID: 3752 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADBIDID, + // Token: 0x04000EA9 RID: 3753 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADBIDAMOUNT, + // Token: 0x04000EAA RID: 3754 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADBIDPRICING, + // Token: 0x04000EAB RID: 3755 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADBIDTIMING, + // Token: 0x04000EAC RID: 3756 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADBIDMONEYACCOUNT, + // Token: 0x04000EAD RID: 3757 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADBIDITEMACCOUNT, + // Token: 0x04000EAE RID: 3758 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADBIDSETTLEAMOUNT, + // Token: 0x04000EAF RID: 3759 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADBIDSETTLEPRICE, + // Token: 0x04000EB0 RID: 3760 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADBIDDINGBNETID, + // Token: 0x04000EB1 RID: 3761 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADFEECALCULATIONTYPE, + // Token: 0x04000EB2 RID: 3762 + ERROR_EXCHANGE_DATABASE_EXCEPTION_BADFEECOUPONCOUNT, + // Token: 0x04000EB3 RID: 3763 + ERROR_GAME_UTILITY_SERVER_VARIABLE_REQUEST_REFUSED, + // Token: 0x04000EB4 RID: 3764 + ERROR_GAME_UTILITY_SERVER_WRONG_NUMBER_OF_VARIABLES_RETURNED, + // Token: 0x04000EB5 RID: 3765 + ERROR_GAME_UTILITY_SERVER_CLIENT_REQUEST_REFUSED, + // Token: 0x04000EB6 RID: 3766 + ERROR_GAME_UTILITY_SERVER_PRESENCE_CHANNEL_CREATED_REFUSED, + // Token: 0x04000EB7 RID: 3767 + ERROR_GAME_UTILITY_SERVER_VARIABLE_REQUEST_REFUSED_TRANSIENT, + // Token: 0x04000EB8 RID: 3768 + ERROR_GAME_UTILITY_SERVER_CLIENT_REQUEST_REFUSED_TRANSIENT, + // Token: 0x04000EB9 RID: 3769 + ERROR_GAME_UTILITY_SERVER_PRESENCE_CHANNEL_CREATED_REFUSED_TRANSIENT, + // Token: 0x04000EBA RID: 3770 + ERROR_GAME_UTILITY_SERVER_SERVER_REQUEST_REFUSED_TRANSIENT, + // Token: 0x04000EBB RID: 3771 + ERROR_GAME_UTILITY_SERVER_VARIABLE_REQUEST_REFUSED_BUSY, + // Token: 0x04000EBC RID: 3772 + ERROR_GAME_UTILITY_SERVER_CLIENT_REQUEST_REFUSED_BUSY, + // Token: 0x04000EBD RID: 3773 + ERROR_GAME_UTILITY_SERVER_PRESENCE_CHANNEL_CREATED_REFUSED_BUSY, + // Token: 0x04000EBE RID: 3774 + ERROR_GAME_UTILITY_SERVER_SERVER_REQUEST_REFUSED_BUSY, + // Token: 0x04000EBF RID: 3775 + ERROR_GAME_UTILITY_SERVER_NO_SERVER, + // Token: 0x04000EC0 RID: 3776 + ERROR_GAME_CHANNEL_INVALID_GAME_ID, + // Token: 0x04000EC1 RID: 3777 + ERROR_EXCHANGE_PAYMENT, + // Token: 0x04000EC2 RID: 3778 + ERROR_EXCHANGE_PAYMENT_BRIDGE_TIMEOUT, + // Token: 0x04000EC3 RID: 3779 + ERROR_EXCHANGE_PAYMENT_CORRUPT_AUTH_HANDLE, + // Token: 0x04000EC4 RID: 3780 + ERROR_EXCHANGE_PAYMENT_INVALID_REQUEST, + // Token: 0x04000EC5 RID: 3781 + ERROR_EXCHANGE_PAYMENT_CASH_OUT_NOT_ALLOWED, + // Token: 0x04000EC6 RID: 3782 + ERROR_EXCHANGE_PAYMENT_INVALID_TRANSACTION_DIRECTION, + // Token: 0x04000EC7 RID: 3783 + ERROR_EXCHANGE_PAYMENT_INSUFFICIENT_FUNDS, + // Token: 0x04000EC8 RID: 3784 + ERROR_EXCHANGE_PAYMENT_DECRYPT_FAILED, + // Token: 0x04000EC9 RID: 3785 + ERROR_EXCHANGE_PAYMENT_LIMITED_BY_MAX_CAP_AMOUNT, + // Token: 0x04000ECA RID: 3786 + ERROR_EXCHANGE_PAYMENT_BRIDGE_DISCONNECTED_FROM_PAYMENT_PROVIDER, + // Token: 0x04000ECB RID: 3787 + ERROR_EXCHANGE_PAYMENT_COULDNT_CONNECT, + // Token: 0x04000ECC RID: 3788 + ERROR_EXCHANGE_PAYMENT_AUTH_EXPIRED, + // Token: 0x04000ECD RID: 3789 + ERROR_EXCHANGE_PAYMENT_PAYPAL_TX_NOT_FOUND, + // Token: 0x04000ECE RID: 3790 + ERROR_EXCHANGE_PAYMENT_PAYPAL_UNEXPECTED_STATUS, + // Token: 0x04000ECF RID: 3791 + ERROR_EXCHANGE_PAYMENT_BRIDGE_INTERNAL_DEPRECATED, + // Token: 0x04000ED0 RID: 3792 + ERROR_EXCHANGE_PAYMENT_PAYPAL_MASSPAY_UNKNOWN_STATE, + // Token: 0x04000ED1 RID: 3793 + ERROR_EXCHANGE_PAYMENT_PAYPAL_MASSPAY_SHOULD_RETRY, + // Token: 0x04000ED2 RID: 3794 + ERROR_EXCHANGE_PAYMENT_GC_UNEXPECTED_STATUS, + // Token: 0x04000ED3 RID: 3795 + ERROR_EXCHANGE_PAYMENT_ORDER_ID_RUNNING_OUT, + // Token: 0x04000ED4 RID: 3796 + ERROR_EXCHANGE_PAYMENT_ACCOUNT_SOURCE_MISMATCH, + // Token: 0x04000ED5 RID: 3797 + ERROR_EXCHANGE_PAYMENT_RESULT_OFFSET_IN_USE, + // Token: 0x04000ED6 RID: 3798 + ERROR_EXCHANGE_PAYMENT_WALLET_NOT_FOUND, + // Token: 0x04000ED7 RID: 3799 + ERROR_EXCHANGE_PAYMENT_CURRENCY_NOT_FOUND, + // Token: 0x04000ED8 RID: 3800 + ERROR_EXCHANGE_PAYMENT_MALFORMED_RESPONSE, + // Token: 0x04000ED9 RID: 3801 + ERROR_EXCHANGE_PAYMENT_CVV_NOT_PRESENT, + // Token: 0x04000EDA RID: 3802 + ERROR_EXCHANGE_PAYMENT_AVS_CHECK_FAILED, + // Token: 0x04000EDB RID: 3803 + ERROR_EXCHANGE_PAYMENT_CVV_CHECK_FAILED, + // Token: 0x04000EDC RID: 3804 + ERROR_EXCHANGE_PAYMENT_ZIP_CODE_TOO_SHORT, + // Token: 0x04000EDD RID: 3805 + ERROR_EXCHANGE_PAYMENT_ZIP_CODE_TOO_LONG, + // Token: 0x04000EDE RID: 3806 + ERROR_EXCHANGE_PAYMENT_ZIP_CODE_REPEATING_DIGITS_NOT_ALLOWED, + // Token: 0x04000EDF RID: 3807 + ERROR_EXCHANGE_PAYMENT_ZIP_CODE_INVALID, + // Token: 0x04000EE0 RID: 3808 + ERROR_EXCHANGE_PAYMENT_AUTHENTICATOR_CAP_VIOLATION, + // Token: 0x04000EE1 RID: 3809 + ERROR_EXCHANGE_PAYMENT_SOFT_CAP_VIOLATION, + // Token: 0x04000EE2 RID: 3810 + ERROR_EXCHANGE_PAYMENT_UNKNOWN_ACCOUNT, + // Token: 0x04000EE3 RID: 3811 + ERROR_EXCHANGE_PAYMENT_PAYPAL_MASSPAY_RESET_IN_PROCESS_FAILED, + // Token: 0x04000EE4 RID: 3812 + ERROR_EXCHANGE_PAYMENT_UNSUPPORTED_PAYMENT_METHOD, + // Token: 0x04000EE5 RID: 3813 + ERROR_EXCHANGE_PAYMENT_UNKNOWN_ERROR, + // Token: 0x04000EE6 RID: 3814 + ERROR_EXCHANGE_PAYMENT_SHUTTING_DOWN, + // Token: 0x04000EE7 RID: 3815 + ERROR_EXCHANGE_PAYMENT_MISSING_SMS_SIGNUP, + // Token: 0x04000EE8 RID: 3816 + ERROR_EXCHANGE_PAYMENT_EBALANCE_INTERNAL, + // Token: 0x04000EE9 RID: 3817 + ERROR_EXCHANGE_PAYMENT_REQUEST_TIMED_OUT_IN_PROVIDER, + // Token: 0x04000EEA RID: 3818 + ERROR_EXCHANGE_PAYMENT_REQUEST_UNKNOWN_STATE, + // Token: 0x04000EEB RID: 3819 + ERROR_EXCHANGE_PAYMENT_ACCOUNT_COMPROMISED, + // Token: 0x04000EEC RID: 3820 + ERROR_EXCHANGE_PAYMENT_REPORT_FAILED, + // Token: 0x04000EED RID: 3821 + ERROR_EXCHANGE_PAYMENT_INVAID_PROVIDER_ID, + // Token: 0x04000EEE RID: 3822 + ERROR_EXCHANGE_PAYMENT_DATABASE, + // Token: 0x04000EEF RID: 3823 + ERROR_EXCHANGE_PAYMENT_DATABASE_THIS_ERROR_CODE_IS_DEPRECATED, + // Token: 0x04000EF0 RID: 3824 + ERROR_EXCHANGE_PAYMENT_DATABASE_BAD_PROGRESS_COUNT, + // Token: 0x04000EF1 RID: 3825 + ERROR_EXCHANGE_PAYMENT_DATABASE_NO_DATA_FOUND, + // Token: 0x04000EF2 RID: 3826 + ERROR_EXCHANGE_PAYMENT_DATABASE_ALREADY_COMPLETED, + // Token: 0x04000EF3 RID: 3827 + ERROR_EXCHANGE_PAYMENT_DATABASE_DUPLICATED_DATA, + // Token: 0x04000EF4 RID: 3828 + ERROR_EXCHANGE_PAYMENT_DATABASE_INVALID_OPERATION_TYPE, + // Token: 0x04000EF5 RID: 3829 + ERROR_EXCHANGE_PAYMENT_DATABASE_NO_SETTLE_FOR_REFUND, + // Token: 0x04000EF6 RID: 3830 + ERROR_EXCHANGE_PAYMENT_DATABASE_REFUND_EXCEEDS_SETTLE, + // Token: 0x04000EF7 RID: 3831 + ERROR_EXCHANGE_PAYMENT_DATABASE_ALREADY_SUCCESS, + // Token: 0x04000EF8 RID: 3832 + ERROR_EXCHANGE_PAYMENT_DATABASE_ALREADY_IN_PROCESS, + // Token: 0x04000EF9 RID: 3833 + ERROR_EXCHANGE_PAYMENT_DATABASE_INVALID_FUND_AMOUNT, + // Token: 0x04000EFA RID: 3834 + ERROR_EXCHANGE_PAYMENT_DATABASE_PARTIAL_FILLED, + // Token: 0x04000EFB RID: 3835 + ERROR_EXCHANGE_PAYMENT_DATABASE_INVALID_PROVIDER_ID, + // Token: 0x04000EFC RID: 3836 + ERROR_EXCHANGE_PAYMENT_DATABASE_EXCEPTION_ASSERT_CONDITION_FAILED, + // Token: 0x04000EFD RID: 3837 + ERROR_EXCHANGE_PAYMENT_DATABASE_EXCEPTION_BAD_PROVIDER_REQUEST_ID, + // Token: 0x04000EFE RID: 3838 + ERROR_EXCHANGE_PAYMENT_DATABASE_EXCEPTION_BAD_AUTHORIZATION, + // Token: 0x04000EFF RID: 3839 + ERROR_EXCHANGE_PAYMENT_DATABASE_EXCEPTION_BAD_SETTLE, + // Token: 0x04000F00 RID: 3840 + ERROR_EXCHANGE_PAYMENT_DATABASE_EXCEPTION_BAD_PROGRESS_COUNT, + // Token: 0x04000F01 RID: 3841 + ERROR_EXCHANGE_PAYMENT_DATABASE_EXCEPTION_BAD_TOTAL_PROGRESS_COUNT, + // Token: 0x04000F02 RID: 3842 + ERROR_EXCHANGE_PAYMENT_DATABASE_EXCEPTION_NATIVE, + // Token: 0x04000F03 RID: 3843 + ERROR_EXCHANGE_PAYMENT_DATABASE_EXCEPTION_NOT_SPECIFIED, + // Token: 0x04000F04 RID: 3844 + ERROR_EXCHANGE_SEARCH_INPUT_NO_OBJECT_PROVIDERS, + // Token: 0x04000F05 RID: 3845 + ERROR_EXCHANGE_SEARCH_INPUT_DUPLICATE_STATISTICS_KEY, + // Token: 0x04000F06 RID: 3846 + ERROR_IDENTITY_INSUFFICIENT_DATA, + // Token: 0x04000F07 RID: 3847 + ERROR_IDENTITY_TOO_MANY_RESULTS, + // Token: 0x04000F08 RID: 3848 + ERROR_IDENTITY_BAD_ID, + // Token: 0x04000F09 RID: 3849 + ERROR_IDENTITY_NO_ACCOUNT_BLOB, + // Token: 0x04000F0A RID: 3850 + ERROR_RISK_CHALLENGE_ACTION, + // Token: 0x04000F0B RID: 3851 + ERROR_RISK_DELAY_ACTION, + // Token: 0x04000F0C RID: 3852 + ERROR_RISK_THROTTLE_ACTION, + // Token: 0x04000F0D RID: 3853 + ERROR_RISK_ACCOUNT_LOCKED, + // Token: 0x04000F0E RID: 3854 + ERROR_RISK_CS_DENIED, + // Token: 0x04000F0F RID: 3855 + ERROR_PORT_DISABLED, + // Token: 0x04000F10 RID: 3856 + ERROR_PORT_EXCHANGE_REASON_INVALID, + // Token: 0x04000F11 RID: 3857 + ERROR_REPORT_UNAVAILABLE, + // Token: 0x04000F12 RID: 3858 + ERROR_REPORT_TOO_LARGE, + // Token: 0x04000F13 RID: 3859 + ERROR_REPORT_UNKNOWN_TYPE, + // Token: 0x04000F14 RID: 3860 + ERROR_REPORT_ATTRIBUTE_INVALID, + // Token: 0x04000F15 RID: 3861 + ERROR_REPORT_ATTRIBUTE_QUOTA_EXCEEDED, + // Token: 0x04000F16 RID: 3862 + ERROR_REPORT_UNCONFIRMED, + // Token: 0x04000F17 RID: 3863 + ERROR_REPORT_NOT_CONNECTED, + // Token: 0x04000F18 RID: 3864 + ERROR_REPORT_REJECTED, + // Token: 0x04000F19 RID: 3865 + ERROR_REPORT_TOO_MANY_REQUESTS + } \ No newline at end of file diff --git a/src/main/java/com/alterdekim/utils/BattleNetPacket.java b/src/main/java/com/alterdekim/utils/BattleNetPacket.java new file mode 100644 index 0000000..ec50786 --- /dev/null +++ b/src/main/java/com/alterdekim/utils/BattleNetPacket.java @@ -0,0 +1,92 @@ +package com.alterdekim.utils; + +import com.alterdekim.Protocol; + +import java.io.ByteArrayOutputStream; + +public class BattleNetPacket { + + private int headerSize = -1; + + private int bodySize = -1; + + private Protocol.Header header; + + private byte[] body; + + public Protocol.Header getHeader() { + return header; + } + + public byte[] getBody() { + return body; + } + + public BattleNetPacket(Protocol.Header header, byte[] body) { + this.header = header; + this.body = body; + } + + public BattleNetPacket() { + this.header = null; + this.body = null; + } + + public void setHeader(Protocol.Header header) { + this.header = header; + } + + public void setBody(byte[] body) { + this.body = body; + } + + public int Decode(byte[] bytes, int offset, int available) throws Exception { + int num = 0; + if (this.headerSize < 0) { + if (available < 2) { + return num; + } + this.headerSize = ((int)bytes[offset] << 8) + (int)bytes[offset + 1]; + available -= 2; + num += 2; + offset += 2; + } + if (this.header == null) { + if (available < this.headerSize) { + return num; + } + this.header = Protocol.Header.getDefaultInstance(); + byte[] s = new byte[this.headerSize]; + System.arraycopy(bytes, offset, s, 0, this.headerSize); + this.header = Protocol.Header.parseFrom(s); + this.bodySize = ((!this.header.hasSize()) ? 0 : this.header.getSize()); // something with unsigned integers (debug, if needed) + available -= this.headerSize; + num += this.headerSize; + offset += this.headerSize; + } + if (this.body == null) { + if (available < this.bodySize) { + return num; + } + byte[] destinationArray = new byte[this.bodySize]; + System.arraycopy(bytes, offset, destinationArray, 0, this.bodySize); + this.body = destinationArray; + num += this.bodySize; + } + return num; + } + + public byte[] Encode() throws Exception { + int serializedSize = this.header.getSerializedSize(); + int serializedSize2 = this.body.length; + byte[] array = new byte[2 + serializedSize + serializedSize2]; + array[0] = (byte)(serializedSize >> 8 & 255); + array[1] = (byte)(serializedSize & 255); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + this.header.writeTo(baos); + System.arraycopy(baos.toByteArray(), 0, array, 2, serializedSize); + System.arraycopy(body, 0, array, 2 + serializedSize, serializedSize2); + baos.close(); + return array; + } +} diff --git a/src/main/java/com/alterdekim/utils/Compute32.java b/src/main/java/com/alterdekim/utils/Compute32.java new file mode 100644 index 0000000..3701088 --- /dev/null +++ b/src/main/java/com/alterdekim/utils/Compute32.java @@ -0,0 +1,12 @@ +package com.alterdekim.utils; + +public class Compute32 { + public static int Hash(String str) { + int num = Integer.parseUnsignedInt("2166136261"); + for( char b : str.toCharArray() ) { + num ^= b; + num *= Integer.parseUnsignedInt("16777619"); + } + return num; + } +} \ No newline at end of file diff --git a/src/main/java/com/alterdekim/utils/Util.java b/src/main/java/com/alterdekim/utils/Util.java new file mode 100644 index 0000000..5f90dfa --- /dev/null +++ b/src/main/java/com/alterdekim/utils/Util.java @@ -0,0 +1,145 @@ +package com.alterdekim.utils; + +import com.google.protobuf.MessageOrBuilder; +import com.google.protobuf.util.JsonFormat; +import org.bouncycastle.cert.X509CertificateHolder; +import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.openssl.PEMDecryptorProvider; +import org.bouncycastle.openssl.PEMEncryptedKeyPair; +import org.bouncycastle.openssl.PEMKeyPair; +import org.bouncycastle.openssl.PEMParser; +import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; +import org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder; + +import javax.net.ssl.*; +import java.io.FileReader; +import java.io.IOException; +import java.security.KeyPair; +import java.security.KeyStore; +import java.security.Security; +import java.security.cert.Certificate; +import java.security.cert.X509Certificate; + +public class Util { + + private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray(); + + public static SSLServerSocketFactory getSocketFactory(final String caCrtFile, final String crtFile, final String keyFile, + final String password) { + try { + + /** + * Add BouncyCastle as a Security Provider + */ + Security.addProvider(new BouncyCastleProvider()); + + JcaX509CertificateConverter certificateConverter = new JcaX509CertificateConverter().setProvider("BC"); + + /** + * Load Certificate Authority (CA) certificate + */ + PEMParser reader = new PEMParser(new FileReader(caCrtFile)); + X509CertificateHolder caCertHolder = (X509CertificateHolder) reader.readObject(); + reader.close(); + + X509Certificate caCert = certificateConverter.getCertificate(caCertHolder); + + /** + * Load client certificate + */ + reader = new PEMParser(new FileReader(crtFile)); + X509CertificateHolder certHolder = (X509CertificateHolder) reader.readObject(); + reader.close(); + + X509Certificate cert = certificateConverter.getCertificate(certHolder); + + /** + * Load client private key + */ + reader = new PEMParser(new FileReader(keyFile)); + Object keyObject = reader.readObject(); + reader.close(); + + + PEMDecryptorProvider provider = new JcePEMDecryptorProviderBuilder().build(password.toCharArray()); + JcaPEMKeyConverter keyConverter = new JcaPEMKeyConverter().setProvider("BC"); + + KeyPair key; + + if (keyObject instanceof PEMEncryptedKeyPair) { + key = keyConverter.getKeyPair(((PEMEncryptedKeyPair) keyObject).decryptKeyPair(provider)); + } else { + key = keyConverter.getKeyPair((PEMKeyPair) keyObject); + } + + /** + * CA certificate is used to authenticate server + */ + KeyStore caKeyStore = KeyStore.getInstance(KeyStore.getDefaultType()); + caKeyStore.load(null, null); + caKeyStore.setCertificateEntry("ca-certificate", caCert); + + TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance( + TrustManagerFactory.getDefaultAlgorithm()); + trustManagerFactory.init(caKeyStore); + + /** + * Client key and certificates are sent to server so it can authenticate the client + */ + KeyStore clientKeyStore = KeyStore.getInstance(KeyStore.getDefaultType()); + clientKeyStore.load(null, null); + clientKeyStore.setCertificateEntry("certificate", cert); + clientKeyStore.setKeyEntry("private-key", key.getPrivate(), password.toCharArray(), + new Certificate[]{cert}); + + KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance( + KeyManagerFactory.getDefaultAlgorithm()); + keyManagerFactory.init(clientKeyStore, password.toCharArray()); + + /** + * Create SSL socket factory + */ + SSLContext context = SSLContext.getInstance("TLSv1.2"); + context.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null); + + /** + * Return the newly created socket factory object + */ + return context.getServerSocketFactory(); + + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + public static String bytesToHex(byte[] bytes) { + char[] hexChars = new char[bytes.length * 2]; + for (int j = 0; j < bytes.length; j++) { + int v = bytes[j] & 0xFF; + hexChars[j * 2] = HEX_ARRAY[v >>> 4]; + hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F]; + } + return new String(hexChars); + } + + public static byte[] hexStringToByteArray(String s) { + int len = s.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + + Character.digit(s.charAt(i+1), 16)); + } + return data; + } + + public static String intToHex(int i) { + String s = Integer.toHexString(i).toUpperCase(); + return s.length() % 2 == 0 ? s : "0" + s; + } + + public static String prototoJson(MessageOrBuilder messageOrBuilder) throws IOException { + return JsonFormat.printer().print(messageOrBuilder); + } +} diff --git a/src/main/proto/bnet/protocol/example.proto b/src/main/proto/bnet/protocol/example.proto new file mode 100644 index 0000000..8ee4572 --- /dev/null +++ b/src/main/proto/bnet/protocol/example.proto @@ -0,0 +1,11 @@ +syntax = "proto2"; +package com.example; + +option java_package = "com.alterdekim"; +option java_outer_classname = "exampleProtocol"; + +message Test { + optional int32 a = 1; + optional fixed32 c = 3; + optional string b = 2; +} \ No newline at end of file diff --git a/src/main/proto/bnet/protocol/protocol.proto b/src/main/proto/bnet/protocol/protocol.proto new file mode 100644 index 0000000..457e9d3 --- /dev/null +++ b/src/main/proto/bnet/protocol/protocol.proto @@ -0,0 +1,2060 @@ +syntax = "proto2"; +package bnet.protocol; + +// Proto extractor compiled unit - https://github.com/HearthSim/proto-extractor + +option java_package = "com.alterdekim"; +option java_outer_classname = "Protocol"; + +// ref: bnet.protocol.attribute.Attribute +message Attribute { + required string name = 1; + required Variant value = 2; +} + +// ref: bnet.protocol.attribute.AttributeFilter +message AttributeFilter { + // ref: bnet.protocol.attribute.AttributeFilter/Types/Operation + enum Operation { + MATCH_NONE = 0; + MATCH_ANY = 1; + MATCH_ALL = 2; + MATCH_ALL_MOST_SPECIFIC = 3; + } + + required Operation op = 1; + repeated Attribute attribute = 2; +} + +// ref: bnet.protocol.attribute.Variant +message Variant { + optional bool bool_value = 2; + optional int64 int_value = 3; + optional double float_value = 4; + optional string string_value = 5; + optional bytes blob_value = 6; + optional bytes message_value = 7; + optional string fourcc_value = 8; + optional uint64 uint_value = 9; + optional bnet.protocol.EntityId entityid_value = 10; +} + + + +// ref: bnet.protocol.AccountInfo +message AccountInfo { + optional bool account_paid = 1 [default = false]; + optional fixed32 country_id = 2 [default = 0]; + optional string battle_tag = 3; + optional bool manual_review = 4 [default = false]; +} + +// ref: bnet.protocol.Address +message Address { + required string address = 1; + optional uint32 port = 2; +} + +// ref: bnet.protocol.ContentHandle +message ContentHandle { + required fixed32 region = 1; + required fixed32 usage = 2; + required bytes hash = 3; + optional string proto_url = 4; +} + +// ref: bnet.protocol.EntityId +message EntityId { + required fixed64 high = 1; + required fixed64 low = 2; +} + +// ref: bnet.protocol.ErrorInfo +message ErrorInfo { + required ObjectAddress object_address = 1; + required uint32 status = 2; + required uint32 service_hash = 3; + required uint32 method_id = 4; +} + +// ref: bnet.protocol.Header +message Header { + required uint32 service_id = 1; + optional uint32 method_id = 2; + required uint32 token = 3; + optional uint64 object_id = 4 [default = 0]; + optional uint32 size = 5 [default = 0]; + optional uint32 status = 6 [default = 0]; + repeated ErrorInfo error = 7; + optional uint64 timeout = 8; +} + +// ref: bnet.protocol.Identity +message Identity { + optional EntityId account_id = 1; + optional EntityId game_account_id = 2; +} + +// ref: bnet.protocol.NoData +message NoData { +} + +// ref: bnet.protocol.NORESPONSE +message NORESPONSE { +} + +// ref: bnet.protocol.ObjectAddress +message ObjectAddress { + required ProcessId host = 1; + optional uint64 object_id = 2 [default = 0]; +} + +// ref: bnet.protocol.Path +message Path { + repeated uint32 ordinal = 1 [packed=true]; +} + +// ref: bnet.protocol.Privilege +message Privilege { + required string name = 1; + required uint32 value = 2; +} + +// ref: bnet.protocol.ProcessId +message ProcessId { + required uint32 label = 1; + required uint32 epoch = 2; +} + +// ref: bnet.protocol.Role +message Role { + required uint32 id = 1; + required string name = 2; + repeated string privilege = 3; + repeated uint32 assignable_role = 4 [packed=true]; + optional bool required = 5 [default = false]; + optional bool unique = 6 [default = false]; + optional uint32 relegation_role = 7; + repeated bnet.protocol.Attribute attribute = 8; +} + +// ref: bnet.protocol.RoleSet +message RoleSet { + required string program = 1; + required string service = 2; + optional string subtype = 3 [default = "default"]; + repeated Role role = 4; + repeated uint32 default_role = 5 [packed=true]; + optional int32 max_members = 6; + repeated bnet.protocol.Attribute attribute = 7; +} + +// ref: bnet.protocol.RoleSetConfig +message RoleSetConfig { + repeated Privilege privilege = 1; + required RoleSet role_set = 2; +} + +/////////////// protocol end + +// ref: bnet.protocol.account.AccountBlob +message AccountBlob { + required fixed32 id = 2; + required uint32 region = 3; + repeated string email = 4; + required uint64 flags = 5; + optional uint64 secure_release = 6; + optional uint64 whitelist_start = 7; + optional uint64 whitelist_end = 8; + required string full_name = 10; + repeated AccountLicense licenses = 20; + repeated AccountCredential credentials = 21; + repeated GameAccountLink account_links = 22; + optional string battle_tag = 23; + optional fixed32 default_currency = 25; + optional uint32 legal_region = 26; + optional fixed32 legal_locale = 27; + required uint64 cache_expiration = 30; + optional ParentalControlInfo parental_control_info = 31; + optional string country = 32; + optional uint32 preferred_region = 33; +} + +// ref: bnet.protocol.account.AccountBlobList +message AccountBlobList { + repeated AccountBlob blob = 1; +} + +// ref: bnet.protocol.account.AccountCredential +message AccountCredential { + required uint32 id = 1; + optional bytes data = 2; +} + +// ref: bnet.protocol.account.AccountFieldOptions +message AccountFieldOptions { + optional bool all_f1elds = 1; // clashes + optional bool field_account_level_info = 2; + optional bool field_privacy_info = 3; + optional bool field_parental_control_info = 4; + optional bool field_game_level_info = 6; + optional bool field_game_status = 7; + optional bool field_game_accounts = 8; +} + +// ref: bnet.protocol.account.AccountFieldTags +message AccountFieldTags { + optional fixed32 account_level_info_tag = 2; + optional fixed32 privacy_info_tag = 3; + optional fixed32 parental_control_info_tag = 4; + repeated ProgramTag game_level_info_tags = 7; + repeated ProgramTag game_status_tags = 9; + repeated RegionTag game_account_tags = 11; +} + +// ref: bnet.protocol.account.AccountId +message AccountId { + required fixed32 id = 1; +} + +// ref: bnet.protocol.account.AccountLevelInfo +message AccountLevelInfo { + repeated AccountLicense licenses = 3; + optional fixed32 default_currency = 4; + optional string country = 5; + optional uint32 preferred_region = 6; +} + +// ref: bnet.protocol.account.AccountLicense +message AccountLicense { + required uint32 id = 1; + optional uint64 expires = 2; +} + +// ref: bnet.protocol.account.AccountReference +message AccountReference { + optional fixed32 id = 1; + optional string email = 2; + optional GameAccountHandle handle = 3; + optional string battle_tag = 4; + optional uint32 region = 10 [default = 0]; +} + +// ref: bnet.protocol.account.AccountServiceConfig +message AccountServiceConfig { + repeated AccountServiceRegion region = 1; +} + +// ref: bnet.protocol.account.AccountServiceRegion +message AccountServiceRegion { + required uint32 id = 1; + required string shard = 2; +} + +// ref: bnet.protocol.account.AccountState +message AccountState { + optional AccountLevelInfo account_level_info = 1; + optional PrivacyInfo privacy_info = 2; + optional ParentalControlInfo parental_control_info = 3; + repeated GameLevelInfo game_level_info = 5; + repeated GameStatus game_status = 6; + repeated GameAccountList game_accounts = 7; +} + +// ref: bnet.protocol.account.AccountStateNotification +message AccountStateNotification { + optional AccountState state = 1; + optional uint64 subscriber_id = 2; + optional AccountFieldTags account_tags = 3; + optional bool subscription_completed = 4; +} + +// ref: bnet.protocol.account.AccountStateTagged +message AccountStateTagged { + optional AccountState account_state = 1; + optional AccountFieldTags tags = 2; +} + +// ref: bnet.protocol.account.CacheExpireRequest +message CacheExpireRequest { + repeated AccountId account = 1; + repeated GameAccountHandle game_account = 2; + repeated string email = 3; +} + +// ref: bnet.protocol.account.CAIS +message CAIS { + optional uint32 played_minutes = 1; + optional uint32 rested_minutes = 2; + optional uint64 last_heard_time = 3; +} + +// ref: bnet.protocol.account.CreateGameAccountRequest +message CreateGameAccountRequest { + optional AccountId account = 1; + optional uint32 region = 2; + optional fixed32 program = 3; + optional uint32 realm_permissions = 4 [default = 1]; +} + +// ref: bnet.protocol.account.CredentialUpdateRequest +message CredentialUpdateRequest { + required AccountId account = 1; + repeated AccountCredential old_credentials = 2; + repeated AccountCredential new_credentials = 3; + optional uint32 region = 4; +} + +// ref: bnet.protocol.account.CredentialUpdateResponse +message CredentialUpdateResponse { +} + +// ref: bnet.protocol.account.CurrencyRestriction +message CurrencyRestriction { + required string currency = 1; + required string authenticator_cap = 2; + required string soft_cap = 3; +} + +// ref: bnet.protocol.account.FlagUpdateRequest +message FlagUpdateRequest { + required AccountId account = 1; + optional uint32 region = 2; + required uint64 flag = 3; + required bool active = 4; +} + +// ref: bnet.protocol.account.FlagUpdateResponse +message FlagUpdateResponse { +} + +// ref: bnet.protocol.account.ForwardCacheExpireRequest +message ForwardCacheExpireRequest { + optional bnet.protocol.EntityId entity_id = 1; +} + +// ref: bnet.protocol.account.GameAccountBlob +message GameAccountBlob { + required GameAccountHandle game_account = 1; + optional string name = 2 [default = ""]; + optional uint32 realm_permissions = 3 [default = 0]; + required uint32 status = 4; + optional uint64 flags = 5 [default = 0]; + optional uint32 billing_flags = 6 [default = 0]; + required uint64 cache_expiration = 7; + optional uint64 subscription_expiration = 10; + optional uint32 units_remaining = 11; + optional uint64 status_expiration = 12; + optional uint32 box_level = 13; + optional uint64 box_level_expiration = 14; + repeated AccountLicense licenses = 20; +} + +// ref: bnet.protocol.account.GameAccountBlobList +message GameAccountBlobList { + repeated GameAccountBlob blob = 1; +} + +// ref: bnet.protocol.account.GameAccountFieldOptions +message GameAccountFieldOptions { + optional bool all_f1elds = 1; // clashes + optional bool field_game_level_info = 2; + optional bool field_game_time_info = 3; + optional bool field_game_status = 4; +} + +// ref: bnet.protocol.account.GameAccountFieldTags +message GameAccountFieldTags { + optional fixed32 game_level_info_tag = 2; + optional fixed32 game_time_info_tag = 3; + optional fixed32 game_status_tag = 4; +} + +// ref: bnet.protocol.account.GameAccountHandle +message GameAccountHandle { + required fixed32 id = 1; + required fixed32 program = 2; + required uint32 region = 3; +} + +// ref: bnet.protocol.account.GameAccountLink +message GameAccountLink { + required GameAccountHandle game_account = 1; + required string name = 2; +} + +// ref: bnet.protocol.account.GameAccountList +message GameAccountList { + optional uint32 region = 3; + repeated GameAccountHandle handle = 4; +} + +// ref: bnet.protocol.account.GameAccountNotification +message GameAccountNotification { + repeated GameAccountList region_delta = 1; + optional uint64 subscriber_id = 2; + optional AccountFieldTags account_tags = 3; +} + +// ref: bnet.protocol.account.GameAccountSessionNotification +message GameAccountSessionNotification { + optional GameAccountHandle game_account = 1; + optional GameSessionUpdateInfo session_info = 2; +} + +// ref: bnet.protocol.account.GameAccountState +message GameAccountState { + optional GameLevelInfo game_level_info = 1; + optional GameTimeInfo game_time_info = 2; + optional GameStatus game_status = 3; +} + +// ref: bnet.protocol.account.GameAccountStateNotification +message GameAccountStateNotification { + optional GameAccountState state = 1; + optional uint64 subscriber_id = 2; + optional GameAccountFieldTags game_account_tags = 3; + optional bool subscription_completed = 4; +} + +// ref: bnet.protocol.account.GameAccountStateTagged +message GameAccountStateTagged { + optional GameAccountState game_account_state = 1; + optional GameAccountFieldTags game_account_tags = 2; +} + +// ref: bnet.protocol.account.GameLevelInfo +message GameLevelInfo { + optional bool is_starter_edition = 3; + optional bool is_trial = 4; + optional bool is_lifetime = 5; + optional bool is_restricted = 6; + optional bool is_beta = 7; + optional string name = 8; + optional fixed32 program = 9; + repeated AccountLicense licenses = 10; + optional uint32 realm_permissions = 11; +} + +// ref: bnet.protocol.account.GameSessionInfo +message GameSessionInfo { + optional uint32 start_time = 3; + optional GameSessionLocation location = 4; + optional bool has_benefactor = 5; + optional bool is_using_igr = 6; + optional bool parental_controls_active = 7; +} + +// ref: bnet.protocol.account.GameSessionLocation +message GameSessionLocation { + optional string ip_address = 1; + optional uint32 country = 2; + optional string city = 3; +} + +// ref: bnet.protocol.account.GameSessionUpdateInfo +message GameSessionUpdateInfo { + optional CAIS cais = 8; +} + +// ref: bnet.protocol.account.GameStatus +message GameStatus { + optional bool is_suspended = 4; + optional bool is_banned = 5; + optional uint64 suspension_expires = 6; + optional fixed32 program = 7; +} + +// ref: bnet.protocol.account.GameTimeInfo +message GameTimeInfo { + optional bool is_unlimited_play_time = 3; + optional uint64 play_time_expires = 5; + optional bool is_subscription = 6; + optional bool is_recurring_subscription = 7; +} + +// ref: bnet.protocol.account.GameTimeRemainingInfo +message GameTimeRemainingInfo { + optional uint32 minutes_remaining = 1; + optional uint32 parental_daily_minutes_remaining = 2; + optional uint32 parental_weekly_minutes_remaining = 3; +} + +// ref: bnet.protocol.account.GetAccountRequest +message GetAccountRequest { + optional AccountReference ref = 1; + optional bool fetch_all = 10 [default = false]; + optional bool fetch_blob = 11 [default = false]; + optional bool fetch_id = 12 [default = false]; + optional bool fetch_email = 13 [default = false]; + optional bool fetch_battle_tag = 14 [default = false]; + optional bool fetch_full_name = 15 [default = false]; + optional bool fetch_links = 16 [default = false]; + optional bool fetch_parental_controls = 17 [default = false]; +} + +// ref: bnet.protocol.account.GetAccountResponse +message GetAccountResponse { + optional AccountBlob blob = 11; + optional AccountId id = 12; + repeated string email = 13; + optional string battle_tag = 14; + optional string full_name = 15; + repeated GameAccountLink links = 16; + optional ParentalControlInfo parental_control_info = 17; +} + +// ref: bnet.protocol.account.GetAccountStateRequest +message GetAccountStateRequest { + optional bnet.protocol.EntityId entity_id = 1; + optional uint32 program = 2; + optional uint32 region = 3; + optional AccountFieldOptions options = 10; + optional AccountFieldTags tags = 11; +} + +// ref: bnet.protocol.account.GetAccountStateResponse +message GetAccountStateResponse { + optional AccountState state = 1; + optional AccountFieldTags tags = 2; +} + +// ref: bnet.protocol.account.GetCAISInfoRequest +message GetCAISInfoRequest { + optional bnet.protocol.EntityId entity_id = 1; +} + +// ref: bnet.protocol.account.GetCAISInfoResponse +message GetCAISInfoResponse { + optional CAIS cais_info = 1; +} + +// ref: bnet.protocol.account.GetEBalanceRequest +message GetEBalanceRequest { + required AccountId account_id = 1; + required string currency = 2; + optional uint32 currency_home_region = 3; +} + +// ref: bnet.protocol.account.GetEBalanceResponse +message GetEBalanceResponse { + optional string balance = 1; +} + +// ref: bnet.protocol.account.GetEBalanceRestrictionsRequest +message GetEBalanceRestrictionsRequest { + optional uint32 currency_home_region = 1; +} + +// ref: bnet.protocol.account.GetEBalanceRestrictionsResponse +message GetEBalanceRestrictionsResponse { + repeated CurrencyRestriction currency_restrictions = 1; +} + +// ref: bnet.protocol.account.GetGameAccountStateRequest +message GetGameAccountStateRequest { + optional bnet.protocol.EntityId account_id = 1; + optional bnet.protocol.EntityId game_account_id = 2; + optional GameAccountFieldOptions options = 10; + optional GameAccountFieldTags tags = 11; +} + +// ref: bnet.protocol.account.GetGameAccountStateResponse +message GetGameAccountStateResponse { + optional GameAccountState state = 1; + optional GameAccountFieldTags tags = 2; +} + +// ref: bnet.protocol.account.GetGameSessionInfoRequest +message GetGameSessionInfoRequest { + optional bnet.protocol.EntityId entity_id = 1; +} + +// ref: bnet.protocol.account.GetGameSessionInfoResponse +message GetGameSessionInfoResponse { + optional GameSessionInfo session_info = 2; +} + +// ref: bnet.protocol.account.GetGameTimeRemainingInfoRequest +message GetGameTimeRemainingInfoRequest { + optional bnet.protocol.EntityId game_account_id = 1; + optional bnet.protocol.EntityId account_id = 2; +} + +// ref: bnet.protocol.account.GetGameTimeRemainingInfoResponse +message GetGameTimeRemainingInfoResponse { + optional GameTimeRemainingInfo game_time_remaining_info = 1; +} + +// ref: bnet.protocol.account.GetLicensesRequest +message GetLicensesRequest { + optional bnet.protocol.EntityId target_id = 1; + optional bool get_account_licenses = 2; + optional bool get_game_account_licenses = 3; + optional bool get_dynamic_account_licenses = 4; + optional fixed32 program_id = 5; + optional bool exclude_unknown_program = 6 [default = false]; +} + +// ref: bnet.protocol.account.GetLicensesResponse +message GetLicensesResponse { + repeated AccountLicense licenses = 1; +} + +// ref: bnet.protocol.account.GetWalletListRequest +message GetWalletListRequest { + required AccountId account_id = 1; + optional bool refresh = 2 [default = false]; +} + +// ref: bnet.protocol.account.GetWalletListResponse +message GetWalletListResponse { + repeated Wallet wallets = 1; +} + +// ref: bnet.protocol.account.IsIgrAddressRequest +message IsIgrAddressRequest { + optional string client_address = 1; + optional uint32 region = 2; +} + +// ref: bnet.protocol.account.ParentalControlInfo +message ParentalControlInfo { + optional string timezone = 3; + optional uint32 minutes_per_day = 4; + optional uint32 minutes_per_week = 5; + optional bool can_receive_voice = 6; + optional bool can_send_voice = 7; + repeated bool play_schedule = 8; +} + +// ref: bnet.protocol.account.PrivacyInfo +message PrivacyInfo { + // ref: bnet.protocol.account.PrivacyInfo/Types/GameInfoPrivacy + enum GameInfoPrivacy { + PRIVACY_ME = 0; + PRIVACY_FRIENDS = 1; + PRIVACY_EVERYONE = 2; + } + + optional bool is_using_rid = 3; + optional bool is_real_id_visible_for_view_friends = 4; + optional bool is_hidden_from_friend_finder = 5; + optional GameInfoPrivacy game_info_privacy = 6 [default = PRIVACY_FRIENDS]; +} + +// ref: bnet.protocol.account.ProgramTag +message ProgramTag { + optional fixed32 program = 1; + optional fixed32 tag = 2; +} + +// ref: bnet.protocol.account.RegionTag +message RegionTag { + optional fixed32 region = 1; + optional fixed32 tag = 2; +} + +// ref: bnet.protocol.account.SubscriberReference +message SubscriberReference { + optional uint64 object_id = 1 [default = 0]; + optional bnet.protocol.EntityId entity_id = 2; + optional AccountFieldOptions account_options = 3; + optional AccountFieldTags account_tags = 4; + optional GameAccountFieldOptions game_account_options = 5; + optional GameAccountFieldTags game_account_tags = 6; +} + +// ref: bnet.protocol.account.SubscriptionUpdateRequest +message SubscriptionUpdateRequest { + repeated SubscriberReference ref = 2; +} + +// ref: bnet.protocol.account.SubscriptionUpdateResponse +message SubscriptionUpdateResponse { + repeated SubscriberReference ref = 1; +} + +// ref: bnet.protocol.account.Wallet +message Wallet { + required uint32 region = 1; + required uint64 wallet_id = 2; + required uint32 wallet_type = 3; + optional string description = 4; + required uint32 country_id = 5; + optional string state = 6; + optional string city = 7; + optional string postal_code = 8; + optional bytes payment_info = 9; + optional string bin = 10; + optional string locale_id = 11; + optional string street = 12; + optional string first_name = 13; + optional string last_name = 14; + optional uint64 birth_date = 15; +} + +// ref: bnet.protocol.account.Wallets +message Wallets { + repeated Wallet wallets = 1; +} + + +/////////////// + + +// ref: bnet.protocol.authentication.AccountSettingsNotification +message AccountSettingsNotification { + repeated bnet.protocol.AccountLicense licenses = 1; + optional bool is_using_rid = 2; + optional bool is_playing_from_igr = 3; + optional bool can_receive_voice = 4; + optional bool can_send_voice = 5; +} + +// ref: bnet.protocol.authentication.GameAccountSelectedRequest +message GameAccountSelectedRequest { + required uint32 result = 1; + optional bnet.protocol.EntityId game_account = 2; +} + +// ref: bnet.protocol.authentication.GenerateSSOTokenRequest +message GenerateSSOTokenRequest { + optional fixed32 program = 1; +} + +// ref: bnet.protocol.authentication.GenerateSSOTokenResponse +message GenerateSSOTokenResponse { + optional bytes sso_id = 1; + optional bytes sso_secret = 2; +} + +// ref: bnet.protocol.authentication.LogonQueueUpdateRequest +message LogonQueueUpdateRequest { + required uint32 position = 1; + required uint64 estimated_time = 2; + required uint64 eta_deviation_in_sec = 3; +} + +// ref: bnet.protocol.authentication.LogonRequest +message LogonRequest { + optional string program = 1; + optional string platform = 2; + optional string locale = 3; + optional string email = 4; + optional string version = 5; + optional int32 application_version = 6; + optional bool public_computer = 7; + optional bytes sso_id = 8; + optional bool disconnect_on_cookie_fail = 9 [default = false]; + optional bool allow_logon_queue_notifications = 10 [default = false]; + optional bool web_client_verification = 11 [default = false]; + optional bytes cached_web_credentials = 12; + optional string user_agent = 14; +} + +// ref: bnet.protocol.authentication.LogonResult +message LogonResult { + required uint32 error_code = 1; + optional bnet.protocol.EntityId account = 2; + repeated bnet.protocol.EntityId game_account = 3; + optional string email = 4; + repeated uint32 available_region = 5; + optional uint32 connected_region = 6; + optional string battle_tag = 7; + optional string geoip_country = 8; +} + +// ref: bnet.protocol.authentication.LogonUpdateRequest +message LogonUpdateRequest { + required uint32 error_code = 1; +} + +// ref: bnet.protocol.authentication.MemModuleLoadRequest +message MemModuleLoadRequest { + required bnet.protocol.ContentHandle handle = 1; + required bytes key = 2; + required bytes input = 3; +} + +// ref: bnet.protocol.authentication.MemModuleLoadResponse +message MemModuleLoadResponse { + required bytes data = 1; +} + +// ref: bnet.protocol.authentication.ModuleLoadRequest +message ModuleLoadRequest { + required bnet.protocol.ContentHandle module_handle = 1; + optional bytes message = 2; +} + +// ref: bnet.protocol.authentication.ModuleMessageRequest +message ModuleMessageRequest { + required int32 module_id = 1; + optional bytes message = 2; +} + +// ref: bnet.protocol.authentication.ModuleNotification +message ModuleNotification { + optional int32 module_id = 2; + optional uint32 result = 3; +} + +// ref: bnet.protocol.authentication.SelectGameAccountRequest +message SelectGameAccountRequest { + required bnet.protocol.EntityId game_account = 1; +} + +// ref: bnet.protocol.authentication.ServerStateChangeRequest +message ServerStateChangeRequest { + required uint32 state = 1; + required uint64 event_time = 2; +} + +// ref: bnet.protocol.authentication.VerifyWebCredentialsRequest +message VerifyWebCredentialsRequest { + optional bytes web_credentials = 1; +} + +// ref: bnet.protocol.authentication.VersionInfo +message VersionInfo { + optional uint32 number = 1; + optional string patch = 2; + optional bool is_optional = 3; + optional uint64 kick_time = 4; +} + +// ref: bnet.protocol.authentication.VersionInfoNotification +message VersionInfoNotification { + optional VersionInfo version_info = 1; +} + +//////////////// + + +// ref: bnet.protocol.challenge.Challenge +message Challenge { + required fixed32 type = 1; + optional string info = 2; + optional string answer = 3; + optional uint32 retries = 4; +} + +// ref: bnet.protocol.challenge.ChallengeAnsweredRequest +message ChallengeAnsweredRequest { + required string answer = 1; + optional bytes data = 2; + optional uint32 id = 3; +} + +// ref: bnet.protocol.challenge.ChallengeAnsweredResponse +message ChallengeAnsweredResponse { + optional bytes data = 1; + optional bool do_retry = 2; + optional bool record_not_found = 3; +} + +// ref: bnet.protocol.challenge.ChallengeCancelledRequest +message ChallengeCancelledRequest { + optional uint32 id = 1; +} + +// ref: bnet.protocol.challenge.ChallengeExternalRequest +message ChallengeExternalRequest { + optional string request_token = 1; + optional string payload_type = 2; + optional bytes payload = 3; +} + +// ref: bnet.protocol.challenge.ChallengeExternalResult +message ChallengeExternalResult { + optional string request_token = 1; + optional bool passed = 2 [default = true]; +} + +// ref: bnet.protocol.challenge.ChallengePickedRequest +message ChallengePickedRequest { + required fixed32 challenge = 1; + optional uint32 id = 2; + optional bool new_challenge_protocol = 3 [default = false]; +} + +// ref: bnet.protocol.challenge.ChallengePickedResponse +message ChallengePickedResponse { + optional bytes data = 1; +} + +// ref: bnet.protocol.challenge.ChallengeResultRequest +message ChallengeResultRequest { + optional uint32 id = 1; + optional fixed32 type = 2; + optional uint32 error_id = 3; + optional bytes answer = 4; +} + +// ref: bnet.protocol.challenge.ChallengeUserRequest +message ChallengeUserRequest { + repeated Challenge challenges = 1; + required fixed32 context = 2; + optional uint32 id = 3; + optional uint64 deadline = 4; + repeated bnet.protocol.Attribute attributes = 5; + optional bnet.protocol.EntityId game_account_id = 6; +} + +// ref: bnet.protocol.challenge.SendChallengeToUserRequest +message SendChallengeToUserRequest { + optional bnet.protocol.ProcessId peer_id = 1; + optional bnet.protocol.EntityId game_account_id = 2; + repeated Challenge challenges = 3; + required fixed32 context = 4; + optional uint64 timeout = 5; + repeated bnet.protocol.Attribute attributes = 6; +} + +// ref: bnet.protocol.challenge.SendChallengeToUserResponse +message SendChallengeToUserResponse { + optional uint32 id = 1; +} + +////// chat + +// ref: bnet.protocol.chat.ChannelState +message ChannelState { + optional string identity = 1; + optional fixed32 program = 2; + optional fixed32 locale = 3; + optional bool public = 4 [default = false]; + optional uint32 bucket_index = 5; +} + +/////////////////// + +// ref: bnet.protocol.config.RPCMeterConfig +message RPCMeterConfig { + repeated RPCMethodConfig method = 1; + optional uint32 income_per_second = 2 [default = 1]; + optional uint32 initial_balance = 3; + optional uint32 cap_balance = 4; + optional float startup_period = 5 [default = 0]; +} + +// ref: bnet.protocol.config.RPCMethodConfig +message RPCMethodConfig { + optional string service_name = 1; + optional string method_name = 2; + optional uint32 fixed_call_cost = 3 [default = 1]; + optional uint32 fixed_packet_size = 4 [default = 0]; + optional float variable_multiplier = 5 [default = 0]; + optional float multiplier = 6 [default = 1]; + optional uint32 rate_limit_count = 7; + optional uint32 rate_limit_seconds = 8; + optional uint32 max_packet_size = 9; + optional uint32 max_encoded_size = 10; + optional float timeout = 11; +} + +///////////////// conn + +// ref: bnet.protocol.connection.BindRequest +message BindRequest { + repeated fixed32 imported_service_hash = 1; + repeated BoundService exported_service = 2; +} + +// ref: bnet.protocol.connection.BindResponse +message BindResponse { + repeated uint32 imported_service_id = 1 [packed=true]; +} + +// ref: bnet.protocol.connection.BoundService +message BoundService { + required fixed32 hash = 1; + required uint32 id = 2; +} + +// ref: bnet.protocol.connection.ConnectionMeteringContentHandles +message ConnectionMeteringContentHandles { + repeated bnet.protocol.ContentHandle content_handle = 1; +} + +// ref: bnet.protocol.connection.ConnectRequest +message ConnectRequest { + optional bnet.protocol.ProcessId client_id = 1; + optional BindRequest bind_request = 2; +} + +// ref: bnet.protocol.connection.ConnectResponse +message ConnectResponse { + required bnet.protocol.ProcessId server_id = 1; + optional bnet.protocol.ProcessId client_id = 2; + optional uint32 bind_result = 3; + optional BindResponse bind_response = 4; + optional ConnectionMeteringContentHandles content_handle_array = 5; + optional uint64 server_time = 6; +} + +// ref: bnet.protocol.connection.DisconnectNotification +message DisconnectNotification { + required uint32 error_code = 1; + optional string reason = 2; +} + +// ref: bnet.protocol.connection.DisconnectRequest +message DisconnectRequest { + required uint32 error_code = 1; +} + +// ref: bnet.protocol.connection.EchoRequest +message EchoRequest { + optional fixed64 time = 1; + optional bool network_only = 2 [default = false]; + optional bytes payload = 3; +} + +// ref: bnet.protocol.connection.EchoResponse +message EchoResponse { + optional fixed64 time = 1; + optional bytes payload = 2; +} + +// ref: bnet.protocol.connection.EncryptRequest +message EncryptRequest { +} + +////// game_utilities + +// ref: bnet.protocol.game_utilities.ClientRequest +message ClientRequest { + repeated bnet.protocol.Attribute attribute = 1; + optional bnet.protocol.ProcessId host = 2; + optional bnet.protocol.EntityId bnet_account_id = 3; + optional bnet.protocol.EntityId game_account_id = 4; +} + +// ref: bnet.protocol.game_utilities.ClientResponse +message ClientResponse { + repeated bnet.protocol.Attribute attribute = 1; +} + +// ref: bnet.protocol.game_utilities.GameAccountOfflineNotification +message GameAccountOfflineNotification { + required bnet.protocol.EntityId game_account_id = 1; + optional bnet.protocol.ProcessId host = 2; +} + +// ref: bnet.protocol.game_utilities.GameAccountOnlineNotification +message GameAccountOnlineNotification { + required bnet.protocol.EntityId game_account_id = 1; + optional bnet.protocol.ProcessId host = 2; +} + +// ref: bnet.protocol.game_utilities.GetPlayerVariablesRequest +message GetPlayerVariablesRequest { + repeated PlayerVariables player_variables = 1; + optional bnet.protocol.ProcessId host = 2; +} + +// ref: bnet.protocol.game_utilities.GetPlayerVariablesResponse +message GetPlayerVariablesResponse { + repeated PlayerVariables player_variables = 1; +} + +// ref: bnet.protocol.game_utilities.PlayerVariables +message PlayerVariables { + required bnet.protocol.Identity identity = 1; + optional double rating = 2; + repeated bnet.protocol.Attribute attribute = 3; +} + +// ref: bnet.protocol.game_utilities.PresenceChannelCreatedRequest +message PresenceChannelCreatedRequest { + required bnet.protocol.EntityId id = 1; + optional bnet.protocol.EntityId game_account_id = 3; + optional bnet.protocol.EntityId bnet_account_id = 4; + optional bnet.protocol.ProcessId host = 5; +} + +// ref: bnet.protocol.game_utilities.ServerRequest +message ServerRequest { + repeated bnet.protocol.Attribute attribute = 1; + required fixed32 program = 2; + optional bnet.protocol.ProcessId host = 3; +} + +// ref: bnet.protocol.game_utilities.ServerResponse +message ServerResponse { + repeated bnet.protocol.Attribute attribute = 1; +} + + + +// ref: bnet.protocol.notification.FindClientRequest +message FindClientRequest { + required bnet.protocol.EntityId entity_id = 1; +} + +// ref: bnet.protocol.notification.FindClientResponse +message FindClientResponse { + required uint32 label = 1; + optional bnet.protocol.ProcessId client_process_id = 2; +} + +// ref: bnet.protocol.notification.Notification +message Notification { + optional bnet.protocol.EntityId sender_id = 1; + required bnet.protocol.EntityId target_id = 2; + required string type = 3; + repeated bnet.protocol.Attribute attribute = 4; + optional bnet.protocol.EntityId sender_account_id = 5; + optional bnet.protocol.EntityId target_account_id = 6; + optional string sender_battle_tag = 7; +} + +// ref: bnet.protocol.notification.RegisterClientRequest +message RegisterClientRequest { + required bnet.protocol.EntityId entity_id = 1; +} + +// ref: bnet.protocol.notification.UnregisterClientRequest +message UnregisterClientRequest { + required bnet.protocol.EntityId entity_id = 1; +} + +// + +// ref: bnet.protocol.presence.ChannelState +message PresenceChannelState { + optional bnet.protocol.EntityId entity_id = 1; + repeated FieldOperation field_operation = 2; + optional bool healing = 3 [default = false]; +} + +// ref: bnet.protocol.presence.Field +message Field { + required FieldKey key = 1; + required bnet.protocol.Variant value = 2; +} + +// ref: bnet.protocol.presence.FieldKey +message FieldKey { + required uint32 program = 1; + required uint32 group = 2; + required uint32 field = 3; + optional uint64 index = 4 [default = 0]; +} + +// ref: bnet.protocol.presence.FieldOperation +message FieldOperation { + // ref: bnet.protocol.presence.FieldOperation/Types/OperationType + enum OperationType { + SET = 0; + CLEAR = 1; + } + + required Field field = 1; + optional OperationType operation = 2 [default = SET]; +} + +// ref: bnet.protocol.presence.OwnershipRequest +message OwnershipRequest { + required bnet.protocol.EntityId entity_id = 1; + optional bool release_ownership = 2 [default = false]; +} + +// ref: bnet.protocol.presence.QueryRequest +message QueryRequest { + required bnet.protocol.EntityId entity_id = 1; + repeated FieldKey key = 2; +} + +// ref: bnet.protocol.presence.QueryResponse +message QueryResponse { + repeated Field field = 2; +} + +// ref: bnet.protocol.presence.RichPresence +message RichPresence { + required fixed32 program_id = 1; + required fixed32 stream_id = 2; + required uint32 index = 3; +} + +// ref: bnet.protocol.presence.SubscribeNotificationRequest +message SubscribeNotificationRequest { + required bnet.protocol.EntityId entity_id = 1; +} + +// ref: bnet.protocol.presence.SubscribeRequest +message SubscribeRequest { + optional bnet.protocol.EntityId agent_id = 1; + required bnet.protocol.EntityId entity_id = 2; + required uint64 object_id = 3; + repeated fixed32 program_id = 4; +} + +// ref: bnet.protocol.presence.UnsubscribeRequest +message UnsubscribeRequest { + optional bnet.protocol.EntityId agent_id = 1; + required bnet.protocol.EntityId entity_id = 2; +} + +// ref: bnet.protocol.presence.UpdateRequest +message UpdateRequest { + required bnet.protocol.EntityId entity_id = 1; + repeated FieldOperation field_operation = 2; +} + +// PresenceChannelState + +// ref: bnet.protocol.profanity.WordFilter +message WordFilter { + required string type = 1; + required string regex = 2; +} + +// ref: bnet.protocol.profanity.WordFilters +message WordFilters { + repeated WordFilter filters = 1; +} + + +// ref: bnet.protocol.resources.ContentHandleRequest +message ContentHandleRequest { + required fixed32 program_id = 1; + required fixed32 stream_id = 2; + optional fixed32 locale = 3 [default = 1701729619]; +} + +///////// + + +// ref: bnet.protocol.server_pool.GetLoadRequest +message GetLoadRequest { +} + +// ref: bnet.protocol.server_pool.PoolStateRequest +message PoolStateRequest { +} + +// ref: bnet.protocol.server_pool.PoolStateResponse +message PoolStateResponse { + repeated ServerInfo info = 1; +} + +// ref: bnet.protocol.server_pool.ServerInfo +message ServerInfo { + required bnet.protocol.ProcessId host = 1; + optional bool replace = 2 [default = false]; + optional ServerState state = 3; + repeated bnet.protocol.Attribute attribute = 4; + optional fixed32 program_id = 5; +} + +// ref: bnet.protocol.server_pool.ServerState +message ServerState { + optional float current_load = 1 [default = 1]; + optional uint32 game_count = 2 [default = 0]; + optional uint32 player_count = 3 [default = 0]; +} + +///////////// + +// ref: bnet.protocol.friends.AssignRoleRequest +message AssignRoleRequest { + optional bnet.protocol.EntityId agent_id = 1; + required bnet.protocol.EntityId target_id = 2; + repeated int32 role = 3; +} + +// ref: bnet.protocol.friends.Friend +message Friend { + required bnet.protocol.EntityId id = 1; + repeated bnet.protocol.Attribute attribute = 2; + repeated uint32 role = 3 [packed=true]; + optional uint64 privileges = 4 [default = 0]; + optional uint64 attributes_epoch = 5; + optional string full_name = 6; + optional string battle_tag = 7; +} + +// ref: bnet.protocol.friends.FriendInvitation +message FriendInvitation { + optional bool first_received = 1 [default = false]; + repeated uint32 role = 2 [packed=true]; +} + +// ref: bnet.protocol.friends.FriendInvitationParams +message FriendInvitationParams { + optional string target_email = 1; + optional string target_battle_tag = 2; + optional string inviter_battle_tag = 3; + optional string inviter_full_name = 4; + optional string invitee_display_name = 5; + repeated uint32 role = 6 [packed=true]; +} + +// ref: bnet.protocol.friends.FriendNotification +message FriendNotification { + required Friend target = 1; + optional bnet.protocol.EntityId game_account_id = 2; +} + +// ref: bnet.protocol.friends.GenericFriendRequest +message GenericFriendRequest { + optional bnet.protocol.EntityId agent_id = 1; + required bnet.protocol.EntityId target_id = 2; +} + +// ref: bnet.protocol.friends.GenericFriendResponse +message GenericFriendResponse { + optional Friend target_friend = 1; +} + +// ref: bnet.protocol.friends.InvitationNotification +message InvitationNotification { + required bnet.protocol.Invitation invitation = 1; + optional bnet.protocol.EntityId game_account_id = 2; + optional uint32 reason = 3 [default = 0]; +} + +// ref: bnet.protocol.friends.SubscribeToFriendsRequest +message SubscribeToFriendsRequest { + optional bnet.protocol.EntityId agent_id = 1; + required uint64 object_id = 2; +} + +// ref: bnet.protocol.friends.SubscribeToFriendsResponse +message SubscribeToFriendsResponse { + optional uint32 max_friends = 1; + optional uint32 max_received_invitations = 2; + optional uint32 max_sent_invitations = 3; + repeated bnet.protocol.Role role = 4; + repeated Friend friends = 5; + repeated bnet.protocol.Invitation sent_invitations = 6; + repeated bnet.protocol.Invitation received_invitations = 7; +} + +// ref: bnet.protocol.friends.UnsubscribeToFriendsRequest +message UnsubscribeToFriendsRequest { + optional bnet.protocol.EntityId agent_id = 1; + optional uint64 object_id = 2; +} + +// ref: bnet.protocol.friends.UpdateFriendStateNotification +message UpdateFriendStateNotification { + required Friend changed_friend = 1; + optional bnet.protocol.EntityId game_account_id = 2; +} + +// ref: bnet.protocol.friends.UpdateFriendStateRequest +message UpdateFriendStateRequest { + optional bnet.protocol.EntityId agent_id = 1; + required bnet.protocol.EntityId target_id = 2; + repeated bnet.protocol.Attribute attribute = 3; + optional uint64 attributes_epoch = 4; +} + +// ref: bnet.protocol.friends.ViewFriendsRequest +message ViewFriendsRequest { + optional bnet.protocol.EntityId agent_id = 1; + required bnet.protocol.EntityId target_id = 2; + repeated uint32 role = 3 [packed=true]; +} + +// ref: bnet.protocol.friends.ViewFriendsResponse +message ViewFriendsResponse { + repeated Friend friends = 1; +} + + +// + + +// ref: bnet.protocol.invitation.GenericRequest +message GenericRequest { + optional bnet.protocol.EntityId agent_id = 1; + optional bnet.protocol.EntityId target_id = 2; + required fixed64 invitation_id = 3; + optional string invitee_name = 4; + optional string inviter_name = 5; + repeated uint32 previous_role = 6 [packed=true]; + repeated uint32 desired_role = 7 [packed=true]; + optional uint32 reason = 8; +} + +// ref: bnet.protocol.invitation.Invitation +message Invitation { + required fixed64 id = 1; + required bnet.protocol.Identity inviter_identity = 2; + required bnet.protocol.Identity invitee_identity = 3; + optional string inviter_name = 4; + optional string invitee_name = 5; + optional string invitation_message = 6; + optional uint64 creation_time = 7; + optional uint64 expiration_time = 8; + optional bnet.protocol.FriendInvitation friend_invite = 103; + optional bnet.protocol.ChannelInvitation channel_invitation = 105; +} + +// ref: bnet.protocol.invitation.InvitationParams +message InvitationParams { + optional string invitation_message = 1; + optional uint64 expiration_time = 2 [default = 0]; + optional bnet.protocol.FriendInvitationParams friend_params = 103; + optional bnet.protocol.ChannelInvitationParams channel_params = 105; +} + +// ref: bnet.protocol.invitation.InvitationTarget +message InvitationTarget { + optional bnet.protocol.Identity identity = 1; + optional string email = 2; + optional string battle_tag = 3; +} + +// ref: bnet.protocol.invitation.SendInvitationRequest +message SendInvitationRequest { + optional bnet.protocol.Identity agent_identity = 1; + required bnet.protocol.EntityId target_id = 2; + required InvitationParams params = 3; + optional bnet.protocol.AccountInfo agent_info = 4; + optional InvitationTarget target = 5; +} + +// ref: bnet.protocol.invitation.SendInvitationResponse +message SendInvitationResponse { + optional Invitation invitation = 2; +} + +// ref: bnet.protocol.invitation.Suggestion +message Suggestion { + optional bnet.protocol.EntityId channel_id = 1; + required bnet.protocol.EntityId suggester_id = 2; + required bnet.protocol.EntityId suggestee_id = 3; + optional string suggester_name = 4; + optional string suggestee_name = 5; + optional bnet.protocol.EntityId suggester_account_id = 6; +} + +// ref: bnet.protocol.invitation.UpdateInvitationRequest +message UpdateInvitationRequest { + optional bnet.protocol.Identity agent_identity = 1; + required fixed64 invitation_id = 2; + required InvitationParams params = 3; +} + +// ref: bnet.protocol.game_master.CancelGameEntryRequest +message CancelGameEntryRequest { + required fixed64 request_id = 1; + optional fixed64 factory_id = 2; + repeated Player player = 3; +} + +// ref: bnet.protocol.game_master.ChangeGameRequest +message ChangeGameRequest { + required GameHandle game_handle = 1; + optional bool open = 2; + repeated bnet.protocol.Attribute attribute = 3; + optional bool replace = 4 [default = false]; +} + +// ref: bnet.protocol.game_master.ConnectInfo +message ConnectInfo { + required bnet.protocol.EntityId member_id = 1; + required string host = 2; + required int32 port = 3; + optional bytes token = 4; + repeated bnet.protocol.Attribute attribute = 5; +} + +// ref: bnet.protocol.game_master.FactoryUpdateNotification +message FactoryUpdateNotification { + // ref: bnet.protocol.game_master.FactoryUpdateNotification/Types/Operation + enum Operation { + ADD = 1; + REMOVE = 2; + CHANGE = 3; + } + + required Operation op = 1; + required GameFactoryDescription description = 2; + optional fixed32 program_id = 3; +} + +// ref: bnet.protocol.game_master.FindGameRequest +message FindGameRequest { + repeated Player player = 1; + optional fixed64 factory_id = 2; + optional GameProperties properties = 3; + optional uint64 object_id = 4; + optional fixed64 request_id = 5; + optional bool advanced_notification = 6 [default = false]; +} + +// ref: bnet.protocol.game_master.FindGameResponse +message FindGameResponse { + optional fixed64 request_id = 1; + optional fixed64 factory_id = 2; + optional bool queued = 3 [default = false]; +} + +// ref: bnet.protocol.game_master.GameEndedNotification +message GameEndedNotification { + required GameHandle game_handle = 1; + optional uint32 reason = 2 [default = 0]; +} + +// ref: bnet.protocol.game_master.GameFactoryDescription +message GameFactoryDescription { + required fixed64 id = 1; + optional string name = 2; + repeated bnet.protocol.Attribute attribute = 3; + repeated GameStatsBucket stats_bucket = 4; + optional fixed64 unseeded_id = 5 [default = 0]; + optional bool allow_queueing = 6 [default = true]; +} + +// ref: bnet.protocol.game_master.GameFoundNotification +message GameFoundNotification { + required fixed64 request_id = 1; + optional uint32 error_code = 2 [default = 0]; + optional GameHandle game_handle = 3; + repeated ConnectInfo connect_info = 4; +} + +// ref: bnet.protocol.game_master.GameHandle +message GameHandle { + required fixed64 factory_id = 1; + required bnet.protocol.EntityId game_id = 2; +} + +// ref: bnet.protocol.game_master.GameProperties +message GameProperties { + repeated bnet.protocol.Attribute creation_attributes = 1; + optional bnet.protocol.AttributeFilter filter = 2; + optional bool create = 3 [default = false]; + optional bool open = 4 [default = true]; + optional fixed32 program_id = 5; +} + +// ref: bnet.protocol.game_master.GameStatsBucket +message GameStatsBucket { + optional float bucket_min = 1 [default = 0]; + optional float bucket_max = 2 [default = 4.294967E+09]; + optional uint32 wait_milliseconds = 3 [default = 0]; + optional uint32 games_per_hour = 4 [default = 0]; + optional uint32 active_games = 5 [default = 0]; + optional uint32 active_players = 6 [default = 0]; + optional uint32 forming_games = 7 [default = 0]; + optional uint32 waiting_players = 8 [default = 0]; + optional uint32 open_joinable_games = 9 [default = 0]; + optional uint32 players_in_open_joinable_games = 10 [default = 0]; + optional uint32 open_games_total = 11 [default = 0]; + optional uint32 players_in_open_games_total = 12 [default = 0]; +} + +// ref: bnet.protocol.game_master.GetFactoryInfoRequest +message GetFactoryInfoRequest { + required fixed64 factory_id = 1; +} + +// ref: bnet.protocol.game_master.GetFactoryInfoResponse +message GetFactoryInfoResponse { + repeated bnet.protocol.Attribute attribute = 1; + repeated GameStatsBucket stats_bucket = 2; +} + +// ref: bnet.protocol.game_master.GetGameStatsRequest +message GetGameStatsRequest { + required fixed64 factory_id = 1; + required bnet.protocol.AttributeFilter filter = 2; +} + +// ref: bnet.protocol.game_master.GetGameStatsResponse +message GetGameStatsResponse { + repeated GameStatsBucket stats_bucket = 1; +} + +// ref: bnet.protocol.game_master.JoinGameRequest +message JoinGameRequest { + required GameHandle game_handle = 1; + repeated Player player = 2; + optional bool advanced_notification = 3 [default = false]; +} + +// ref: bnet.protocol.game_master.JoinGameResponse +message JoinGameResponse { + optional fixed64 request_id = 1; + optional bool queued = 2 [default = false]; + repeated ConnectInfo connect_info = 3; +} + +// ref: bnet.protocol.game_master.ListFactoriesRequest +message ListFactoriesRequest { + required bnet.protocol.AttributeFilter filter = 1; + optional uint32 start_index = 2 [default = 0]; + optional uint32 max_results = 3 [default = 100]; +} + +// ref: bnet.protocol.game_master.ListFactoriesResponse +message ListFactoriesResponse { + repeated GameFactoryDescription description = 1; + optional uint32 total_results = 2; +} + +// ref: bnet.protocol.game_master.Player +message Player { + optional bnet.protocol.Identity identity = 1; + repeated bnet.protocol.Attribute attribute = 2; +} + +// ref: bnet.protocol.game_master.PlayerLeftNotification +message PlayerLeftNotification { + required GameHandle game_handle = 1; + required bnet.protocol.EntityId member_id = 2; + optional uint32 reason = 3 [default = 1]; +} + +// ref: bnet.protocol.game_master.RegisterServerRequest +message RegisterServerRequest { + repeated bnet.protocol.Attribute attribute = 1; + optional bnet.protocol.ServerState state = 2; + required fixed32 program_id = 3; +} + +// ref: bnet.protocol.game_master.RegisterUtilitiesRequest +message RegisterUtilitiesRequest { + repeated bnet.protocol.Attribute attribute = 1; + optional bnet.protocol.ServerState state = 2; + required fixed32 program_id = 3; +} + +// ref: bnet.protocol.game_master.SubscribeRequest +message MasterSubscribeRequest { + required uint64 object_id = 1; +} + +// ref: bnet.protocol.game_master.SubscribeResponse +message SubscribeResponse { + optional uint64 subscription_id = 1; +} + +// ref: bnet.protocol.game_master.UnregisterServerRequest +message UnregisterServerRequest { +} + +// ref: bnet.protocol.game_master.UnregisterUtilitiesRequest +message UnregisterUtilitiesRequest { +} + +// ref: bnet.protocol.game_master.UnsubscribeRequest +message MasterUnsubscribeRequest { + required uint64 subscription_id = 1; +} + +// ref: bnet.protocol.channel.AddMemberRequest +message AddMemberRequest { + optional bnet.protocol.EntityId agent_id = 1; + required bnet.protocol.Identity member_identity = 2; + required MemberState member_state = 3; + required uint64 object_id = 4; + optional bool subscribe = 5 [default = true]; +} + +// ref: bnet.protocol.channel.AddNotification +message AddNotification { + optional Member self = 1; + repeated Member member = 2; + required ChannelState channel_state = 3; +} + +// ref: bnet.protocol.channel.ChannelDescription +message ChannelDescription { + required bnet.protocol.EntityId channel_id = 1; + optional uint32 current_members = 2; + optional ChannelState state = 3; +} + +// ref: bnet.protocol.channel.ChannelInfo +message ChannelInfo { + required ChannelDescription description = 1; + repeated Member member = 2; +} + +// ref: bnet.protocol.channel.ChannelState +message chanChannelState { + // ref: bnet.protocol.channel.ChannelState/Types/PrivacyLevel + enum PrivacyLevel { + PRIVACY_LEVEL_OPEN = 1; + PRIVACY_LEVEL_OPEN_INVITATION_AND_FRIEND = 2; + PRIVACY_LEVEL_OPEN_INVITATION = 3; + PRIVACY_LEVEL_CLOSED = 4; + } + + optional uint32 max_members = 1; + optional uint32 min_members = 2; + repeated bnet.protocol.Attribute attribute = 3; + repeated bnet.protocol.Invitation invitation = 4; + optional uint32 max_invitations = 5; + optional uint32 reason = 6; + optional PrivacyLevel privacy_level = 7 [default = PRIVACY_LEVEL_OPEN]; + optional string name = 8; + optional string delegate_name = 9; + optional string channel_type = 10 [default = "default"]; + optional fixed32 program = 11 [default = 0]; + optional bool allow_offline_members = 12 [default = false]; + optional bool subscribe_to_presence = 13 [default = true]; + optional bnet.protocol.ChannelState chat = 100; // chat + optional bnet.protocol.PresenceChannelState presence = 101; // presence +} + +// ref: bnet.protocol.channel.CreateChannelRequest +message CreateChannelRequest { + optional bnet.protocol.Identity agent_identity = 1; + optional MemberState member_state = 2; + optional chanChannelState channel_state = 3; + optional bnet.protocol.EntityId channel_id = 4; + optional uint64 object_id = 5; + optional bnet.protocol.EntityId local_agent = 6; + optional MemberState local_member_state = 7; +} + +// ref: bnet.protocol.channel.CreateChannelResponse +message CreateChannelResponse { + required uint64 object_id = 1; + optional bnet.protocol.EntityId channel_id = 2; +} + +// ref: bnet.protocol.channel.DissolveRequest +message DissolveRequest { + optional bnet.protocol.EntityId agent_id = 1; + optional uint32 reason = 2; +} + +// ref: bnet.protocol.channel.FindChannelOptions +message FindChannelOptions { + optional uint32 start_index = 1 [default = 0]; + optional uint32 max_results = 2 [default = 16]; + optional string name = 3; + optional fixed32 program = 4; + optional fixed32 locale = 5; + optional uint32 capacity_full = 6; + required bnet.protocol.AttributeFilter attribute_filter = 7; + optional string channel_type = 8; +} + +// ref: bnet.protocol.channel.FindChannelRequest +message FindChannelRequest { + optional bnet.protocol.Identity agent_identity = 1; + required FindChannelOptions options = 2; +} + +// ref: bnet.protocol.channel.FindChannelResponse +message FindChannelResponse { + repeated ChannelDescription channel = 1; +} + +// ref: bnet.protocol.channel.GetChannelIdRequest +message GetChannelIdRequest { +} + +// ref: bnet.protocol.channel.GetChannelIdResponse +message GetChannelIdResponse { + optional bnet.protocol.EntityId channel_id = 1; +} + +// ref: bnet.protocol.channel.GetChannelInfoRequest +message GetChannelInfoRequest { + optional bnet.protocol.EntityId agent_id = 1; + required bnet.protocol.EntityId channel_id = 2; + optional bool fetch_state = 3 [default = false]; + optional bool fetch_members = 4 [default = false]; +} + +// ref: bnet.protocol.channel.GetChannelInfoResponse +message GetChannelInfoResponse { + optional ChannelInfo channel_info = 1; +} + +// ref: bnet.protocol.channel.JoinChannelRequest +message JoinChannelRequest { + optional bnet.protocol.Identity agent_identity = 1; + optional MemberState member_state = 2; + required bnet.protocol.EntityId channel_id = 3; + required uint64 object_id = 4; + repeated bnet.protocol.EntityId friend_account_id = 5; + optional bool local_subscriber = 6 [default = true]; +} + +// ref: bnet.protocol.channel.JoinChannelResponse +message JoinChannelResponse { + optional uint64 object_id = 1; + optional bool require_friend_validation = 2 [default = false]; + repeated bnet.protocol.EntityId privileged_account = 3; +} + +// ref: bnet.protocol.channel.JoinNotification +message JoinNotification { + required Member member = 1; +} + +// ref: bnet.protocol.channel.LeaveNotification +message LeaveNotification { + optional bnet.protocol.EntityId agent_id = 1; + required bnet.protocol.EntityId member_id = 2; + optional uint32 reason = 3; +} + +// ref: bnet.protocol.channel.Member +message Member { + required bnet.protocol.Identity identity = 1; + required MemberState state = 2; +} + +// ref: bnet.protocol.channel.MemberState +message MemberState { + repeated bnet.protocol.Attribute attribute = 1; + repeated uint32 role = 2 [packed=true]; + optional uint64 privileges = 3 [default = 0]; + optional bnet.protocol.AccountInfo info = 4; + optional bool hidden = 5 [default = false]; +} + +// ref: bnet.protocol.channel.Message +message Message { + repeated bnet.protocol.Attribute attribute = 1; + optional uint32 role = 2; +} + +// ref: bnet.protocol.channel.RemoveMemberRequest +message RemoveMemberRequest { + optional bnet.protocol.EntityId agent_id = 1; + required bnet.protocol.EntityId member_id = 2; + optional uint32 reason = 3; +} + +// ref: bnet.protocol.channel.RemoveNotification +message RemoveNotification { + optional bnet.protocol.EntityId agent_id = 1; + required bnet.protocol.EntityId member_id = 2; + optional uint32 reason = 3; +} + +// ref: bnet.protocol.channel.SendMessageNotification +message SendMessageNotification { + optional bnet.protocol.EntityId agent_id = 1; + required Message message = 2; + optional uint64 required_privileges = 3 [default = 0]; +} + +// ref: bnet.protocol.channel.SendMessageRequest +message SendMessageRequest { + optional bnet.protocol.EntityId agent_id = 1; + required Message message = 2; + optional uint64 required_privileges = 3 [default = 0]; +} + +// ref: bnet.protocol.channel.SetRolesRequest +message SetRolesRequest { + optional bnet.protocol.EntityId agent_id = 1; + repeated uint32 role = 2 [packed=true]; + repeated bnet.protocol.EntityId member_id = 3; +} + +// ref: bnet.protocol.channel.SubscribeChannelRequest +message SubscribeChannelRequest { + optional bnet.protocol.EntityId agent_id = 1; + required bnet.protocol.EntityId channel_id = 2; + required uint64 object_id = 3; +} + +// ref: bnet.protocol.channel.SubscribeChannelResponse +message SubscribeChannelResponse { + optional uint64 object_id = 1; +} + +// ref: bnet.protocol.channel.UnsubscribeMemberRequest +message UnsubscribeMemberRequest { + optional bnet.protocol.EntityId agent_id = 1; + required bnet.protocol.EntityId member_id = 2; +} + +// ref: bnet.protocol.channel.UpdateChannelStateNotification +message UpdateChannelStateNotification { + optional bnet.protocol.EntityId agent_id = 1; + required chanChannelState state_change = 2; +} + +// ref: bnet.protocol.channel.UpdateChannelStateRequest +message UpdateChannelStateRequest { + optional bnet.protocol.EntityId agent_id = 1; + required chanChannelState state_change = 2; +} + +// ref: bnet.protocol.channel.UpdateMemberStateNotification +message UpdateMemberStateNotification { + optional bnet.protocol.EntityId agent_id = 1; + repeated Member state_change = 2; + repeated uint32 removed_role = 3 [packed=true]; +} + +// ref: bnet.protocol.channel.UpdateMemberStateRequest +message UpdateMemberStateRequest { + optional bnet.protocol.EntityId agent_id = 1; + repeated Member state_change = 2; + repeated uint32 removed_role = 3 [packed=true]; +} + + +// AMBIGOUS + + +// ref: bnet.protocol.channel_invitation.AcceptInvitationRequest +message AcceptInvitationRequest { + optional bnet.protocol.EntityId agent_id = 1; + optional bnet.protocol.MemberState member_state = 2; + required fixed64 invitation_id = 3; + required uint64 object_id = 4; + optional bnet.protocol.EntityId channel_id = 5; + optional uint32 service_type = 6; + optional bool local_subscriber = 7 [default = true]; +} + +// ref: bnet.protocol.channel_invitation.AcceptInvitationResponse +message AcceptInvitationResponse { + required uint64 object_id = 1; +} + +// ref: bnet.protocol.channel_invitation.ChannelCount +message ChannelCount { + optional bnet.protocol.EntityId channel_id = 1; + optional string channel_type = 2 [default = "default"]; +} + +// ref: bnet.protocol.channel_invitation.ChannelCountDescription +message ChannelCountDescription { + required uint32 service_type = 1; + required fixed32 program = 2; + optional string channel_type = 3 [default = "default"]; + optional bnet.protocol.EntityId channel_id = 4; +} + +// ref: bnet.protocol.channel_invitation.ChannelInvitation +message ChannelInvitation { + required bnet.protocol.ChannelDescription channel_description = 1; + optional bool reserved = 2 [default = false]; + optional bool rejoin = 3 [default = false]; + required uint32 service_type = 4; +} + +// ref: bnet.protocol.channel_invitation.ChannelInvitationParams +message ChannelInvitationParams { + required bnet.protocol.EntityId channel_id = 1; + optional bool reserved = 2; + optional bool rejoin = 3; + required uint32 service_type = 4; +} + +// ref: bnet.protocol.channel_invitation.DecrementChannelCountRequest +message DecrementChannelCountRequest { + required bnet.protocol.EntityId agent_id = 1; + optional bnet.protocol.EntityId channel_id = 2; + optional uint64 reservation_token = 3; +} + +// ref: bnet.protocol.channel_invitation.HasRoomForInvitationRequest +message HasRoomForInvitationRequest { + required uint32 service_type = 1; + optional fixed32 program = 2; + optional string channel_type = 3 [default = "default"]; +} + +// ref: bnet.protocol.channel_invitation.IncrementChannelCountRequest +message IncrementChannelCountRequest { + required bnet.protocol.EntityId agent_id = 1; + repeated ChannelCountDescription descriptions = 2; +} + +// ref: bnet.protocol.channel_invitation.IncrementChannelCountResponse +message IncrementChannelCountResponse { + repeated uint64 reservation_tokens = 1; +} + +// ref: bnet.protocol.channel_invitation.InvitationAddedNotification +message InvitationAddedNotification { + required bnet.protocol.Invitation invitation = 1; +} + +// ref: bnet.protocol.channel_invitation.InvitationCollection +message InvitationCollection { + optional uint32 service_type = 1; + optional uint32 max_received_invitations = 2; + optional uint64 object_id = 3; + repeated bnet.protocol.Invitation received_invitation = 4; +} + +// ref: bnet.protocol.channel_invitation.InvitationRemovedNotification +message InvitationRemovedNotification { + required bnet.protocol.Invitation invitation = 1; + optional uint32 reason = 2; +} + +// ref: bnet.protocol.channel_invitation.ListChannelCountRequest +message ListChannelCountRequest { + required bnet.protocol.EntityId member_id = 1; + required uint32 service_type = 2; + optional fixed32 program = 3; +} + +// ref: bnet.protocol.channel_invitation.ListChannelCountResponse +message ListChannelCountResponse { + repeated ChannelCount channel = 1; +} + +// ref: bnet.protocol.channel_invitation.RevokeInvitationRequest +message RevokeInvitationRequest { + optional bnet.protocol.EntityId agent_id = 1; + optional bnet.protocol.EntityId target_id = 2; + required fixed64 invitation_id = 3; + required bnet.protocol.EntityId channel_id = 4; +} + +// ref: bnet.protocol.channel_invitation.SubscribeRequest +message CISubscribeRequest { + optional bnet.protocol.EntityId agent_id = 1; + required uint64 object_id = 2; +} + +// ref: bnet.protocol.channel_invitation.SubscribeResponse +message CISubscribeResponse { + repeated InvitationCollection collection = 1; + repeated bnet.protocol.Invitation received_invitation = 2; +} + +// ref: bnet.protocol.channel_invitation.SuggestInvitationRequest +message SuggestInvitationRequest { + optional bnet.protocol.EntityId agent_id = 1; + required bnet.protocol.EntityId channel_id = 2; + required bnet.protocol.EntityId target_id = 3; + optional bnet.protocol.EntityId approval_id = 4; + optional bnet.protocol.Identity agent_identity = 5; + optional bnet.protocol.AccountInfo agent_info = 6; +} + +// ref: bnet.protocol.channel_invitation.SuggestionAddedNotification +message SuggestionAddedNotification { + required bnet.protocol.Suggestion suggestion = 1; +} + +// ref: bnet.protocol.channel_invitation.UnsubscribeRequest +message CIUnsubscribeRequest { + optional bnet.protocol.EntityId agent_id = 1; +} + +// ref: bnet.protocol.channel_invitation.UpdateChannelCountRequest +message UpdateChannelCountRequest { + required bnet.protocol.EntityId agent_id = 1; + optional uint64 reservation_token = 2; + required bnet.protocol.EntityId channel_id = 3; +} + diff --git a/src/main/resources/login.html b/src/main/resources/login.html new file mode 100644 index 0000000..5234a7c --- /dev/null +++ b/src/main/resources/login.html @@ -0,0 +1,25 @@ + + + + + Login + + + + +
+
+ Hearthstone (mod) Sign-in: + + + + + + + +
+
+ + \ No newline at end of file diff --git a/test.com.crt b/test.com.crt new file mode 100644 index 0000000..3d5b8c3 --- /dev/null +++ b/test.com.crt @@ -0,0 +1,13 @@ +-----BEGIN CERTIFICATE----- +MIICBjCCAW8CFGXq81zzufsv/8Wkwgy/je2BgVXLMA0GCSqGSIb3DQEBCwUAMEIx +CzAJBgNVBAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0Rl +ZmF1bHQgQ29tcGFueSBMdGQwHhcNMjMwOTIzMTQwNDU3WhcNMjQwOTIyMTQwNDU3 +WjBCMQswCQYDVQQGEwJYWDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQK +DBNEZWZhdWx0IENvbXBhbnkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB +gQCrNn3o78dD0H1Trkv6J5e4KD0dkMjC/Pdfjx2TwRN+vGOEwrEjrXLBscJ7pK8D +eCkSmF0WFOCxF4QLfWKOtyZtYh4aPcjU8AdrIPhejwjnW1N15yqFhufZJ3WnYi83 +jm4MErcYgBlqWim+Hc80af2LFo+1KR5oj595O49IhAXNEwIDAQABMA0GCSqGSIb3 +DQEBCwUAA4GBAGt4DEfFeStgfqL6MdHzANGe3oXIy1JsjyK6L7wCUoGhFsAo62lz +eNUaU6oQr1J94AQ5eVsrwVc8QQ0j0XsBhdWbT9xswedcEMsbDbZGNNEC2eaASg3Z +BLR5Y0VUAZqbxJONjUUqjNkbhMnEG8nOzh/6Vm1iGVC62US3n9hJ4HtK +-----END CERTIFICATE----- diff --git a/test.com.csr b/test.com.csr new file mode 100644 index 0000000..bd05711 --- /dev/null +++ b/test.com.csr @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBgTCB6wIBADBCMQswCQYDVQQGEwJYWDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5 +MRwwGgYDVQQKDBNEZWZhdWx0IENvbXBhbnkgTHRkMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQCrNn3o78dD0H1Trkv6J5e4KD0dkMjC/Pdfjx2TwRN+vGOEwrEj +rXLBscJ7pK8DeCkSmF0WFOCxF4QLfWKOtyZtYh4aPcjU8AdrIPhejwjnW1N15yqF +hufZJ3WnYi83jm4MErcYgBlqWim+Hc80af2LFo+1KR5oj595O49IhAXNEwIDAQAB +oAAwDQYJKoZIhvcNAQELBQADgYEApgEuapwv8MeuwfVDF1niUTB3WGe+0TLQxj55 +x+niQK7c3n/fgQkSsg4qI0HHkgGIFQvfXWr1vZgTL3cefeKFx1av9lTP32wIgo/Y +GEvV2Z5ZnCpkDK3OZdMl56CkIshZ8CbTP8hjxmc1trpIrV+l304cz1KY5KramaTe +CnTaPUs= +-----END CERTIFICATE REQUEST----- diff --git a/test.com.key b/test.com.key new file mode 100644 index 0000000..7ae93e3 --- /dev/null +++ b/test.com.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICWwIBAAKBgQCrNn3o78dD0H1Trkv6J5e4KD0dkMjC/Pdfjx2TwRN+vGOEwrEj +rXLBscJ7pK8DeCkSmF0WFOCxF4QLfWKOtyZtYh4aPcjU8AdrIPhejwjnW1N15yqF +hufZJ3WnYi83jm4MErcYgBlqWim+Hc80af2LFo+1KR5oj595O49IhAXNEwIDAQAB +AoGAUo/FabVuvqnkNZ0gMDI1fG2TAxXVagm4dFE8Lwr1DrFjwBpud0jlxLemlB8W +8jJYhAoLIWHR9DPlzfCZvT5efajcx3jAueqRzvBwCZucTaiLyA5uH4suUf0QR844 +2k6o3Q1PvECX9b3VgcbFbv8XNT/fqOiO2lkqOupjLWQNvqkCQQDTqfZL5FycZYt0 +HGOh5QFKNNRGe0wDUpAYru22MIsN8Ah3DulP2Ac4dbUCNFlgDGEgdnHqkdh0Aku5 +g+5wpdmnAkEAzxNtBfSuinmT5rSDohcAIq+iKy9whaI4ctbrUuZ1CJ6lLdtA3oUK +NMDtNy92C7K9HUHZEcFYtVtR8GN4ii8GtQJAYXp2yYDD/eruDG0+nUKAE5K86DDE +Uwtk/VkidLNqduLCo0IkxPaybJgY4okFWCybVn31/JdqXhLomOlfmFVpJQJAB5B0 +GRWZEqHiTzkk3dTtQlccG2u+NoN4gGltazfT6p6w9f3eXsKJXuf1QmDPdRnwYpM3 +NLjVXrqZQajAjHuvSQJAZaxQVSuZUtzbrBFMn6cRJp/5e5fEAf/zEa1K6qamr1CZ +gC21NpK8IvyPi+7jTO9sERwGrpoD32dIkyb8Wf21ZQ== +-----END RSA PRIVATE KEY----- diff --git a/test.com.pem b/test.com.pem new file mode 100644 index 0000000..75952f6 --- /dev/null +++ b/test.com.pem @@ -0,0 +1,28 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICWwIBAAKBgQCrNn3o78dD0H1Trkv6J5e4KD0dkMjC/Pdfjx2TwRN+vGOEwrEj +rXLBscJ7pK8DeCkSmF0WFOCxF4QLfWKOtyZtYh4aPcjU8AdrIPhejwjnW1N15yqF +hufZJ3WnYi83jm4MErcYgBlqWim+Hc80af2LFo+1KR5oj595O49IhAXNEwIDAQAB +AoGAUo/FabVuvqnkNZ0gMDI1fG2TAxXVagm4dFE8Lwr1DrFjwBpud0jlxLemlB8W +8jJYhAoLIWHR9DPlzfCZvT5efajcx3jAueqRzvBwCZucTaiLyA5uH4suUf0QR844 +2k6o3Q1PvECX9b3VgcbFbv8XNT/fqOiO2lkqOupjLWQNvqkCQQDTqfZL5FycZYt0 +HGOh5QFKNNRGe0wDUpAYru22MIsN8Ah3DulP2Ac4dbUCNFlgDGEgdnHqkdh0Aku5 +g+5wpdmnAkEAzxNtBfSuinmT5rSDohcAIq+iKy9whaI4ctbrUuZ1CJ6lLdtA3oUK +NMDtNy92C7K9HUHZEcFYtVtR8GN4ii8GtQJAYXp2yYDD/eruDG0+nUKAE5K86DDE +Uwtk/VkidLNqduLCo0IkxPaybJgY4okFWCybVn31/JdqXhLomOlfmFVpJQJAB5B0 +GRWZEqHiTzkk3dTtQlccG2u+NoN4gGltazfT6p6w9f3eXsKJXuf1QmDPdRnwYpM3 +NLjVXrqZQajAjHuvSQJAZaxQVSuZUtzbrBFMn6cRJp/5e5fEAf/zEa1K6qamr1CZ +gC21NpK8IvyPi+7jTO9sERwGrpoD32dIkyb8Wf21ZQ== +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICBjCCAW8CFGXq81zzufsv/8Wkwgy/je2BgVXLMA0GCSqGSIb3DQEBCwUAMEIx +CzAJBgNVBAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0Rl +ZmF1bHQgQ29tcGFueSBMdGQwHhcNMjMwOTIzMTQwNDU3WhcNMjQwOTIyMTQwNDU3 +WjBCMQswCQYDVQQGEwJYWDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQK +DBNEZWZhdWx0IENvbXBhbnkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB +gQCrNn3o78dD0H1Trkv6J5e4KD0dkMjC/Pdfjx2TwRN+vGOEwrEjrXLBscJ7pK8D +eCkSmF0WFOCxF4QLfWKOtyZtYh4aPcjU8AdrIPhejwjnW1N15yqFhufZJ3WnYi83 +jm4MErcYgBlqWim+Hc80af2LFo+1KR5oj595O49IhAXNEwIDAQABMA0GCSqGSIb3 +DQEBCwUAA4GBAGt4DEfFeStgfqL6MdHzANGe3oXIy1JsjyK6L7wCUoGhFsAo62lz +eNUaU6oQr1J94AQ5eVsrwVc8QQ0j0XsBhdWbT9xswedcEMsbDbZGNNEC2eaASg3Z +BLR5Y0VUAZqbxJONjUUqjNkbhMnEG8nOzh/6Vm1iGVC62US3n9hJ4HtK +-----END CERTIFICATE-----