1176 lines
		
	
	
		
			57 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			1176 lines
		
	
	
		
			57 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include <iostream>
 | 
						|
#include <tomcrypt.h>
 | 
						|
#include <iomanip>
 | 
						|
#include <ThreadPool/Timer.h>
 | 
						|
#include <License.h>
 | 
						|
#include "src/Identity.h"
 | 
						|
#include "src/protocol/Connection.h"
 | 
						|
#include <ed25519/ed25519.h>
 | 
						|
#include <ed25519/ge.h>
 | 
						|
#include <misc/base64.h>
 | 
						|
#include <log/LogUtils.h>
 | 
						|
#include <LicenseKey.pb.h>
 | 
						|
#include <ed25519/sc.h>
 | 
						|
#include <misc/digest.h>
 | 
						|
 | 
						|
#define QLZ_COMPRESSION_LEVEL 3
 | 
						|
#include "qlz/QuickLZ.h"
 | 
						|
 | 
						|
using namespace std;
 | 
						|
using namespace ts;
 | 
						|
using namespace license::teamspeak;
 | 
						|
void hexout(std::ostream& os, unsigned char c)
 | 
						|
{
 | 
						|
    unsigned char uc = static_cast<unsigned char>(c);
 | 
						|
    os << std::setw(2) << std::setfill('0') << (unsigned int)uc << ' ';
 | 
						|
}
 | 
						|
 | 
						|
void hexdump(std::ostream& outs, const std::string& s, size_t line_len = 16)
 | 
						|
{
 | 
						|
    std::ostringstream os;
 | 
						|
    const std::string::size_type slen(s.size());
 | 
						|
    int i(0);
 | 
						|
    std::string::size_type pos(0);
 | 
						|
    const std::streamsize lines(slen / line_len);
 | 
						|
    const std::streamsize chars(slen % line_len);
 | 
						|
    std::ios::fmtflags f(os.flags());
 | 
						|
 | 
						|
    os << "Length: " << s.length() << "/" << std::hex << "0x" << s.length() << endl;
 | 
						|
    for(std::streamsize line = 0; line <= lines - (chars  == 0 ? 1 : 0); ++line)
 | 
						|
    {
 | 
						|
        os << std::hex << setfill('0') << setw(3) << line * line_len << " | ";
 | 
						|
        for(i = 0; i < line_len; ++i)
 | 
						|
        {
 | 
						|
            if(pos < s.length())
 | 
						|
                hexout(os, s[pos]);
 | 
						|
            else os << "   ";
 | 
						|
            pos++;
 | 
						|
        }
 | 
						|
        os << " | ";
 | 
						|
        if(pos - line_len < s.length()){
 | 
						|
            auto av = s.substr(pos - line_len);
 | 
						|
            for(char c : av.substr(0, min(av.length(), line_len))){
 | 
						|
                if(isprint(c))
 | 
						|
                    os << c << " ";
 | 
						|
                else
 | 
						|
                    os << "." << " ";
 | 
						|
            }
 | 
						|
        }
 | 
						|
        os << '\n';
 | 
						|
    }
 | 
						|
    os.flags(f);
 | 
						|
    outs << os.str() << endl;
 | 
						|
}
 | 
						|
//This RSA puzzel crashes the manager
 | 
						|
//545333494e49543100658803ffED1eBAACDe66bd212F3B91A0C1dbd65b374F1FCEe353A74C78eB99B5b8B2e0eC7DC9Ce7bCdfcFE97622AbD015B4EBCB3fecc7D23bBfaA2B15DBBBBC1d009DBcd924B06Eb2e0CBCD0AfBbadc2ecbb812C47d5dcAA4BcFdaF73ACe89A106c98f6c0DBeac8e8FeF9d6d836Bd1Cd791f376452Cff581400ed760acB2deAE1Be53E98152AbaBfaC823e3e4FACdaAf69E977C8dE328ECDA5FEE3c327FfCf9228caf8D761aeF7bAdbebe5eAcda87Eba61F09D7AEC9D4EeBa763cFE3c9cE718d37dd4F73CA10ffB4127d15Bee7cF9Edc644b4be06f0F9C4aEb2FBDd9549e215959FaFea57b5B7900000000
 | 
						|
 | 
						|
/*
 | 
						|
	auto parent = import((char*) root);
 | 
						|
	fe_neg(parent.X, parent.X);
 | 
						|
fe_neg(parent.T, parent.T);
 | 
						|
char buf[32];
 | 
						|
ge_p3_tobytes((u_char*) buf, &parent);
 | 
						|
return string(buf, 32);
 | 
						|
 */
 | 
						|
using namespace std::chrono;
 | 
						|
inline std::string keyMul(const char* publicKey /* compressed */, char* privateKey /* uncompressed */, bool negate){
 | 
						|
	ge_p3 keyA{};
 | 
						|
	ge_p2 result{};
 | 
						|
 | 
						|
	ge_frombytes_negate_vartime(&keyA, (u_char*) publicKey);
 | 
						|
	if(negate) {
 | 
						|
		fe_neg(keyA.X, keyA.X); /* undo negate */
 | 
						|
		fe_neg(keyA.T, keyA.T); /* undo negate */
 | 
						|
	}
 | 
						|
	ge_scalarmult_vartime(&result, (u_char*) privateKey, &keyA);
 | 
						|
 | 
						|
	char buffer[32];
 | 
						|
	ge_tobytes((u_char*) buffer, &result);
 | 
						|
	return string(buffer, 32);
 | 
						|
}
 | 
						|
 | 
						|
#include "ed25519/sha512.h"
 | 
						|
static int consttime_equal(const unsigned char *x, const unsigned char *y) {
 | 
						|
	unsigned char r = 0;
 | 
						|
 | 
						|
	r = x[0] ^ y[0];
 | 
						|
	#define F(i) r |= x[i] ^ y[i]
 | 
						|
	F(1);
 | 
						|
	F(2);
 | 
						|
	F(3);
 | 
						|
	F(4);
 | 
						|
	F(5);
 | 
						|
	F(6);
 | 
						|
	F(7);
 | 
						|
	F(8);
 | 
						|
	F(9);
 | 
						|
	F(10);
 | 
						|
	F(11);
 | 
						|
	F(12);
 | 
						|
	F(13);
 | 
						|
	F(14);
 | 
						|
	F(15);
 | 
						|
	F(16);
 | 
						|
	F(17);
 | 
						|
	F(18);
 | 
						|
	F(19);
 | 
						|
	F(20);
 | 
						|
	F(21);
 | 
						|
	F(22);
 | 
						|
	F(23);
 | 
						|
	F(24);
 | 
						|
	F(25);
 | 
						|
	F(26);
 | 
						|
	F(27);
 | 
						|
	F(28);
 | 
						|
	F(29);
 | 
						|
	F(30);
 | 
						|
	F(31);
 | 
						|
	#undef F
 | 
						|
 | 
						|
	return !r;
 | 
						|
}
 | 
						|
 | 
						|
int ed25519_verify(bool do_hash, const unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key) {
 | 
						|
	unsigned char h[64];
 | 
						|
	unsigned char checker[32];
 | 
						|
	sha512_context hash;
 | 
						|
	ge_p3 A;
 | 
						|
	ge_p2 R;
 | 
						|
 | 
						|
	if (signature[63] & 224) {
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
 | 
						|
	if (ge_frombytes_negate_vartime(&A, public_key) != 0) {
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
 | 
						|
	if(do_hash) {
 | 
						|
		//sha512_init(&hash);
 | 
						|
		//sha512_update(&hash, signature, 32);
 | 
						|
		//sha512_update(&hash, public_key, 32);
 | 
						|
		//sha512_update(&hash, message, message_len);
 | 
						|
		//sha512_final(&hash, h);
 | 
						|
		assert(false);
 | 
						|
	} else {
 | 
						|
		memcpy(h, message, 64);
 | 
						|
	}
 | 
						|
 | 
						|
	sc_reduce(h);
 | 
						|
	ge_double_scalarmult_vartime(&R, h, &A, signature + 32);
 | 
						|
	ge_tobytes(checker, &R);
 | 
						|
 | 
						|
	if (!consttime_equal(checker, signature)) {
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
 | 
						|
	return 1;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
	char seed[64];
 | 
						|
 | 
						|
	LicenseChain chain;
 | 
						|
	//E813384CE058BA63F5792D16A093B0C503D2C51FD19A1DC36FD613EFB88E7334
 | 
						|
	u_char publicKey[32];
 | 
						|
	u_char privateKey[32] = {0xE8, 0x13, 0x38, 0x4C, 0xE0, 0x58, 0xBA, 0x63, 0xF5, 0x79, 0x2D, 0x16, 0xA0, 0x93, 0xB0, 0xC5, 0x03, 0xD2, 0xC5, 0x1F, 0xD1, 0x9A, 0x1D, 0xC3, 0x6F, 0xD6, 0x13, 0xEF, 0xB8, 0x8E, 0x73, 0x34};
 | 
						|
	//privateKey[0] &= 248;
 | 
						|
	//privateKey[31] &= 63;
 | 
						|
	//privateKey[31] |= 64;
 | 
						|
	ge_p3 A;
 | 
						|
	ge_scalarmult_base(&A, privateKey);
 | 
						|
	ge_p3_tobytes(publicKey, &A);
 | 
						|
	hexDump((char*) publicKey, 32, 32, 32);
 | 
						|
 | 
						|
	cout << "A: " << base64::encode(keyMul((char*) chain.generatePublicKey(public_tea_root).data(), (char*) chain.generatePrivateKey((u_char*) privateKey).data(), true)) << endl;
 | 
						|
	cout << "A: " << base64::encode(keyMul((char*) chain.generatePublicKey((u_char*) publicKey).data(), (char*) chain.generatePrivateKey((u_char*) private_tea_root).data(), true)) << endl;
 | 
						|
	/*
 | 
						|
	for(char& c : seed)
 | 
						|
		c = rand();
 | 
						|
	ed25519_create_keypair((u_char*) publicKey, (u_char*) privateKey, (u_char*) seed);
 | 
						|
	cout << "A: " << base64::encode(keyMul((char*) public_tea_root, privateKey, true)) << endl;
 | 
						|
	cout << "B: " << base64::encode(keyMul(publicKey, (char*) private_tea_root, true)) << endl;
 | 
						|
 | 
						|
	chain.addServerEntry(7, "TeaSpeak");
 | 
						|
	chain.addEphemeralEntry();
 | 
						|
	/
 | 
						|
 | 
						|
	istringstream is(chain.exportChain());
 | 
						|
	auto c2 = LicenseChain::parse(is, error);
 | 
						|
 | 
						|
	chain.print();
 | 
						|
	c2->print();
 | 
						|
	cout << "A: " << base64::encode(keyMul((char*) c2->generatePublicKey(public_tea_root).data(), (char*) chain.generatePrivateKey((u_char*) privateKey).data(), true)) << endl;
 | 
						|
	cout << "A: " << base64::encode(keyMul((char*) c2->generatePublicKey((u_char*) publicKey).data(), (char*) chain.generatePrivateKey((u_char*) private_tea_root).data(), true)) << endl;
 | 
						|
	cout << "Chain: " << base64::encode(chain.exportChain()) << endl;
 | 
						|
 */
 | 
						|
 | 
						|
inline std::string parseHex(const std::string& in) {
 | 
						|
	char buffer[(in.length() + 1) / 2];
 | 
						|
	memset(buffer, 0, sizeof(buffer));
 | 
						|
	size_t nibble_index = 0;
 | 
						|
 | 
						|
	for(auto c : in) {
 | 
						|
		if(c == '\n' || c == ' ') continue;
 | 
						|
 | 
						|
		uint8_t nibble = 0;
 | 
						|
		if(c >= 'A' && c <= 'F')
 | 
						|
			nibble = c - 'A' + 10;
 | 
						|
		else if(c >= 'a' && c <= 'f')
 | 
						|
			nibble = c - 'a' + 10;
 | 
						|
		else if(c >= '0' && c <= '9')
 | 
						|
			nibble = c - '0';
 | 
						|
 | 
						|
		if(nibble_index % 2 == 0)
 | 
						|
			nibble <<= 4;
 | 
						|
		else
 | 
						|
			nibble &= 0xF;
 | 
						|
		buffer[nibble_index / 2] |= nibble;
 | 
						|
		nibble_index++;
 | 
						|
	}
 | 
						|
 | 
						|
	return string(buffer, (nibble_index + 1) / 2);
 | 
						|
}
 | 
						|
 | 
						|
bool read_crypted_string(std::string& result, const char* buffer, int length) {
 | 
						|
	char tmp[264];
 | 
						|
	char current;
 | 
						|
	int index = 0;
 | 
						|
 | 
						|
	do {
 | 
						|
		//cout << "Read: " << ((index & 0x1F) - length) << " | " << index << endl;
 | 
						|
		tmp[index] = length ^ buffer[index] ^ buffer[(index & 0x1F) - length];
 | 
						|
	} while(tmp[index++]);
 | 
						|
	result = string(tmp, index - 1);
 | 
						|
	return true;
 | 
						|
}
 | 
						|
 | 
						|
void print_dec_teamspeak() {
 | 
						|
	auto bin = parseHex("3EF0E405913439B81A2D60D467C04D11\n"
 | 
						|
	                    "8E7D6C6CC8DC2B8B8F62FD30F7027393\n"
 | 
						|
	                    "29B7A64DC47E7BAD0E6A788E7E881805\n"
 | 
						|
	                    "9D373E29D0FC5FAFBC57C8757C8E4CA7\n"
 | 
						|
	                    "B44ED70A35E78019D531CBC8299A2E34\n"
 | 
						|
	                    "F107D5C124B35F47C62A1F52EA43FF68\n"
 | 
						|
	                    "29B14B0F13EDE81BB7AD43C900CD7D41\n"
 | 
						|
	                    "AD02A125F7E306917D65E40B3F70CC61\n"
 | 
						|
	                    "C35F019E616A71CFC6369FCE3FFA26E5\n"
 | 
						|
	                    "1C739028E2FC58812827CBF0051EFC66\n"
 | 
						|
	                    "CA8257EE96943F9935D6F23B22C352F0\n"
 | 
						|
	                    "F432D2E6A915ED1E889B48BEABAF1613\n"
 | 
						|
	                    "E50143BD39F929C1B657F53627DB429E\n"
 | 
						|
	                    "874E42B42D8D8D48B999DB24C369EDA4\n"
 | 
						|
	                    "7ECBD3C97668FBAA7368C21ABABD3A93\n"
 | 
						|
	                    "B9E213EE48DED608F6E7E4585EA86C8D\n"
 | 
						|
	                    "66789F00B8AF2982F2D645FE50C08310\n"
 | 
						|
	                    "F6FAFC5923638A8264E1532C71A8B319\n"
 | 
						|
	                    "4D948F08FE727FF4536325F45E9D8609\n"
 | 
						|
	                    "F17176F1587229F848A7B210F97E6EE6\n"
 | 
						|
	                    "4B6178A0369B1047C520543DD4DC3AFA\n"
 | 
						|
	                    "2F009C270F4FFA5EAB4A33A6534954E6\n"
 | 
						|
	                    "971EF2F10D86342CB0142221F96FC249\n"
 | 
						|
	                    "1E9C790D04EBB03D8C2328A21D3C1408\n"
 | 
						|
	                    "E1ED1B822222E7293B7CCE76CC576EF0\n"
 | 
						|
	                    "1105FF7FD79676F6D6862D893BABF16F\n"
 | 
						|
	                    "D2AF8A2436CA7765EDD62C39C457EFF9\n"
 | 
						|
	                    "6BD6E0E929AB0889EB57B1A4AE413DED\n"
 | 
						|
	                    "5152A23AFE7EFBA855E13029C94A9D9E\n"
 | 
						|
	                    "5D58A5329E8212F58EC678CD61F1BB61\n"
 | 
						|
	                    "C6DAD36233822B35C356FFBC75798F16\n"
 | 
						|
	                    "B6B6739DAFE85AE258C3DA11EFF7E203\n"
 | 
						|
	                    "51AF150AED16549F8166F9415ADA3C5F\n"
 | 
						|
	                    "09F241E66B37A85B506A50938E7AAB0E\n"
 | 
						|
	                    "038220175AEE5DFA772BB4474C7663AA\n"
 | 
						|
	                    "AB59CB7379F114672F8E2CCE431F8073\n"
 | 
						|
	                    "784219DCC22EBD115B9E391B47B605A2\n"
 | 
						|
	                    "2F73EC1F142E05C7CA73B10B1D9A391A\n"
 | 
						|
	                    "5AF154E46D22AA58003A39FBF64F8832\n"
 | 
						|
	                    "3CA603672A9E2D8A075BC4373C0603E1\n"
 | 
						|
	                    "EF178B6A29A910737DC577D0560C8423\n"
 | 
						|
	                    "667D96C336969E69ED3AE0126ACD33EB\n"
 | 
						|
	                    "E80D8A3867A702277BD839D34603846A\n"
 | 
						|
	                    "627ED38234818579EE3EFD0F21CD33E6\n"
 | 
						|
	                    "EF0F9B2329A1443771DD779E400A8275\n"
 | 
						|
	                    "7760B6B44C42A4628B8308AC90C06294\n"
 | 
						|
	                    "64FFB17DDBCFDB7A7B9D3C7CD357C350\n"
 | 
						|
	                    "B9C560814A54B32C948305AEDEC062C6\n"
 | 
						|
	                    "65FBB05D769D8364FB43589C576D6454\n"
 | 
						|
	                    "879B63EC5E52B77C899270EA460EDB62\n"
 | 
						|
	                    "1A14AC1EB93F65ED4A0F14FFAA5FFFF7\n"
 | 
						|
	                    "008453897B03A45A828164E3512E66A1\n"
 | 
						|
	                    "AF55CB2A68EA403332833A9B1D5CD56F\n"
 | 
						|
	                    "723699957BD9DE3DA767A75B6DC365B9\n"
 | 
						|
	                    "FA57C66962E857765E6AA4E609816F6D\n"
 | 
						|
	                    "EC732AE3FF1B86226BA6073E76CF7BD5\n"
 | 
						|
	                    "1F0F956C7B70C9CB78F9D8130DEA75CD\n"
 | 
						|
	                    "D612F9D4CA3FCD26A2FC65949FC62E3F\n"
 | 
						|
	                    "C2646B9B12BAF43F21C659E1FA3ED5F8\n"
 | 
						|
	                    "E61BAF108ADB41BFEBCAC22B37D34EEA\n"
 | 
						|
	                    "A36ECFF6BE07B31DD7CF51A1B7A31E12\n"
 | 
						|
	                    "B15D5CBB22E43EDDE94FED263B9E2BA7\n"
 | 
						|
	                    "4E52B62B8FC600A09CDA79D96BFBA036\n"
 | 
						|
	                    "82C7DB656C837431CA439608B1C52F84\n"
 | 
						|
	                    "4148BF6FEB4D9C9374E150509D6C4D17\n"
 | 
						|
	                    "A707B7687DEF784094D360F34D40C663\n"
 | 
						|
	                    "5D57A61CA43F71F10F091EF3EB4FF4ED\n"
 | 
						|
	                    "019E4E8E7244E046909D33866BBFF85D\n"
 | 
						|
	                    "D87869ED4570288D3FDC18439232313D\n"
 | 
						|
	                    "91C07ED9C02AA062A85B638F71A4AD4D\n"
 | 
						|
	                    "D9616BE30675339F35DD7121F4E04E97\n"
 | 
						|
	                    "3E3CAA513062CD78DE471696737571C6\n"
 | 
						|
	                    "C533C0967CF835F5077FD475E8E71B8E\n"
 | 
						|
	                    "2B3BBD16666FD07BC5077AD10410BE67\n"
 | 
						|
	                    "CECC5AA1C597208828F6E27A95839237\n"
 | 
						|
	                    "6B90637C8C12DF05F78F28C10408F02B\n"
 | 
						|
	                    "AF8A5F4EAA3F829659BE9ED37AD42DAC\n"
 | 
						|
	                    "A327C9D9D960738D6A2ACC4B9F17C38D\n"
 | 
						|
	                    "4658BF20988347AB9DCB2BCE7EFEA735\n"
 | 
						|
	                    "82CAD6632FD42738C8569B41B3CB6C85\n"
 | 
						|
	                    "404CB46FEB579C8265FA42599D7A5015\n"
 | 
						|
	                    "B810A02C38AB0B011CB9AD47E0ED479C\n"
 | 
						|
	                    "5A856957967AB9B345D57565BD4C7C24\n"
 | 
						|
	                    "8336800C188B2B213C998D67C0CD67BC\n"
 | 
						|
	                    "7AA54977B615DAD560A7051D8F2B0D41\n"
 | 
						|
	                    "BD02F66021BF4C4047EAB90AA1BD4999\n"
 | 
						|
	                    "752CF4F712952778B0086C63D967C247\n"
 | 
						|
	                    "1C866F7968CD916A998676E825FF0D75\n"
 | 
						|
	                    "D23BFEF20AD155D01915E37ADADA1FF1\n"
 | 
						|
	                    "C384368E34AFB6629F92C76F28C4797C\n"
 | 
						|
	                    "9113D917A5907BCE194282F9342CCF56\n"
 | 
						|
	                    "BFF370D2E9BE11B80288DD05A4A2B70C\n"
 | 
						|
	                    "05F45304A838BB3DC5AA5DF43F368E48\n"
 | 
						|
	                    "EAFC7DD8E8AC5FA50595CE44B8A4A24F\n"
 | 
						|
	                    "57E94E57BD37F53FCCF84FFC37238E49\n"
 | 
						|
	                    "F7E767D5E9BC11CCB1696FDD1AB8A032\n"
 | 
						|
	                    "96B0FC0CEB57DAC91BE4FAED1050BA1E\n"
 | 
						|
	                    "12E925A161DAEA4BA56D6E8908A5AF60\n"
 | 
						|
	                    "96BCF549BF48D09B1FEAF0B8104DBD00\n"
 | 
						|
	                    "03FB6BAB6ADAFC02AA643C8E01B9B524\n"
 | 
						|
	                    "8DA2F62C1CD5C92DB0145D88314956F5\n"
 | 
						|
	                    "44ED7A21AF4B0844E3FB0EA3EB47DA17\n"
 | 
						|
	                    "DC3359A313DAC761A6150F8A370A4190\n"
 | 
						|
	                    "22EFF7148D6428AB093265CA63D95306\n"
 | 
						|
	                    "DE7E796ECEC5389EDF7FE433EA137780\n"
 | 
						|
	                    "2680CA031FFB66C28B5EE79F87369133\n"
 | 
						|
	                    "ABE63C83919D3B2299787E9300D70BE4\n"
 | 
						|
	                    "886FCB4205F271D0C249EDBFC6293ED8\n"
 | 
						|
	                    "58E4F124EAF8BF0DB50F94AD9E534BA8\n"
 | 
						|
	                    "31D8811DBB848C71D82CEEBB24C2C5D4\n"
 | 
						|
	                    "24729E6766DB59DC1EBBD271F2BF726A\n"
 | 
						|
	                    "8910F9A03C9AA5AD56EC4BD39917B0E8\n"
 | 
						|
	                    "F20545A90942E371AF7D8AB25EA0757C\n"
 | 
						|
	                    "9C08B0BA32D7A4E24EE40CA04E859B7C\n"
 | 
						|
	                    "E34B408463490CA109B93521B2121805\n"
 | 
						|
	                    "A0B45EF9F45E85439C704E8F6EA5BB5C\n"
 | 
						|
	                    "C36B60A443692C812999020DDB2F5019\n"
 | 
						|
	                    "D0DE38AD5A762DD4C03CB54218862517\n"
 | 
						|
	                    "53A246E47233B1455D1AF0EF0AFDB55D\n"
 | 
						|
	                    "C803CF2740E50ECFDE36EB421C86390F\n"
 | 
						|
	                    "42EB5FF13B23B75C541B9EF0091DE168\n"
 | 
						|
	                    "9FC55BF8CA8E7F9E2EA7FE6C9880E741\n"
 | 
						|
	                    "7373657274696F6E20226D5F74696D65\n"
 | 
						|
	                    "725265736F6C7574696F6E20213D2030\n"
 | 
						|
	                    "22206661696C6564206174202E2E2F2E\n"
 | 
						|
	                    "2E2F2E2E2F2E2E2F732F646570732F74\n"
 | 
						|
	                    "65616D737065616B5F7365727665725F\n"
 | 
						|
	                    "6C69622F7372632F74735F7365727665\n"
 | 
						|
	                    "722F616E7469666C6F6F642E6370703A\n"
 | 
						|
	                    "00416E7469466C6F6F64004173736572\n"
 | 
						|
	                    "74696F6E20226D5F706F696E74735469\n"
 | 
						|
	                    "636B5261746520213D20302220666169\n"
 | 
						|
	                    "6C6564206174202E2E2F2E2E2F2E2E2F\n"
 | 
						|
	                    "2E2E2F732F646570732F7465616D7370\n"
 | 
						|
	                    "65616B5F7365727665725F6C69622F73\n"
 | 
						|
	                    "72632F74735F7365727665722F616E74\n"
 | 
						|
	                    "69666C6F6F642E6370703A0052656765\n"
 | 
						|
	                    "7870206572726F7220666F7220495020\n"
 | 
						|
	                    "65787072657373696F6E202200222C20\n"
 | 
						|
	                    "6572726F723A200042616E4D616E6167\n"
 | 
						|
	                    "657200526567657870206572726F7220\n"
 | 
						|
	                    "666F72204E616D652065787072657373\n"
 | 
						|
	                    "696F6E20220054686973206E616D6520\n"
 | 
						|
	                    "69732000596F7520617265200062616E\n"
 | 
						|
	                    "6E6564207065726D616E656E746C792E\n"
 | 
						|
	                    "0062616E6E65642074656D706F726172\n"
 | 
						|
	                    "696C792E0020526561736F6E3A202200\n"
 | 
						|
	                    "0A54727920616761696E20696E20006E\n"
 | 
						|
	                    "6F7469667962616E6C697374006C6173\n"
 | 
						|
	                    "746E69636B6E616D6500696E766F6B65\n"
 | 
						|
	                    "72636C6462696400656E666F7263656D\n"
 | 
						|
	                    "656E74730062616E5F696E736572742E\n"
 | 
						|
	                    "73716C0062616E5F69700062616E5F6E\n"
 | 
						|
	                    "616D650062616E5F7569640062616E5F\n"
 | 
						|
	                    "74696D657374616D700062616E5F6C65\n"
 | 
						|
	                    "6E6774680062616E5F696E766F6B6572\n"
 | 
						|
	                    "5F636C69656E745F69640062616E5F69\n"
 | 
						|
	                    "6E766F6B65725F7569640062616E5F69\n"
 | 
						|
	                    "6E766F6B65725F6E616D650062616E5F\n"
 | 
						|
	                    "726561736F6E0062616E5F6861736800\n"
 | 
						|
	                    "62616E5F64656C6574652E73716C0062\n"
 | 
						|
	                    "616E5F696400417373657274696F6E20\n"
 | 
						|
	                    "226572726F72203D3D204552524F525F\n"
 | 
						|
	                    "6F6B22206661696C6564206174202E2E\n"
 | 
						|
	                    "2F2E2E2F2E2E2F2E2E2F732F64657073\n"
 | 
						|
	                    "2F7465616D737065616B5F7365727665\n"
 | 
						|
	                    "725F6C69622F7372632F74735F736572\n"
 | 
						|
	                    "7665722F62616E6D616E616765722E63\n"
 | 
						|
	                    "70703A0062616E2064656C6574656420\n"
 | 
						|
	                    "28657870697265642920726561736F6E\n"
 | 
						|
	                    "3D0062616E5F6C6973742E73716C0069\n"
 | 
						|
	                    "6E76616C69642062616E206974656D20\n"
 | 
						|
	                    "776974682069643A2000000000000000\n"
 | 
						|
	                    "4E5374335F5F3132315F5F656D707479\n"
 | 
						|
	                    "5F6E6F6E5F6F776E5F73746174654963\n"
 | 
						|
	                    "45450000000000000000000000000000\n"
 | 
						|
	                    "4E5374335F5F3131355F5F6861735F6F\n"
 | 
						|
	                    "6E655F73746174654963454500000000\n"
 | 
						|
	                    "4E5374335F5F31365F5F6E6F64654963\n"
 | 
						|
	                    "45450000000000000000000000000000\n"
 | 
						|
	                    "4E5374335F5F3131315F5F616C746572\n"
 | 
						|
	                    "6E617465496345450000000000000000\n"
 | 
						|
	                    "4E5374335F5F3131375F5F6F776E735F\n"
 | 
						|
	                    "74776F5F737461746573496345450000\n"
 | 
						|
	                    "4E5374335F5F3131365F5F6F776E735F\n"
 | 
						|
	                    "6F6E655F737461746549634545000000\n"
 | 
						|
	                    "4E5374335F5F3131375F5F7265706561\n"
 | 
						|
	                    "745F6F6E655F6C6F6F70496345450000\n"
 | 
						|
	                    "4E5374335F5F31365F5F6C6F6F704963\n"
 | 
						|
	                    "45450000000000000000000000000000\n"
 | 
						|
	                    "4E5374335F5F3132365F5F656E645F6D\n"
 | 
						|
	                    "61726B65645F73756265787072657373\n"
 | 
						|
	                    "696F6E49634545000000000000000000\n"
 | 
						|
	                    "4E5374335F5F3132385F5F626567696E\n"
 | 
						|
	                    "5F6D61726B65645F7375626578707265\n"
 | 
						|
	                    "7373696F6E4963454500000000000000\n"
 | 
						|
	                    "4E5374335F5F3131305F5F725F616E63\n"
 | 
						|
	                    "686F7249634545000000000000000000\n"
 | 
						|
	                    "4E5374335F5F3131305F5F6C5F616E63\n"
 | 
						|
	                    "686F7249634545000000000000000000\n"
 | 
						|
	                    "4E5374335F5F3131325F5F6D61746368\n"
 | 
						|
	                    "5F636861724963454500000000000000\n"
 | 
						|
	                    "4E5374335F5F3132305F5F6D61746368\n"
 | 
						|
	                    "5F636861725F636F6C6C61746549634E\n"
 | 
						|
	                    "535F313272656765785F747261697473\n"
 | 
						|
	                    "49634545454500000000000000000000\n"
 | 
						|
	                    "4E5374335F5F3131385F5F6D61746368\n"
 | 
						|
	                    "5F636861725F696361736549634E535F\n"
 | 
						|
	                    "313272656765785F7472616974734963\n"
 | 
						|
	                    "45454545000000000000000000000000\n"
 | 
						|
	                    "4E5374335F5F3132305F5F627261636B\n"
 | 
						|
	                    "65745F65787072657373696F6E49634E\n"
 | 
						|
	                    "535F313272656765785F747261697473\n"
 | 
						|
	                    "49634545454500000000000000000000\n"
 | 
						|
	                    "4E5374335F5F3131315F5F6D61746368\n"
 | 
						|
	                    "5F616E79496345450000000000000000\n"
 | 
						|
	                    "4E5374335F5F3131305F5F6261636B5F\n"
 | 
						|
	                    "72656649634545000000000000000000\n"
 | 
						|
	                    "4E5374335F5F3131385F5F6261636B5F\n"
 | 
						|
	                    "7265665F636F6C6C61746549634E535F\n"
 | 
						|
	                    "313272656765785F7472616974734963\n"
 | 
						|
	                    "45454545000000000000000000000000\n"
 | 
						|
	                    "4E5374335F5F3131365F5F6261636B5F\n"
 | 
						|
	                    "7265665F696361736549634E535F3132\n"
 | 
						|
	                    "72656765785F74726169747349634545\n"
 | 
						|
	                    "45450000000000000000000000000000\n"
 | 
						|
	                    "4E5374335F5F3132335F5F6D61746368\n"
 | 
						|
	                    "5F616E795F6275745F6E65776C696E65\n"
 | 
						|
	                    "49634545000000000000000000000000\n"
 | 
						|
	                    "4E5374335F5F3131315F5F6C6F6F6B61\n"
 | 
						|
	                    "6865616449634E535F31327265676578\n"
 | 
						|
	                    "5F747261697473496345454545000000\n"
 | 
						|
	                    "4E5374335F5F3131355F5F776F72645F\n"
 | 
						|
	                    "626F756E6461727949634E535F313272\n"
 | 
						|
	                    "656765785F7472616974734963454545\n"
 | 
						|
	                    "45000000000000000000000000000000\n"
 | 
						|
	                    "4E5374335F5F3131335F5F656D707479\n"
 | 
						|
	                    "5F737461746549634545000000000000\n"
 | 
						|
	                    "4E5374335F5F3132305F5F7368617265\n"
 | 
						|
	                    "645F7074725F706F696E74657249504E\n"
 | 
						|
	                    "535F31335F5F656D7074795F73746174\n"
 | 
						|
	                    "65496345454E535F313464656661756C\n"
 | 
						|
	                    "745F64656C6574654953325F45454E53\n"
 | 
						|
	                    "5F39616C6C6F6361746F724953325F45\n"
 | 
						|
	                    "45454500000000000000000000000000\n"
 | 
						|
	                    "4E5374335F5F31313464656661756C74\n"
 | 
						|
	                    "5F64656C657465494E535F31335F5F65\n"
 | 
						|
	                    "6D7074795F7374617465496345454545\n"
 | 
						|
	                    "00000000000000000000000000000000\n"
 | 
						|
	                    "4E5374335F5F3131315F5F656E645F73\n"
 | 
						|
	                    "74617465496345450041737365727469\n"
 | 
						|
	                    "6F6E20226D5F705669727475616C5365\n"
 | 
						|
	                    "7276657220213D205F5F6E756C6C2220\n"
 | 
						|
	                    "6661696C6564206174202E2E2F2E2E2F\n"
 | 
						|
	                    "2E2E2F2E2E2F732F646570732F746561\n"
 | 
						|
	                    "6D737065616B5F7365727665725F6C69\n"
 | 
						|
	                    "622F7372632F74735F7365727665722F\n"
 | 
						|
	                    "6368616E636C69656E74736361636865\n"
 | 
						|
	                    "2E6370703A004368616E436C69656E43\n"
 | 
						|
	                    "6163686500417373657274696F6E2022\n"
 | 
						|
	                    "6D5F5468726561644944203D3D207374\n"
 | 
						|
	                    "643A3A746869735F7468726561643A3A\n"
 | 
						|
	                    "6765745F6964282922206661696C6564\n"
 | 
						|
	                    "206174202E2E2F2E2E2F2E2E2F2E2E2F\n"
 | 
						|
	                    "732F646570732F7465616D737065616B\n"
 | 
						|
	                    "5F7365727665725F6C69622F7372632F\n"
 | 
						|
	                    "74735F7365727665722F6368616E636C\n"
 | 
						|
	                    "69656E747363616368652E6370703A00\n"
 | 
						|
	                    "636F6D706C61696E5F696E736572742E\n"
 | 
						|
	                    "73716C00636F6D706C61696E5F66726F\n"
 | 
						|
	                    "6D5F636C69656E745F696400636F6D70\n"
 | 
						|
	                    "6C61696E5F746F5F636C69656E745F69\n"
 | 
						|
	                    "6400636F6D706C61696E5F6D65737361\n"
 | 
						|
	                    "676500636F6D706C61696E5F74696D65\n"
 | 
						|
	                    "7374616D7000636F6D706C61696E5F68\n"
 | 
						|
	                    "61736800636F6D706C61696E5F64656C\n"
 | 
						|
	                    "6574652E73716C00636F6D706C61696E\n"
 | 
						|
	                    "5F64656C6574655F616C6C2E73716C00\n"
 | 
						|
	                    "636F6D706C61696E5F64656C6574655F\n"
 | 
						|
	                    "7072756E652E73716C00636F6D706C61\n"
 | 
						|
	                    "696E5F6765745F62795F736572766572\n"
 | 
						|
	                    "69642E73716C00536F6D6520636F6D70\n"
 | 
						|
	                    "6C61696E7420656E7472696573206672\n"
 | 
						|
	                    "6F6D2074686520646174616261736520\n"
 | 
						|
	                    "77657265206E6F74206C6F6164656420\n"
 | 
						|
	                    "62656361757365207468657920776572\n"
 | 
						|
	                    "65206475706C696361746573206F6620\n"
 | 
						|
	                    "616C7265616479206C6F61646564206F\n"
 | 
						|
	                    "6E657300436F6D706C61696E4D677200\n"
 | 
						|
	                    "6368616E6E656C5F696E736572745F62\n"
 | 
						|
	                    "756C6B2E73716C006F72675F6368616E\n"
 | 
						|
	                    "6E656C5F6964006368616E6E656C5F69\n"
 | 
						|
	                    "6E736572745F62756C6B5F6669787570\n"
 | 
						|
	                    "2E73716C006368616E6E656C5F696E73\n"
 | 
						|
	                    "6572745F62756C6B5F6D617070696E67\n"
 | 
						|
	                    "2E73716C006368616E6E656C5F70726F\n"
 | 
						|
	                    "706572746965735F62756C6B5F696E73\n"
 | 
						|
	                    "6572742E73716C006368616E6E656C5F\n"
 | 
						|
	                    "64656C6574652E73716C006368616E6E\n"
 | 
						|
	                    "656C5F696E736572742E73716C006368\n"
 | 
						|
	                    "616E6E656C5F7570646174655F706172\n"
 | 
						|
	                    "656E7469642E73716C00536572766572\n"
 | 
						|
	                    "517565727920477565737400636C6965\n"
 | 
						|
	                    "6E745F696E736572742E73716C00636C\n"
 | 
						|
	                    "69656E745F696E736572745F62756C6B\n"
 | 
						|
	                    "2E73716C006F72675F636C69656E745F\n"
 | 
						|
	                    "696400636C69656E745F696E73657274\n"
 | 
						|
	                    "5F62756C6B5F6D617070696E672E7371\n"
 | 
						|
	                    "6C00636C69656E745F70726F70657274\n"
 | 
						|
	                    "6965735F62756C6B5F696E736572742E\n"
 | 
						|
	                    "73716C00636C69656E745F6765745F62\n"
 | 
						|
	                    "795F7569642E73716C00636C69656E74\n"
 | 
						|
	                    "5F6D6F6E74685F75706C6F616400636C\n"
 | 
						|
	                    "69656E745F746F74616C5F75706C6F61\n"
 | 
						|
	                    "6400636C69656E745F6D6F6E74685F64\n"
 | 
						|
	                    "6F776E6C6F616400636C69656E745F74\n"
 | 
						|
	                    "6F74616C5F646F776E6C6F616400636C\n"
 | 
						|
	                    "69656E745F64656C6574652E73716C00\n"
 | 
						|
	                    "636C69656E745F7570646174655F6C6F\n"
 | 
						|
	                    "67696E5F696E666F2E73716C00636C69\n"
 | 
						|
	                    "656E745F7570646174655F6E616D652E\n"
 | 
						|
	                    "73716C00636C69656E745F7570646174\n"
 | 
						|
	                    "655F73746174732E73716C00636C6965\n"
 | 
						|
	                    "6E745F7570646174655F747261666669\n"
 | 
						|
	                    "635F73746174732E73716C006D657373\n"
 | 
						|
	                    "6167655F6765745F756E726561645F62\n"
 | 
						|
	                    "795F636C69656E7469642E73716C0075\n"
 | 
						|
	                    "6E72656164002E736F006C6962007761\n"
 | 
						|
	                    "6974696E6720666F7220636F6E6E6563\n"
 | 
						|
	                    "74696F6E20617661696C61626C650064\n"
 | 
						|
	                    "6174616261736520636F6E6E65637469\n"
 | 
						|
	                    "6F6E206E6F7420666F756E6400417373\n"
 | 
						|
	                    "657274696F6E20226572726F72203D3D\n"
 | 
						|
	                    "204552524F525F6F6B22206661696C65\n"
 | 
						|
	                    "64206174202E2E2F2E2E2F2E2E2F2E2E\n"
 | 
						|
	                    "2F732F646570732F7465616D73706561\n"
 | 
						|
	                    "6B5F7365727665725F6C69622F737263\n"
 | 
						|
	                    "2F74735F7365727665722F6461746162\n"
 | 
						|
	                    "6173652F64625F64617461626173652E\n"
 | 
						|
	                    "6370703A00506C65617365206D616B65\n"
 | 
						|
	                    "207375726520796F7520757365207468\n"
 | 
						|
	                    "6520737570706C696564207473337365\n"
 | 
						|
	                    "727665725F6D696E696D616C5F72756E\n"
 | 
						|
	                    "7363726970742E736820746F2072756E\n"
 | 
						|
	                    "20746865207365727665722C206F7220\n"
 | 
						|
	                    "736574204C445F4C4942524152595F50\n"
 | 
						|
	                    "41544820796F757273656C6600756E61\n"
 | 
						|
	                    "626C6520746F206C6F61642064617461\n"
 | 
						|
	                    "6261736520706C7567696E206C696272\n"
 | 
						|
	                    "617279202200222C2068616C74696E67\n"
 | 
						|
	                    "21007473336462706C7567696E5F696E\n"
 | 
						|
	                    "6974007473336462706C7567696E5F73\n"
 | 
						|
	                    "687574646F776E007473336462706C75\n"
 | 
						|
	                    "67696E5F636F6E6E6563740074733364\n"
 | 
						|
	                    "62706C7567696E5F646973636F6E6E65\n"
 | 
						|
	                    "6374007473336462706C7567696E5F65\n"
 | 
						|
	                    "786563007473336462706C7567696E5F\n"
 | 
						|
	                    "6F70656E007473336462706C7567696E\n"
 | 
						|
	                    "5F62756C6B5F696E7365727400747333\n"
 | 
						|
	                    "6462706C7567696E5F6765746C617374\n"
 | 
						|
	                    "696E736572746964007473336462706C\n"
 | 
						|
	                    "7567696E5F6765746D6F646966696564\n"
 | 
						|
	                    "726F77636F756E74007473336462706C\n"
 | 
						|
	                    "7567696E5F7461626C65657869737473\n"
 | 
						|
	                    "007473336462706C7567696E5F766572\n"
 | 
						|
	                    "73696F6E007473336462706C7567696E\n"
 | 
						|
	                    "5F6E616D65007473336462706C756769\n"
 | 
						|
	                    "6E5F73686F72746E616D650074733364\n"
 | 
						|
	                    "62706C7567696E5F6170697665727369\n"
 | 
						|
	                    "6F6E007473336462706C7567696E5F67\n"
 | 
						|
	                    "65746C6173746572726F72004661696C\n"
 | 
						|
	                    "656420746F20696D706F727420220022\n"
 | 
						|
	                    "2066726F6D202200436F756C64206E6F\n"
 | 
						|
	                    "74206C6F616420646174616261736520\n"
 | 
						|
	                    "706C7567696E006462506C7567696E20\n"
 | 
						|
	                    "6E616D653A20202020006462506C7567\n"
 | 
						|
	                    "696E2076657273696F6E3A2000506C75\n"
 | 
						|
	                    "67696E206170692076657273696F6E20\n"
 | 
						|
	                    "69732000207768696C65200020697320\n"
 | 
						|
	                    "72657175697265640064625F65786563\n"
 | 
						|
	                    "2829200064625F62756C6B5F696E7365\n"
 | 
						|
	                    "72742829200064625F6F70656E282920\n"
 | 
						|
	                    "00646174616261736520627573792C20\n"
 | 
						|
	                    "77616974696E6720666F722066696E69\n"
 | 
						|
	                    "7368696E6720696E646578207461736B\n"
 | 
						|
	                    "732C206D61792074616B6520736F6D65\n"
 | 
						|
	                    "2074696D65210073657453514C66726F\n"
 | 
						|
	                    "6D46696C65282066696C653A00726570\n"
 | 
						|
	                    "206669656C6473202F20696E73657274\n"
 | 
						|
	                    "20706F696E742073697A65206E6F7420\n"
 | 
						|
	                    "73616D6520666F722073716C20616E64\n"
 | 
						|
	                    "20726570656174207061727400417373\n"
 | 
						|
	                    "657274696F6E2022737472696E675F66\n"
 | 
						|
	                    "69656C645F636F756E74203D3D207374\n"
 | 
						|
	                    "72696E675F6669656C645F6E616D6573\n"
 | 
						|
	                    "2E73697A65282922206661696C656420\n"
 | 
						|
	                    "6174202E2E2F2E2E2F2E2E2F2E2E2F73\n"
 | 
						|
	                    "2F646570732F7465616D737065616B5F\n"
 | 
						|
	                    "7365727665725F6C69622F7372632F74\n"
 | 
						|
	                    "735F7365727665722F64617461626173\n"
 | 
						|
	                    "652F64625F64617461626173652E6370\n"
 | 
						|
	                    "703A00696E76616C696420706172616D\n"
 | 
						|
	                    "6574657220666F756E6420005C5B5C5B\n"
 | 
						|
	                    "5C5B282E2A3F295C5D5C5D5C5D005C3A\n"
 | 
						|
	                    "285B5E5C3A5D2A3F5C2A295C3A003A24\n"
 | 
						|
	                    "3031303A003A24303100417373657274\n"
 | 
						|
	                    "696F6E2022216D5F73746F726167652E\n"
 | 
						|
	                    "656F66282922206661696C6564206174\n"
 | 
						|
	                    "202E2E2F2E2E2F2E2E2F2E2E2F732F64\n"
 | 
						|
	                    "6570732F7465616D737065616B5F7365\n"
 | 
						|
	                    "727665725F6C69622F7372632F74735F\n"
 | 
						|
	                    "7365727665722F64617461626173652F\n"
 | 
						|
	                    "64625F64617461626173652E6370703A\n"
 | 
						|
	                    "00756E6B6E6F776E207461626C652066\n"
 | 
						|
	                    "69656C64207265717565737465643A20\n"
 | 
						|
	                    "00417373657274696F6E2022636F756E\n"
 | 
						|
	                    "74203C3D20363422206661696C656420\n"
 | 
						|
	                    "6174202E2E2F2E2E2F2E2E2F2E2E2F73\n"
 | 
						|
	                    "2F646570732F7465616D737065616B5F\n"
 | 
						|
	                    "7365727665725F6C69622F7372632F74\n"
 | 
						|
	                    "735F7365727665722F64617461626173\n"
 | 
						|
	                    "652F64625F64617461626173652E6370\n"
 | 
						|
	                    "703A00417373657274696F6E20227369\n"
 | 
						|
	                    "7A65735B695D203C3D207374643A3A6E\n"
 | 
						|
	                    "756D657269635F6C696D6974733C756E\n"
 | 
						|
	                    "7369676E656420696E743E3A3A6D6178\n"
 | 
						|
	                    "282922206661696C6564206174202E2E\n"
 | 
						|
	                    "2F2E2E2F2E2E2F2E2E2F732F64657073\n"
 | 
						|
	                    "2F7465616D737065616B5F7365727665\n"
 | 
						|
	                    "725F6C69622F7372632F74735F736572\n"
 | 
						|
	                    "7665722F64617461626173652F64625F\n"
 | 
						|
	                    "64617461626173652E6370703A005C3A\n"
 | 
						|
	                    "285B612D7A412D5A302D395F2D5D2A3F\n"
 | 
						|
	                    "295C3A005C3A285B612D7A412D5A302D\n"
 | 
						|
	                    "395F2D5D2A3F295C2A303F5C3A000000\n"
 | 
						|
	                    "3134437573746F6D4461746162617365\n"
 | 
						|
	                    "00000000000000000000000000000000\n"
 | 
						|
	                    "3134506C7567696E4461746162617365\n"
 | 
						|
	                    "0064625F4372656174655461626C6573\n"
 | 
						|
	                    "282920756E61626C6520746F206C6F61\n"
 | 
						|
	                    "6420696E7374616E6365206465666175\n"
 | 
						|
	                    "6C742076616C7565730053514C006372\n"
 | 
						|
	                    "656174655F7461626C65732E73716C00\n"
 | 
						|
	                    "64625F4372656174655461626C657328\n"
 | 
						|
	                    "2920756E61626C6520746F2063726561\n"
 | 
						|
	                    "7465207461626C65730064625F437265\n"
 | 
						|
	                    "6174655461626C65732829207461626C\n"
 | 
						|
	                    "65732063726561746564006465666175\n"
 | 
						|
	                    "6C74732E73716C0064625F4372656174\n"
 | 
						|
	                    "655461626C6573282920756E61626C65\n"
 | 
						|
	                    "20746F20696E73657274206465666175\n"
 | 
						|
	                    "6C742076616C7565730064625F437265\n"
 | 
						|
	                    "6174655461626C6573282920666F756E\n"
 | 
						|
	                    "6420696E76616C696420646174616261\n"
 | 
						|
	                    "73652076657273696F6E0064625F4372\n"
 | 
						|
	                    "656174655461626C6573282920756E61\n"
 | 
						|
	                    "626C6520746F207361766520696E7374\n"
 | 
						|
	                    "616E63652064656661756C742076616C\n"
 | 
						|
	                    "7565730064625F437265617465546162\n"
 | 
						|
	                    "6C6573282920756E61626C6520746F20\n"
 | 
						|
	                    "696E7365727420646174616261736520\n"
 | 
						|
	                    "76657273696F6E0064726F705F746162\n"
 | 
						|
	                    "6C65732E73716C0064625F4372656174\n"
 | 
						|
	                    "655461626C65732829207461626C6573\n"
 | 
						|
	                    "2064726F7065640064625F4372656174\n"
 | 
						|
	                    "655461626C6573282920756E61626C65\n"
 | 
						|
	                    "20746F2064726F70207461626C657300\n"
 | 
						|
	                    "7570646174655F64617461626173655F\n"
 | 
						|
	                    "76657273696F6E2E73716C0043524954\n"
 | 
						|
	                    "4943414C206572726F72207768696C65\n"
 | 
						|
	                    "207570646174696E6720646174616261\n"
 | 
						|
	                    "73652076657273696F6E007570646174\n"
 | 
						|
	                    "655F0064617461626173652075706461\n"
 | 
						|
	                    "746564207375636365737366756C6C79\n"
 | 
						|
	                    "20746F207265766973696F6E3A200075\n"
 | 
						|
	                    "70646174655461626C6573282920756E\n"
 | 
						|
	                    "61626C6520746F207570646174652064\n"
 | 
						|
	                    "617461626173652076657273696F6E00\n"
 | 
						|
	                    "64617461626173652075706461746520\n"
 | 
						|
	                    "746F207265766973696F6E3A20006375\n"
 | 
						|
	                    "73746F6D5F696E736572742E73716C00\n"
 | 
						|
	                    "637573746F6D5F64656C6574655F6279\n"
 | 
						|
	                    "5F636C69656E7469642E73716C00636C\n"
 | 
						|
	                    "69656E745F64656C6574655F7072756E\n"
 | 
						|
	                    "652E73716C0067726F7570735F736572\n"
 | 
						|
	                    "7665720067726F7570735F6368616E6E\n"
 | 
						|
	                    "656C007065726D5F696E736572742E73\n"
 | 
						|
	                    "716C007065726D5F6964007065726D5F\n"
 | 
						|
	                    "76616C7565007065726D5F6E65676174\n"
 | 
						|
	                    "6564007065726D5F736B697000706572\n"
 | 
						|
	                    "6D5F64656C6574655F62795F67726F75\n"
 | 
						|
	                    "7069642E73716C007065726D5F64656C\n"
 | 
						|
	                    "6574655F62795F7065726D69642E7371\n"
 | 
						|
	                    "6C007065726D5F696E736572745F6275\n"
 | 
						|
	                    "6C6B2E73716C0067726F75705F6D656D\n"
 | 
						|
	                    "6265725F696E736572745F62756C6B2E\n"
 | 
						|
	                    "73716C0067726F75705F696E73657274\n"
 | 
						|
	                    "2E73716C0067726F75705F696E736572\n"
 | 
						|
	                    "745F62756C6B5F736E617073686F742E\n"
 | 
						|
	                    "73716C006F72675F67726F75705F6964\n"
 | 
						|
	                    "0067726F75705F696E736572745F6275\n"
 | 
						|
	                    "6C6B5F736E617073686F745F6765745F\n"
 | 
						|
	                    "6D617070696E672E73716C0067726F75\n"
 | 
						|
	                    "705F64656C6574652E73716C00746162\n"
 | 
						|
	                    "6C6567726F7570007461626C65706572\n"
 | 
						|
	                    "6D73007461626C656D656D6265727300\n"
 | 
						|
	                    "67726F75705F72656E616D652E73716C\n"
 | 
						|
	                    "0067726F7570735F6765745F62795F73\n"
 | 
						|
	                    "657276657269645F747970652E73716C\n"
 | 
						|
	                    "0067726F75705F69645F6765745F6279\n"
 | 
						|
	                    "5F6E616D652E73716C007065726D5F75\n"
 | 
						|
	                    "70646174655F6765745F67726F757073\n"
 | 
						|
	                    "2E73716C006661696C656420746F2075\n"
 | 
						|
	                    "7064617465207065726D697373696F6E\n"
 | 
						|
	                    "732C2068616C74656421007065726D5F\n"
 | 
						|
	                    "72656E616D652E73716C006F6C645F70\n"
 | 
						|
	                    "65726D5F6E616D65006E65775F706572\n"
 | 
						|
	                    "6D5F6E616D6500756E61626C6520746F\n"
 | 
						|
	                    "2072656E616D65207065726D69737369\n"
 | 
						|
	                    "6F6E2C2068616C74656421007065726D\n"
 | 
						|
	                    "5F636F70795F64656661756C745F7065\n"
 | 
						|
	                    "726D697373696F6E732E73716C00756E\n"
 | 
						|
	                    "61626C6520746F20636F707920646566\n"
 | 
						|
	                    "61756C74207065726D697373696F6E73\n"
 | 
						|
	                    "2C2068616C74656421006661696C6564\n"
 | 
						|
	                    "20746F20726574726965766520766972\n"
 | 
						|
	                    "7475616C736572766572732C2068616C\n"
 | 
						|
	                    "74656421007065726D5F736572766572\n"
 | 
						|
	                    "5F67726F757000695F636C69656E745F\n"
 | 
						|
	                    "6D6F646966795F706F77657200695F6E\n"
 | 
						|
	                    "65656465645F6D6F646966795F706F77\n"
 | 
						|
	                    "65725F636C69656E745F6D6F64696679\n"
 | 
						|
	                    "5F706F77657200695F636C69656E745F\n"
 | 
						|
	                    "6E65656465645F6D6F646966795F706F\n"
 | 
						|
	                    "77657200695F6E65656465645F6D6F64\n"
 | 
						|
	                    "6966795F706F7765725F636C69656E74\n"
 | 
						|
	                    "5F6E65656465645F6D6F646966795F70\n"
 | 
						|
	                    "6F776572007570646174656420706572\n"
 | 
						|
	                    "6D697373696F6E7320746F2076657273\n"
 | 
						|
	                    "696F6E2031007065726D5F6368616E6E\n"
 | 
						|
	                    "656C5F67726F75707300757064617465\n"
 | 
						|
	                    "64207065726D697373696F6E7320746F\n"
 | 
						|
	                    "2076657273696F6E2032007570646174\n"
 | 
						|
	                    "6564207065726D697373696F6E732074\n"
 | 
						|
	                    "6F2076657273696F6E20330075706461\n"
 | 
						|
	                    "746564207065726D697373696F6E7320\n"
 | 
						|
	                    "746F2076657273696F6E203400757064\n"
 | 
						|
	                    "61746564207065726D697373696F6E73\n"
 | 
						|
	                    "20746F2076657273696F6E2035007570\n"
 | 
						|
	                    "6461746564207065726D697373696F6E\n"
 | 
						|
	                    "7320746F2076657273696F6E20360075\n"
 | 
						|
	                    "706461746564207065726D697373696F\n"
 | 
						|
	                    "6E7320746F2076657273696F6E203700\n"
 | 
						|
	                    "695F6368616E6E656C5F6D6F64696679\n"
 | 
						|
	                    "5F6D616B655F636F6465635F656E6372\n"
 | 
						|
	                    "79707465640075706461746564207065\n"
 | 
						|
	                    "726D697373696F6E7320746F20766572\n"
 | 
						|
	                    "73696F6E203800757064617465642070\n"
 | 
						|
	                    "65726D697373696F6E7320746F207665\n"
 | 
						|
	                    "7273696F6E2039007570646174656420\n"
 | 
						|
	                    "7065726D697373696F6E7320746F2076\n"
 | 
						|
	                    "657273696F6E20313000695F636C6965\n"
 | 
						|
	                    "6E745F6D61785F636C6F6E657300695F\n"
 | 
						|
	                    "6E65656465645F6D6F646966795F706F\n"
 | 
						|
	                    "7765725F636C69656E745F6D61785F63\n"
 | 
						|
	                    "6C6F6E65730075706461746564207065\n"
 | 
						|
	                    "726D697373696F6E7320746F20766572\n"
 | 
						|
	                    "73696F6E203131007570646174655F70\n"
 | 
						|
	                    "65726D697373696F6E735F31322E7371\n"
 | 
						|
	                    "6C006661696C656420746F2075706772\n"
 | 
						|
	                    "616465207065726D697373696F6E732C\n"
 | 
						|
	                    "2068616C746564210075706461746564\n"
 | 
						|
	                    "207065726D697373696F6E7320746F20\n"
 | 
						|
	                    "76657273696F6E203132007570646174\n"
 | 
						|
	                    "6564207065726D697373696F6E732074\n"
 | 
						|
	                    "6F2076657273696F6E20313300757064\n"
 | 
						|
	                    "61746564207065726D697373696F6E73\n"
 | 
						|
	                    "20746F2076657273696F6E2031340075\n"
 | 
						|
	                    "706461746564207065726D697373696F\n"
 | 
						|
	                    "6E7320746F2076657273696F6E203135\n"
 | 
						|
	                    "0075706461746564207065726D697373\n"
 | 
						|
	                    "696F6E7320746F2076657273696F6E20\n"
 | 
						|
	                    "31360075706461746564207065726D69\n"
 | 
						|
	                    "7373696F6E7320746F2076657273696F\n"
 | 
						|
	                    "6E20313700625F7669727475616C7365\n"
 | 
						|
	                    "727665725F6D6F646966795F64656661\n"
 | 
						|
	                    "756C745F74656D705F6368616E6E656C\n"
 | 
						|
	                    "5F64656C6574655F64656C617900695F\n"
 | 
						|
	                    "6E65656465645F6D6F646966795F706F\n"
 | 
						|
	                    "7765725F7669727475616C7365727665\n"
 | 
						|
	                    "725F6D6F646966795F64656661756C74\n"
 | 
						|
	                    "5F74656D705F6368616E6E656C5F6465\n"
 | 
						|
	                    "6C6574655F64656C617900695F636861\n"
 | 
						|
	                    "6E6E656C5F6372656174655F6D6F6469\n"
 | 
						|
	                    "66795F74656D705F64656C6574655F64\n"
 | 
						|
	                    "656C617900695F6E65656465645F6D6F\n"
 | 
						|
	                    "646966795F706F7765725F6368616E6E\n"
 | 
						|
	                    "656C5F6372656174655F6D6F64696679\n"
 | 
						|
	                    "5F74656D705F64656C6574655F64656C\n"
 | 
						|
	                    "61790075706461746564207065726D69\n"
 | 
						|
	                    "7373696F6E7320746F2076657273696F\n"
 | 
						|
	                    "6E203138007570646174656420706572\n"
 | 
						|
	                    "6D697373696F6E7320746F2076657273\n"
 | 
						|
	                    "696F6E20313900757064617465506572\n"
 | 
						|
	                    "6D697373696F6E73282920756E61626C\n"
 | 
						|
	                    "6520746F20696E736572742064617461\n"
 | 
						|
	                    "626173652076657273696F6E00736572\n"
 | 
						|
	                    "7665725F696E736572742E73716C0073\n"
 | 
						|
	                    "65727665725F64656C6574652E73716C\n"
 | 
						|
	                    "0062696E64696E67735F6C6973742E73\n"
 | 
						|
	                    "716C007365727665725F757064617465\n"
 | 
						|
	                    "5F747261666669635F73746174732E73\n"
 | 
						|
	                    "716C007365727665725F757064617465\n"
 | 
						|
	                    "5F706F72742E73716C00736572766572\n"
 | 
						|
	                    "5F7570646174655F6175746F73746172\n"
 | 
						|
	                    "742E73716C007365727665725F676574\n"
 | 
						|
	                    "5F6279706F72742E73716C0073657276\n"
 | 
						|
	                    "65725F7570646174655F6D616368696E\n"
 | 
						|
	                    "655F69642E73716C007265766F636174\n"
 | 
						|
	                    "696F6E735F696E736572745F62756C6B\n"
 | 
						|
	                    "2E73716C007265766F636174696F6E5F\n"
 | 
						|
	                    "74797065007265766F636174696F6E5F\n"
 | 
						|
	                    "65787069726174696F6E007265766F63\n"
 | 
						|
	                    "6174696F6E5F6B6579007265766F6361\n"
 | 
						|
	                    "74696F6E735F6765746C6973742E7371\n"
 | 
						|
	                    "6C00496E76616C6964207265766F6361\n"
 | 
						|
	                    "74696F6E206B657920007265766F6361\n"
 | 
						|
	                    "74696F6E735F64656C6574652E73716C\n"
 | 
						|
	                    "003B20726561736F6E3A200046696C65\n"
 | 
						|
	                    "4D616E6167657200436F756C64206E6F\n"
 | 
						|
	                    "742062696E642066696C657472616E73\n"
 | 
						|
	                    "666572206C697374656E20706F727420\n"
 | 
						|
	                    "6F6E2064656661756C74206164647265\n"
 | 
						|
	                    "737365730066696C657472616E736665\n"
 | 
						|
	                    "722062696E64206661696C6564206F6E\n"
 | 
						|
	                    "20004572726F72207768696C65206765\n"
 | 
						|
	                    "7474696E67206C697374656E696E6720\n"
 | 
						|
	                    "6164647265737365732E200041737365\n"
 | 
						|
	                    "7274696F6E20226D5F62616E64776964\n"
 | 
						|
	                    "74685F6C696D69745F73657276657273\n"
 | 
						|
	                    "2E66696E64287365727665725F696429\n"
 | 
						|
	                    "203D3D206D5F62616E6477696474685F\n"
 | 
						|
	                    "6C696D69745F736572766572732E656E\n"
 | 
						|
	                    "64282922206661696C6564206174202E\n"
 | 
						|
	                    "2E2F2E2E2F2E2E2F2E2E2F732F646570\n"
 | 
						|
	                    "732F7465616D737065616B5F73657276\n"
 | 
						|
	                    "65725F6C69622F7372632F74735F7365\n"
 | 
						|
	                    "727665722F66696C657472616E736665\n"
 | 
						|
	                    "722F73657276657266696C656D616E61\n"
 | 
						|
	                    "6765722E6370703A0041737365727469\n"
 | 
						|
	                    "6F6E2022697420213D206D5F62616E64\n"
 | 
						|
	                    "77696474685F6C696D69745F73657276\n"
 | 
						|
	                    "6572732E656E64282922206661696C65\n"
 | 
						|
	                    "64206174202E2E2F2E2E2F2E2E2F2E2E\n"
 | 
						|
	                    "2F732F646570732F7465616D73706561\n"
 | 
						|
	                    "6B5F7365727665725F6C69622F737263\n"
 | 
						|
	                    "2F74735F7365727665722F66696C6574\n"
 | 
						|
	                    "72616E736665722F7365727665726669\n"
 | 
						|
	                    "6C656D616E616765722E6370703A0045\n"
 | 
						|
	                    "72726F7220616363657074696E672066\n"
 | 
						|
	                    "696C657472616E736665722000417373\n"
 | 
						|
	                    "657274696F6E202262775F7365727665\n"
 | 
						|
	                    "7220213D206D5F62616E647769647468\n"
 | 
						|
	                    "5F6C696D69745F736572766572732E65\n"
 | 
						|
	                    "6E64282922206661696C656420617420\n"
 | 
						|
	                    "2E2E2F2E2E2F2E2E2F2E2E2F732F6465\n"
 | 
						|
	                    "70732F7465616D737065616B5F736572\n"
 | 
						|
	                    "7665725F6C69622F7372632F74735F73\n"
 | 
						|
	                    "65727665722F66696C657472616E7366\n"
 | 
						|
	                    "65722F73657276657266696C656D616E\n"
 | 
						|
	                    "616765722E6370703A00417373657274\n"
 | 
						|
	                    "696F6E202262775F636C69656E742021\n"
 | 
						|
	                    "3D2062775F7365727665722D3E736563\n"
 | 
						|
	                    "6F6E642E6D5F636C69656E745F62616E\n"
 | 
						|
	                    "647769647468732E656E642829222066\n"
 | 
						|
	                    "61696C6564206174202E2E2F2E2E2F2E\n"
 | 
						|
	                    "2E2F2E2E2F732F646570732F7465616D\n"
 | 
						|
	                    "737065616B5F7365727665725F6C6962\n"
 | 
						|
	                    "2F7372632F74735F7365727665722F66\n"
 | 
						|
	                    "696C657472616E736665722F73657276\n"
 | 
						|
	                    "657266696C656D616E616765722E6370\n"
 | 
						|
	                    "703A0046696C654D616E616765722054\n"
 | 
						|
	                    "696D657220657870697265735F66726F\n"
 | 
						|
	                    "6D5F6E6F772072657475726E65642065\n"
 | 
						|
	                    "72726F723A2000747269656420746F20\n"
 | 
						|
	                    "72656D6F766520697020746861742077\n"
 | 
						|
	                    "6173206E6F7420696E206C6973742120\n"
 | 
						|
	                    "00636C6F7365006C6F63616C5F656E64\n"
 | 
						|
	                    "706F696E740000000000000000000000\n"
 | 
						|
	                    "1E000000000000001E00000000000000\n"
 | 
						|
	                    "0A00000000000000C800000000000000\n"
 | 
						|
	                    "F4010000000000000000000000000000\n"
 | 
						|
	                    "25000000000000000000000000000000\n"
 | 
						|
	                    "00000000000000000000000000000000\n"
 | 
						|
	                    "0000000000000080FFFFFFFFFFFFFF7F\n"
 | 
						|
	                    "0100000000000080FDFFFFFFFFFFFF7F");
 | 
						|
	cout << "Bin length: " << bin.length() << endl;
 | 
						|
	//0x33E 0x43C
 | 
						|
	//cout << "Str: " << read_crypted_string(bin.data() + 0x3BA, 0x3BA) << endl;
 | 
						|
	//cout << "Str: " << read_crypted_string(bin.data() + 0x3DF, 0x3DF) << endl;
 | 
						|
	//cout << "Str: " << read_crypted_string(bin.data() + 0x405, 0x405) << endl; => virtual server id
 | 
						|
	//cout << "Str: " << read_crypted_string(bin.data() + 0x43C, 0x43C) << endl; => is duplicated in same instance, shutting down!
 | 
						|
 | 
						|
	for(int index = 0x3E; index < bin.length() + 1; ) {
 | 
						|
		string str;
 | 
						|
		read_crypted_string(str, bin.data() + index, index);
 | 
						|
		cout << "Hex: 0x" << hex << setfill('0') << setw(3) << index << " => " << str << endl;
 | 
						|
		index += str.length() + 1;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char** argv){
 | 
						|
	threads::timer t("");
 | 
						|
 | 
						|
	srand(system_clock::now().time_since_epoch().count());
 | 
						|
    init_LTM();
 | 
						|
    if(register_prng(&sprng_desc) == -1) {
 | 
						|
        cerr << "could not setup prng" << endl;
 | 
						|
        return EXIT_FAILURE;
 | 
						|
    }
 | 
						|
    if (register_cipher(&rijndael_desc) == -1) {
 | 
						|
        cerr << "could not setup rijndael" << endl;
 | 
						|
        return EXIT_FAILURE;
 | 
						|
    }
 | 
						|
	string error;
 | 
						|
 | 
						|
 | 
						|
	if(false) {
 | 
						|
		auto base64_tvd = base64::decode("AQCvbHFTQDY/terPeilrp/ECU9xCH5U3xC92lYTNaY/0KQAJFueAazbsgAAAACVUZWFtU3BlYWsgU3lzdGVtcyBHbWJIAADmqdzhKVTai5ZX3LMCOmhH4wOWa7Jrb27PTN6XJSvOaAAKcspvMINAZwAAACRUZWFtU3BlYWsgc3lzdGVtcyBHbWJIAADRNBxg9GPfGFpwf0akzRQs4B/VhIvD+cKAC7vzRAys/AIKfC4AC27CAAYAAAAAW09EQU5JIEHDhyBUQUtJTF0gVHMzLkFtYWNpT2xtYXlhblRheWZhLkNPTSB8IFdFQkRpeW8uQ09NAA==");
 | 
						|
		istringstream s(base64_tvd);
 | 
						|
		auto result = LicenseChain::parse(s, error);
 | 
						|
		if(!result) {
 | 
						|
			cerr << error << endl;
 | 
						|
			return 0;
 | 
						|
		}
 | 
						|
 | 
						|
		result->print();
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	cout << base64::encode(license::teamspeak::Anonymous::chain->exportChain()) << endl;
 | 
						|
	cout << base64::encode(reinterpret_cast<const char *>(license::teamspeak::Anonymous::root_key), 32) << endl;
 | 
						|
 | 
						|
	if(false) {
 | 
						|
		auto key_plk = license::teamspeak::Anonymous::chain->generatePublicKey();
 | 
						|
		auto key_prv = license::teamspeak::Anonymous::chain->generatePrivateKey((u_char*) license::teamspeak::Anonymous::root_key, license::teamspeak::Anonymous::root_index);
 | 
						|
 | 
						|
		u_char sign[64];
 | 
						|
		string message = "Hello World";
 | 
						|
		ed25519_sign(sign, (u_char*) message.data(), message.length(), (u_char*) key_plk.data(), (u_char*) key_prv.data());
 | 
						|
		assert(ed25519_verify(sign, (const u_char*) message.data(), message.length(), (u_char*) key_plk.data()));
 | 
						|
	}
 | 
						|
#if false
 | 
						|
	auto base64_license = "Co4CCsQBAQCvbHFTQDY/terPeilrp/ECU9xCH5U3xC92lYTNaY/0KQAJFueAazbsgAAAACVUZWFtU3BlYWsgU3lzdGVtcyBHbWJIAABVa/g1Aa+EhqDv4a+FKZ+nhnzgNNoG5LZZDMbWP1rUJwAJjrHNL59A2wAAACRUZWFtU3BlYWsgc3lzdGVtcyBHbWJIAAAY8GKBKoLJ2NJT15WG1E3GQ0vl0Ju29Oq3KqYAeEH9GQIJmBqACpU6gAQAAAIAVG9tIFdlYmVyABIgwLAWtDC3hSt8KzSBEksYyaYXxrIybtV207ImV+ugSWkYgAQgCioeVGVhbVNwZWFrIDMgTm9uLVByb2ZpdCBMaWNlbnNlErUBAQCvbHFTQDY/terPeilrp/ECU9xCH5U3xC92lYTNaY/0KQAJFueAazbsgAAAACVUZWFtU3BlYWsgU3lzdGVtcyBHbWJIAABVa/g1Aa+EhqDv4a+FKZ+nhnzgNNoG5LZZDMbWP1rUJwAJjrHNL59A2wAAACRUZWFtU3BlYWsgc3lzdGVtcyBHbWJIAACWjeLEq44YFFAhN9aie2W8g7q3LO2UN/FiHtoGxOoiKAUJjrHNL59A2xpARpdAlulkIKm793JIeJcyxYvvc/tdj4Bx45qcLMISR8qdAOjtgTAV2fWbkdjx0roelL6EAubc3HPij+5Xny1UDw==";
 | 
						|
	ts::proto::license::teamspeak::License license;
 | 
						|
	license.ParseFromString(base64::decode(base64_license));
 | 
						|
 | 
						|
	auto chain_sign = LicenseChain::parse(license.sign_chain(), error);
 | 
						|
	auto chain_license = LicenseChain::parse(license.license().chain(), error);
 | 
						|
 | 
						|
	{
 | 
						|
		auto key = chain_sign->generatePublicKey();
 | 
						|
		auto signature = license.license_sign();
 | 
						|
		auto message = license.license().SerializeAsString();
 | 
						|
 | 
						|
		assert(ed25519_verify((const u_char*) signature.data(), (const u_char*) message.data(), message.length(), (u_char*) key.data()));
 | 
						|
	}
 | 
						|
	{
 | 
						|
		auto key_plk = chain_license->generatePublicKey();
 | 
						|
		auto key_prv = chain_license->generatePrivateKey((u_char*) license.license().root().data(), 3);
 | 
						|
 | 
						|
		u_char sign[64];
 | 
						|
		string message = "Hello World";
 | 
						|
		ed25519_sign(sign, (u_char*) message.data(), message.length(), (u_char*) key_plk.data(), (u_char*) key_prv.data());
 | 
						|
		assert(ed25519_verify(sign, (const u_char*) message.data(), message.length(), (u_char*) key_plk.data()));
 | 
						|
	}
 | 
						|
	chain_sign->print();
 | 
						|
	chain_license->print();
 | 
						|
 | 
						|
	cout << "version:0" << endl;
 | 
						|
	cout << "chain:" << base64::encode(chain_license->exportChain()) << endl;
 | 
						|
	cout << "root_key_prv:" << base64::encode(license.license().root()) << endl;
 | 
						|
	cout << "root_key_pbl:" << base64::encode((const char*) public_root, 32) << endl;
 | 
						|
	cout << "root_prv_index:" << to_string(3) << endl;
 | 
						|
#endif
 | 
						|
    //return 0;
 | 
						|
 | 
						|
    /**
 | 
						|
     * DONT DELET!
 | 
						|
     */
 | 
						|
    //Last checked offset was 1591824411998
 | 
						|
    //Level 39
 | 
						|
    //ts::Identity* id = new ts::Identity("4161411998Vginro7hE2a4haFhxRR5+Q1aknrR8Nn1iYAAUZldWVn8XZFVVUnUOVBFeMQJ9HHZaOVh3fEhLShwdXHkie2lza1gDWQltMwhROBNeVTQ2GS5EeFNbA2dBE3QvXU9jJ0VKMXd4YkpxU0tFQUlnYVZaeVVTTTYzSldSLzBRT3Nqd3hSelJBYmRpZ2xsaFhsVTF5L3hVYWgxWT0=");
 | 
						|
 | 
						|
    //Last checked offset was 1330241596003
 | 
						|
    //Level 48 535525596003
 | 
						|
    //ts::Identity* id = new ts::Identity("535525596003VMXsJbBqTW70w6dnQUt/X/CiIeth9DEVcVEVUUxBjXUY9RGxSeVN+OhYDHjJSFRoCJHIDd3FjXCgSdH0Gf3RhBlJ0SGYbIEBCVzNcAAITKD9yY30aAgBqOnQIQmVdVQB5L3NVWnZkQUNJUUR2dG5ScnNYdHVWZkFhem9OYVNxTGhjZ2ZwVXhVelFpcGMrSDFSbkIrL3dRPT0=");
 | 
						|
 | 
						|
    /*
 | 
						|
    for(int i = 0; ltc_ecc_sets[i].size != 0; i++){
 | 
						|
        cout << " -> " << ltc_ecc_sets[i].name << endl;
 | 
						|
    }
 | 
						|
    int targetLevel = 20;
 | 
						|
    if(argc > 1){
 | 
						|
        targetLevel = atoi(argv[1]);
 | 
						|
    }
 | 
						|
 | 
						|
    cout << "Try to find security level " << targetLevel << endl;
 | 
						|
    ts::Identity* id = new ts::Identity("30895417VvPSPlSzA2mTBpjn7RrJYEq/PmZcNAmhDCXkVdStbXUU2bVxBQ0IHNVAGNTR/CXplN2Z/AwRASSFTQn0GV3NTGX18dXENB2laLQJHKVFUKgl/VHRgD21LUlAHVk18FQcEMGpAXTBxUUNJSEtnTCtOcXJhZDRUSTlKNk04clZXMHkxQjcwWnNsanNsbldOOWo5cjBObA==");
 | 
						|
    id->improveSecurityLevelMultithreaded(targetLevel, 16, 1000000, 10 * 1000 * 1000U, true);
 | 
						|
    cout << "New string: " << id->exportIdentity() << endl;
 | 
						|
 | 
						|
    if(true) return false;
 | 
						|
    */
 | 
						|
 | 
						|
	/*
 | 
						|
	string error;
 | 
						|
	//auto stream = stringstream(base64::decode("AQCvbHFTQDY/terPeilrp/ECU9xCH5U3xC92lYTNaY/0KQAJFueAazbsgAAAACVUZWFtU3BlYWsgU3lzdGVtcyBHbWJIAABhl9gwla/UJp2Eszst9TRVXO/PeE6a6d+CTI6Pg7OEVgAJc5CrL4Nh8gAAACRUZWFtU3BlYWsgc3lzdGVtcyBHbWJIAACvTQIgpv6zmLZq3znh7ygmOSokGFkFjz4bTigrOnetrgIJdIIACdS/gAYAAAAAU29zc2VuU3lzdGVtcy5iaWQAADY7+uV1CQ1niOvYSdGzsu83kPTNWijovr3B78eHGeePIAm98vQJvpu0"));
 | 
						|
	auto stream = stringstream(base64::decode("AQA1hUFJiiSs0wFXkYuPUJVcDa6XCrZTcsvkB0Ffzz4CmwIITRXgCqeTYAcAAAAgQW5vbnltb3VzAAC4R+5mos+UQ/KCbkpQLMI5WRp4wkQu8e5PZY4zU+/FlyAJwaE8CcJJ/A=="));
 | 
						|
	auto chain = LicenseChain::parse(stream, error);
 | 
						|
	if(!chain) {
 | 
						|
		cerr << "Could not parse: " << error << endl;
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
	chain->print();
 | 
						|
	cout << chain->exportChain() << endl;
 | 
						|
 | 
						|
	auto key = chain->generateKey();
 | 
						|
	cout << " -> " << base64::encode(key) << endl;
 | 
						|
	cout << hex;
 | 
						|
	for(const auto& c : key)
 | 
						|
		cout << " " << (uint32_t) (uint8_t) c << endl;
 | 
						|
	if(true) return 0;
 | 
						|
	 */
 | 
						|
 | 
						|
    ts::Identity* identity;
 | 
						|
	//identity = new ts::Identity("30895417VvPSPlSzA2mTBpjn7RrJYEq/PmZcNAmhDCXkVdStbXUU2bVxBQ0IHNVAGNTR/CXplN2Z/AwRASSFTQn0GV3NTGX18dXENB2laLQJHKVFUKgl/VHRgD21LUlAHVk18FQcEMGpAXTBxUUNJSEtnTCtOcXJhZDRUSTlKNk04clZXMHkxQjcwWnNsanNsbldOOWo5cjBObA==");
 | 
						|
    identity = new ts::Identity("4161411998Vginro7hE2a4haFhxRR5+Q1aknrR8Nn1iYAAUZldWVn8XZFVVUnUOVBFeMQJ9HHZaOVh3fEhLShwdXHkie2lza1gDWQltMwhROBNeVTQ2GS5EeFNbA2dBE3QvXU9jJ0VKMXd4YkpxU0tFQUlnYVZaeVVTTTYzSldSLzBRT3Nqd3hSelJBYmRpZ2xsaFhsVTF5L3hVYWgxWT0=");
 | 
						|
	cout << "Private key: " << identity->privateKey() << endl;
 | 
						|
    cout << "Public key: " << identity->publicKey() << endl;
 | 
						|
 | 
						|
    {
 | 
						|
	    auto hash = digest::sha256("Hello World");
 | 
						|
        auto sign_rfc = base64::decode("kjEYFcZ4iDxosbhi7bV04nRu0c0JzEIKAACSpLo9G1cJX60Ta46QpoPXTpMg9E8z5pHeZXPVUx75zmWE/LQTuQ==");
 | 
						|
        int state;
 | 
						|
        auto result = ecc_verify_hash_rfc7518((u_char*) sign_rfc.data(), sign_rfc.length(), (u_char*) hash.data(), hash.length(), &state, identity->getKeyPair());
 | 
						|
        __asm__("nop");
 | 
						|
    }
 | 
						|
 | 
						|
	//identity = ts::Identity::createNew();
 | 
						|
	//identity->improveSecurityLevel(9);
 | 
						|
	/*
 | 
						|
	identity = ts::Identity::createNew();
 | 
						|
	cout << "Improve" << endl;
 | 
						|
	identity->improveSecurityLevelMultithreaded(24, 12);
 | 
						|
	cout << "Got level: " << identity->getSecurityLevel() << " at " << identity->lastValidKeyOffset() << " - " << identity->privateKey() << " - " << identity->publicKey() << endl;
 | 
						|
	return 0;
 | 
						|
	*/
 | 
						|
 | 
						|
    auto lastConnect = time_point<system_clock>();
 | 
						|
    for(int i = 0; i < 1; i++){
 | 
						|
	    //identity = ts::Identity::createNew();
 | 
						|
	    //identity->improveSecurityLevel(9);
 | 
						|
 | 
						|
        //identity = new ts::Identity("4161411998Vginro7hE2a4haFhxRR5+Q1aknrR8Nn1iYAAUZldWVn8XZFVVUnUOVBFeMQJ9HHZaOVh3fEhLShwdXHkie2lza1gDWQltMwhROBNeVTQ2GS5EeFNbA2dBE3QvXU9jJ0VKMXd4YkpxU0tFQUlnYVZaeVVTTTYzSldSLzBRT3Nqd3hSelJBYmRpZ2xsaFhsVTF5L3hVYWgxWT0=");
 | 
						|
        //identity = new ts::Identity("8008VgvLYFzLLe4lE6oTKyMBPViPHzJVdCGVqAGc7VQQJXkcIRUZcCkFzMDJmHCYBMF1kWmdzRwlQBy4PT3Eie2lzVmUCd39bD3RnNC9gAyRQFh14Z0YGEHJHDg4nGkceNgdWBH9RAE1ZTjlqUUlnV1hUck5vZVdUQ21sNkVYeDNMUm80M0pMU0ZDdkRzWUorR0VkeDE3ZDJLST0=");
 | 
						|
        //identity = identity->createNew();
 | 
						|
        //cout << "Improve" << endl;
 | 
						|
        //identity->improveSecurityLevelMultithreaded(10, 12);
 | 
						|
        //cout << "Using identity: " << identity->exportIdentity() << endl;
 | 
						|
        auto connection = new ts::connection::ServerConnection();
 | 
						|
 | 
						|
        while(system_clock::now() - lastConnect < milliseconds(250)) usleep(1000);
 | 
						|
        lastConnect = system_clock::now();
 | 
						|
 | 
						|
	    string host =
 | 
						|
			    "127.0.0.1"
 | 
						|
			    //"51.255.133.2"
 | 
						|
			    //"79.133.54.198"
 | 
						|
			    //"51.255.133.6"
 | 
						|
			    //"79.133.54.207" //GommeHD.net
 | 
						|
			    //"79.133.54.202" //Rewi
 | 
						|
			    //"79.133.54.210" //minesucht.net:9988
 | 
						|
			    //"91.134.112.225" //The Beast (NOT 3.1!)
 | 
						|
			    //"79.133.54.198" //Grifer games:9180
 | 
						|
			    //"52.63.60.28"
 | 
						|
			    //"87.106.252.164"
 | 
						|
			    //"5.1.80.215" //Twerion
 | 
						|
			    //"212.114.60.36" //Domies ts
 | 
						|
			    //"54.36.90.72"
 | 
						|
			    //"87.106.252.164"
 | 
						|
			    //"84.200.62.248"
 | 
						|
			    //"79.133.54.198" //Durchrasten.de:9122
 | 
						|
	            ""
 | 
						|
	    ;
 | 
						|
	    string port = "9987";
 | 
						|
	    if(argc > 2) {
 | 
						|
		    host = argv[1];
 | 
						|
		    port = argv[2];
 | 
						|
	    }
 | 
						|
 | 
						|
		threads::Thread([connection, host, port, identity]() {
 | 
						|
			string error;
 | 
						|
			cout << host << ":" << port << endl;
 | 
						|
			if(!connection->connect(host, port, identity)){
 | 
						|
				cerr << "Cant connect!" << endl;
 | 
						|
				goto sleep;
 | 
						|
			}
 | 
						|
 | 
						|
			if(!connection->handshake(error)){
 | 
						|
				cerr << "Cant handschake: " << error << endl;
 | 
						|
				goto sleep;
 | 
						|
			}
 | 
						|
 | 
						|
			threads::self::sleep_for(seconds(10 + rand() % 10));
 | 
						|
			sleep:;
 | 
						|
			//connection->disconnect();
 | 
						|
			//delete connection;
 | 
						|
		}).detach();
 | 
						|
	    //connection->disconnect();
 | 
						|
	    usleep(1000 * 1000);
 | 
						|
    }
 | 
						|
    cout << "Done!" << endl;
 | 
						|
 | 
						|
    while(true) usleep(1000 * 2000);
 | 
						|
} |