Skip to content

Instantly share code, notes, and snippets.

@Autoplay1999
Created May 13, 2024 22:58
Show Gist options
  • Save Autoplay1999/f45acbbcfa2d8b96b033b40a69f1e5fe to your computer and use it in GitHub Desktop.
Save Autoplay1999/f45acbbcfa2d8b96b033b40a69f1e5fe to your computer and use it in GitHub Desktop.
#pragma once
#ifndef XS_H
#define XS_H
#include <stdint.h>
#include <intrin.h>
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifndef g_alloc
static void* __g_alloc(size_t s, int z) {
uint8_t* p = new uint8_t[s];
if (!p)
return 0;
if (z) {
size_t np = s / sizeof(size_t);
size_t n = s % sizeof(size_t);
#if _WIN64
if (np)
__stosq((unsigned long long*)p, 0, np);
#elif _WIN32
if (np)
__stosd((unsigned long*)p, 0, np);
#endif
if (n)
__stosb(p + np * sizeof(size_t), 0, n);
}
return p;
}
# define g_alloc __g_alloc
#endif
static void* xs(uint8_t* out, uint64_t key, uint32_t size, const void* buf) {
const uint8_t* data = (const uint8_t*)buf;
int32_t count = size / sizeof(size_t); // Number of full size_t elements
int32_t remainder = size % sizeof(size_t); // Remaining bytes after full size_t elements
int32_t offset = 0;
#if _WIN64
// On 64-bit Windows, process each 64-bit chunk
for (int32_t i = 0; i < count; i++, offset += sizeof(size_t)) {
*(uint64_t*)(out + offset) = *(const uint64_t*)(data + offset) ^ key;
}
#else
// On 32-bit platforms, process each 32-bit chunk
for (int32_t i = 0; i < count; i++, offset += sizeof(size_t)) {
*(uint32_t*)(out + offset) = *(const uint32_t*)(data + offset) ^ ((uint32_t*)&key)[i % 2];
}
#endif
// Process any remaining bytes individually
for (int32_t i = 0; i < remainder; i++, offset++) {
*(uint8_t*)(out + offset) = data[offset] ^ ((uint8_t*)&key)[offset % sizeof(uint64_t)];
}
return out;
}
static const char* xsa(uint64_t key, uint32_t size, const void* buf) {
// Allocate memory for the output buffer plus one for null-termination
char* out = (char*)g_alloc(size + sizeof(char), 0);
if (!out)
return NULL; // Use NULL for better clarity in C
// Perform XOR operation
xs((uint8_t*)out, key, size, buf);
// Null-terminate the string
out[size] = '\0';
return out;
}
static const wchar_t* xsw(uint64_t key, uint32_t size, const void* buf) {
// Allocate memory for the output buffer plus one for null-termination
wchar_t* out = (wchar_t*)g_alloc((size + 1) * sizeof(wchar_t), 0);
if (!out)
return NULL; // Use NULL for better clarity in C
// Perform XOR operation, ensuring to process by bytes, not by wchar_t units
xs((uint8_t*)out, key, size, buf);
// Null-terminate the wide string
out[size / sizeof(wchar_t)] = L'\0';
return out;
}
#ifdef __cplusplus
}
#endif
#endif
// xs.html
// PCFET0NUWVBFIGh0bWw+DQo8aHRtbD4NCgk8aGVhZD4NCgkJPG1ldGEgY2hhcnNldD0iVVRGLTgiPg0KCQk8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+DQoJCTxzdHlsZT4NCgkJCS5jb250YWluZXIgew0KCQkJCWRpc3BsYXk6IGZsZXg7IC8qIEVuYWJsZSBmbGV4Ym94IGxheW91dCBmb3IgdGhlIGNvbnRhaW5lciAqLw0KCQkJCXdpZHRoOiAxMDAlOyAvKiBNYWtlIHRoZSBjb250YWluZXIgc3BhbiB0aGUgZnVsbCB3aWR0aCAqLw0KCQkJfQ0KDQoJCQkudGV4dGFyZWEgew0KCQkJCWZsZXg6IDE7IC8qIEFsbG9jYXRlIGVxdWFsIHNwYWNlIHRvIGVhY2ggdGV4dGFyZWEgKi8NCgkJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOyAvKiBBZGQgYSBzaW1wbGUgYm9yZGVyICovDQoJCQkJcGFkZGluZzogMTBweDsgLyogQWRkIHNvbWUgcGFkZGluZyBmb3IgcmVhZGFiaWxpdHkgKi8NCgkJCQlib3gtc2l6aW5nOiBib3JkZXItYm94OyAvKiBJbmNsdWRlIHBhZGRpbmcgaW4gZWxlbWVudCB3aWR0aC9oZWlnaHQgY2FsY3VsYXRpb25zICovDQoJCQl9DQoJCTwvc3R5bGU+DQoJPC9oZWFkPg0KCTxib2R5Pg0KCQl7MH06IHhzKGtleSwgc2l6ZSwgZGF0YSk8YnI+DQoJCXsxfTogdGV4dDxicj4NCgkJezJ9OiBrZXk8YnI+DQoJCXszfTogc2l6ZTxicj4NCgkJezR9OiBkYXRhPGJyPjxicj4NCgkJY3VzdG9tIG91dHB1dDxicj48aW5wdXQgdHlwZT0idGV4dCIgaWQ9InRleF9jdXN0b21vdXRwdXQiIHZhbHVlPSJ7MH0iPjxicj48YnI+DQoJCWtleSAoZW1wdHkgPSByYW5kb20pPGJyPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0idGV4X2tleSIgdmFsdWU9IiIgbWF4bGVuZ3RoPSIxNiI+IA0KCQk8YnV0dG9uIG9uY2xpY2s9ImdldGtleShmYWxzZSkiPlJhbmRvbTwvYnV0dG9uPiANCgkJPGJ1dHRvbiBvbmNsaWNrPSJnZXRrZXkodHJ1ZSkiPlJhbmRvbSAoTk9OWkVSTyk8L2J1dHRvbj48YnI+PGJyPg0KCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJjaGtfbXVsdGlsaW5lIj5tdWx0aS1saW5lPC9pbnB1dD4NCgkJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iY2hrX2VzY2FwZXNlcXVlbmNlcyI+ZXNjYXBlIHNlcXVlbmNlczwvaW5wdXQ+DQoJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImNoa191dGY4Ij51dGYtODwvaW5wdXQ+PGJyPjxicj4NCgkJPGJ1dHRvbiBvbmNsaWNrPSJjdnQoZmFsc2UpIj5jaGFyPC9idXR0b24+DQoJCTxidXR0b24gb25jbGljaz0iY3Z0KHRydWUpIj53Y2hhcl90PC9idXR0b24+PGJyPjxicj4NCgkJPGRpdiBjbGFzcz0iY29udGFpbmVyIj4NCgkJCTx0ZXh0YXJlYSBpZD0iaW50ZXh0IiBjbGFzcz0idGV4dGFyZWEiIHJvd3M9IjMyIj48L3RleHRhcmVhPg0KCQkJPHRleHRhcmVhIGlkPSJvdXRleHQiIGNsYXNzPSJ0ZXh0YXJlYSIgcm93cz0iMzIiPjwvdGV4dGFyZWE+DQoJCTwvZGl2Pg0KCQk8c2NyaXB0IHNyYz0idXRmOC5qcyIgZGVmZXI+PC9zY3JpcHQ+DQoJCTxzY3JpcHQ+DQoJCQlmdW5jdGlvbiByYW5kb21IZXgoc2l6ZSkgew0KCQkJCWNvbnN0IGdlblJhbkhleCA9IHNpemUgPT4gWy4uLkFycmF5KHNpemUpXS5tYXAoKCkgPT4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTYpLnRvU3RyaW5nKDE2KSkuam9pbignJyk7DQoJCQkJcmV0dXJuIHBhcnNlSW50KCIweCIgKyBnZW5SYW5IZXgoc2l6ZSksIDE2KTsNCgkJCX0NCg0KCQkJZnVuY3Rpb24gcmFuZG9tTnVtYmVyKG1heCA9IDB4ZmZmZmZmZmYsIG1pbiA9IDApIHsJCQkJCQ0KCQkJCXJldHVybiAocmFuZG9tSGV4KDgpICUgKG1heCAtIG1pbiArIDEpKSArIG1pbg0KCQkJfQ0KDQoJCQlmdW5jdGlvbiByYW5kb21TdHJpbmcobGVuZ3RoID0gOCwgdXBwZXIgPSB0cnVlLCBsb3dlciA9IHRydWUsIG51bWJlciA9IHRydWUpIHsNCgkJCQlpZiAobGVuZ3RoIDw9IDAgfHwgKCF1cHBlciAmJiAhbG93ZXIgJiYgIW51bWJlcikpDQoJCQkJCXJldHVybiAiIjsNCg0KCQkJCWxldCByZXN1bHQgPSAnJzsNCgkJCQlsZXQgY2hhcmFjdGVyc1UgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonOw0KCQkJCWxldCBjaGFyYWN0ZXJzTCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eic7DQoJCQkJbGV0IG51bXJpYyA9ICcwMTIzNDU2Nzg5JzsNCg0KCQkJCWZvciAoIGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKSB7DQoJCQkJCWxldCB0ID0gcmFuZG9tTnVtYmVyKDIpOw0KCQkJCQkNCgkJCQkJaWYgKCB0ID09IDAgJiYgdXBwZXIgKSB7DQoJCQkJCQlyZXN1bHQgKz0gY2hhcmFjdGVyc1UuY2hhckF0KHJhbmRvbU51bWJlcihjaGFyYWN0ZXJzVS5sZW5ndGggLSAxKSk7DQoJCQkJCQlpKys7DQoJCQkJCX0NCgkJCQkJZWxzZSBpZiAoIHQgPT0gMSAmJiBudW1iZXIgKSB7DQoJCQkJCQlyZXN1bHQgKz0gbnVtcmljLmNoYXJBdChyYW5kb21OdW1iZXIobnVtcmljLmxlbmd0aCAtIDEpKTsNCgkJCQkJCWkrKzsNCgkJCQkJfQ0KCQkJCQllbHNlIGlmICggdCA9PSAyICYmIGxvd2VyICkgew0KCQkJCQkJcmVzdWx0ICs9IGNoYXJhY3RlcnNMLmNoYXJBdChyYW5kb21OdW1iZXIoY2hhcmFjdGVyc0wubGVuZ3RoIC0gMSkpOw0KCQkJCQkJaSsrOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJcmV0dXJuIHJlc3VsdDsNCgkJCX0NCg0KCQkJZnVuY3Rpb24gZGVjaW1hbFRvSGV4U3RyaW5nKG51bWJlcikgew0KCQkJCWlmIChudW1iZXIgPCAwKQ0KCQkJCQludW1iZXIgPSAweGZmZmZmZmZmICsgbnVtYmVyICsgMTsNCg0KCQkJCXJldHVybiBudW1iZXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkucGFkU3RhcnQoOCwgJzAnKTsNCgkJCX0NCg0KCQkJZnVuY3Rpb24gcmV2ZXJzZVN0cmluZyhzdHIpIHsNCgkJCQlyZXR1cm4gc3RyLnNwbGl0KCIiKS5yZXZlcnNlKCkuam9pbigiIik7DQoJCQl9DQoNCgkJCWZ1bmN0aW9uIGdlblhvcktleShub256ZXJvID0gdHJ1ZSkgew0KCQkJCWxldCBrZXkxID0gMDsNCgkJCQlsZXQga2V5MiA9IDA7DQoJCQkJbGV0IGkgPSAwOw0KCQkJCWxldCBsID0gMDsNCg0KCQkJCXdoaWxlICh0cnVlKSB7DQoJCQkJCWxldCBuID0gcmFuZG9tTnVtYmVyKCk7DQoNCgkJCQkJZm9yIChsID0gMDsgaSA8IDg7ICkgew0KCQkJCQkJaWYgKGwgPT0gOCkNCgkJCQkJCQlicmVhazsNCg0KCQkJCQkJbGV0IG8gPSBmYWxzZTsNCgkJCQkJCWxldCBzID0gMDsNCg0KCQkJCQkJZm9yICg7IGwgPCA0OyBsKyspIHsNCgkJCQkJCQlsZXQgYiA9IChuID4+IChsICogOCkpICYgMHhmZjsNCgkJCQkJCQlsZXQgbGIgPSAoYiAmIDB4Zik7DQoJCQkJCQkJbGV0IGhiID0gKGIgPj4gNCkgJiAweGY7DQoNCgkJCQkJCQlpZiAobm9uemVybyAmJiAobGIgPT0gMCB8fCBoYiA9PSAwIC8qfHwgbGIgPT0gaGIqLykpDQoJCQkJCQkJCWNvbnRpbnVlOw0KDQoJCQkJCQkJcyA9IGI7DQoJCQkJCQkJbyA9IHRydWU7DQoJCQkJCQkJbCsrOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KDQoJCQkJCQlpZiAoIW8pDQoJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCWlmIChpIDwgNCkNCgkJCQkJCQlrZXkxID0ga2V5MSB8IChzIDw8IChpICogOCkpOw0KCQkJCQkJZWxzZQ0KCQkJCQkJCWtleTIgPSBrZXkyIHwgKHMgPDwgKChpICUgNCkgKiA4KSk7DQoNCgkJCQkJCWkrKzsNCgkJCQkJfQ0KDQoJCQkJCWlmIChpID09IDgpDQoJCQkJCQlicmVhazsNCgkJCQl9DQoNCgkJCQlyZXR1cm4gZGVjaW1hbFRvSGV4U3RyaW5nKGtleTIpICsgZGVjaW1hbFRvSGV4U3RyaW5nKGtleTEpOw0KCQkJfQ0KCQkJDQoJCQlmdW5jdGlvbiBzcGxpdFN0cmluZ1RvQnl0ZUFycmF5KHMpIHsNCgkJCQlsZXQgbyA9IFtdOw0KCQkJCWZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7ICsraSkgew0KCQkJCQlsZXQgdiA9IHMuY29kZVBvaW50QXQoaSk7DQoJCQkJCWxldCBjbCA9IDA7DQoJCQkJCWZvciAobGV0IGwgPSAzOyBsID49IDA7IC0tbCkgew0KCQkJCQkJaWYgKCEoKHYgPj4gKGwgKiA4KSkgJiAweGZmKSkgY29udGludWU7DQoJCQkJCQljbCA9IGw7DQoJCQkJCQlicmVhazsNCgkJCQkJfQ0KCQkJCQljbCsrOw0KCQkJCQlmb3IgKGxldCBsID0gMDsgbCA8IGNsOyArK2wpIHsNCgkJCQkJCW8ucHVzaCgodiA+PiAobCAqIDgpKSAmIDB4ZmYpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCXJldHVybiBvOw0KCQkJfQ0KCQkJDQoJCQlmdW5jdGlvbiBpc0RvdWJsZUJ5dGUoc3RyKSB7DQoJCQkJZm9yICh2YXIgaSA9IDAsIG4gPSBzdHIubGVuZ3RoOyBpIDwgbjsgaSsrKSB7DQoJCQkJCWlmIChzdHIuY29kZVBvaW50QXQoIGkgKSA+IDI1NSkgeyByZXR1cm4gdHJ1ZTsgfQ0KCQkJCX0NCgkJCQlyZXR1cm4gZmFsc2U7DQoJCQl9DQoJCQkJCQkNCgkJCWZ1bmN0aW9uIHN0cmluZ0J5dGVTaXplKHMpIHsNCgkJCQlsZXQgbCA9IDA7DQoJCQkJZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgKytpKSB7DQoJCQkJCWxldCB2ID0gcy5jb2RlUG9pbnRBdChpKTsNCgkJCQkJbGV0IGNsID0gMDsNCgkJCQkJZm9yIChsZXQgbCA9IDM7IGwgPj0gMDsgLS1sKSB7DQoJCQkJCQlpZiAoISgodiA+PiAobCAqIDgpKSAmIDB4ZmYpKSBjb250aW51ZTsNCgkJCQkJCWNsID0gbDsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJCWNsKys7DQoJCQkJCWwgKz0gY2w7DQoJCQkJfQ0KCQkJCXJldHVybiBsOw0KCQkJfQ0KCQkJDQoJCQlmdW5jdGlvbiBlbmNyeXB0KHN0ciwga2V5LCB1bmljb2RlKSB7DQoJCQkJbGV0IG8gPSAiIjsNCgkJCQlsZXQgayA9IGtleTsNCg0KCQkJCWlmICh1bmljb2RlKSB7DQoJCQkJCWZvciAobGV0IGkgPSAwLCBsID0gay5sZW5ndGggLSA0OyBpIDwgc3RyLmxlbmd0aDsgaSsrLCBsIC09IDQpIHsNCgkJCQkJCWlmIChsIDwgMCkNCgkJCQkJCQlsID0gay5sZW5ndGggLSA0Ow0KCQkJCQkNCgkJCQkJCWwgPSBsICUgay5sZW5ndGg7DQoNCgkJCQkJCWxldCByID0gc3RyLmNvZGVQb2ludEF0KGkpIF4gcGFyc2VJbnQoay5zbGljZShsLCBsICsgNCksIDE2KTsNCgkJCQkJCW8gPSBvICsgIlxceCIgKyAociAmIDB4ZmYpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpLnRvVXBwZXJDYXNlKCkgKyAiXFx4IiArICgociA+PiAweDgpICYgMHhmZikudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykudG9VcHBlckNhc2UoKTsNCgkJCQkJfQ0KCQkJCX0gZWxzZSB7DQoJCQkJCWFyciA9IHNwbGl0U3RyaW5nVG9CeXRlQXJyYXkoc3RyKTsNCgkJCQkJZm9yIChsZXQgaSA9IDAsIGwgPSBrLmxlbmd0aCAtIDI7IGkgPCBhcnIubGVuZ3RoOyBpKyssIGwgLT0gMikgewkJCQ0KCQkJCQkJbCA9IGwgJSBrLmxlbmd0aDsNCgkJCQkJCQ0KCQkJCQkJaWYgKGwgPCAwKQ0KCQkJCQkJCWwgPSBrLmxlbmd0aCAtIDI7DQoNCgkJCQkJCWxldCByID0gYXJyW2ldIF4gcGFyc2VJbnQoay5zbGljZShsLCBsICsgMiksIDE2KTsNCgkJCQkJCW8gPSBvICsgIlxceCIgKyByLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpLnRvVXBwZXJDYXNlKCk7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlyZXR1cm4gIlwiIiArIG8gKyAiXCIiOw0KCQkJfQ0KDQoJCQlmdW5jdGlvbiBnZW5DbGFzc1hvclN0aXJuZyhvcmlnc3RyLCBzdHIsIGtleSwgdW5pY29kZSkgew0KCQkJCWxldCBlbmNEYXRhID0gZW5jcnlwdChzdHIsIGtleSwgdW5pY29kZSk7DQoJCQkJcmV0dXJuIFsNCgkJCQkJKHVuaWNvZGUgPyAieHN3IiA6ICJ4c2EiKSArICIoMHgiICsga2V5ICsgIiwgIiArICh1bmljb2RlID8gc3RyLmxlbmd0aCAqIDIgOiBzdHJpbmdCeXRlU2l6ZShzdHIpKSArICIsICIgKyBlbmNEYXRhICsgIikiLA0KCQkJCQlvcmlnc3RyLA0KCQkJCQkiMHgiICsga2V5LA0KCQkJCQlzdHJpbmdCeXRlU2l6ZShzdHIpLA0KCQkJCQllbmNEYXRhDQoJCQkJXTsNCgkJCX0NCgkJCQ0KCQkJZnVuY3Rpb24gZ2V0a2V5KG5vbnplcm8pIHsNCgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGV4X2tleSIpLnZhbHVlID0gZ2VuWG9yS2V5KG5vbnplcm8pOw0KCQkJfQ0KDQoJCQlmdW5jdGlvbiBjdnQoaXNVbmljb2RlKSB7DQoJCQkJY29uc3QgcmVwbGFjZUVzY2FwZSA9IChtYXRjaCwgY2hhcikgPT4gew0KCQkJCQlzd2l0Y2ggKGNoYXIpIHsNCgkJCQkJICBjYXNlICduJzoNCgkJCQkJCXJldHVybiAnXG4nOw0KCQkJCQkgIGNhc2UgJ3QnOg0KCQkJCQkJcmV0dXJuICdcdCc7DQoJCQkJCSAgY2FzZSAncic6DQoJCQkJCQlyZXR1cm4gJ1xyJzsNCgkJCQkJICBjYXNlICdcXCc6DQoJCQkJCQlyZXR1cm4gJ1xcJzsNCgkJCQkJICBkZWZhdWx0Og0KCQkJCQkJcmV0dXJuIG1hdGNoOw0KCQkJCQl9DQoJCQkJfTsNCgkJCQkNCgkJCQljb25zdCBoZXgyQnl0ZSA9IChzdHIpID0+IHsNCgkJCQkgIGNvbnN0IHJlZ2V4ID0gL1xceChbMC05QS1GYS1mXXsyfSkvZzsNCg0KCQkJCSAgcmV0dXJuIHN0ci5yZXBsYWNlKHJlZ2V4LCAobWF0Y2gsIGhleCkgPT4gew0KCQkJCQljb25zdCBieXRlVmFsdWUgPSBwYXJzZUludChoZXgsIDE2KTsNCgkJCQkJcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZVZhbHVlKTsNCgkJCQkgIH0pOw0KCQkJCQ0KCQkJCX07DQoNCgkJCQljb25zdCBmb3JtYXRTdHJpbmcgPSAodGVtcGxhdGUsIC4uLmFyZ3MpID0+IHsNCgkJCQkJcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL3soWzAtOV0rKX0vZywgZnVuY3Rpb24gKG1hdGNoLCBpbmRleCkgew0KCQkJCQkJcmV0dXJuIHR5cGVvZiBhcmdzW2luZGV4XSA9PT0gJ3VuZGVmaW5lZCcgPyBtYXRjaCA6IGFyZ3NbaW5kZXhdOw0KCQkJCQl9KTsNCgkJCQl9DQoNCgkJCQl2YXIgdGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpbnRleHQiKS52YWx1ZTsJCQkJDQoJCQkJdmFyIGtleSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXhfa2V5IikudmFsdWU7DQoJCQkJdmFyIGN1c3RvbW91dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXhfY3VzdG9tb3V0cHV0IikudmFsdWU7DQoJCQkJdmFyIG11bGlsaW5lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoa19tdWx0aWxpbmUiKTsNCgkJCQl2YXIgZXNjYXBlU2VxdWVuY2VzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoa19lc2NhcGVzZXF1ZW5jZXMiKTsNCgkJCQl2YXIgdXRmXzggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2hrX3V0ZjgiKTsNCgkJCQl2YXIgaGFzS2V5ID0ga2V5Lmxlbmd0aCAhPSAwOw0KDQoJCQkJaWYgKCFjdXN0b21vdXQubGVuZ3RoKSB7DQoJCQkJCWN1c3RvbW91dCA9ICJ7MH0iOw0KCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGV4X2N1c3RvbW91dHB1dCIpLmlubmVySFRNTCA9IGN1c3RvbW91dDsNCgkJCQl9DQoNCgkJCQljdXN0b21vdXQgPSBjdXN0b21vdXQucmVwbGFjZSgvXFwoW250XHJcXF0pL2csIHJlcGxhY2VFc2NhcGUpOw0KCQkJCQ0KCQkJCWlmIChtdWxpbGluZS5jaGVja2VkKSB7DQoJCQkJCWlmICghaGFzS2V5KQ0KCQkJCQkJa2V5ID0gZ2VuWG9yS2V5KGZhbHNlKTsNCgkJCQkNCgkJCQkJaWYgKGVzY2FwZVNlcXVlbmNlcy5jaGVja2VkKSB7DQoJCQkJCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXChbbnRcclxcXSkvZywgcmVwbGFjZUVzY2FwZSk7DQoJCQkJCQl0ZXh0ID0gaGV4MkJ5dGUodGV4dCk7DQoJCQkJCX0NCg0KCQkJCQlsZXQgb3JpZ1RleHQgPSB0ZXh0Ow0KDQoJCQkJCWlmICh1dGZfOC5jaGVja2VkKSB7DQoJCQkJCQl0ZXh0ID0gdXRmOC5lbmNvZGUodGV4dCk7DQoJCQkJCQlpc1VuaWNvZGUgPSBmYWxzZTsNCgkJCQkJfSBlbHNlIGlmIChpc0RvdWJsZUJ5dGUodGV4dCkpIHsNCgkJCQkJCWlzVW5pY29kZSA9IHRydWU7DQoJCQkJCX0NCg0KCQkJCQlyZXN1bHQgPSBnZW5DbGFzc1hvclN0aXJuZyhvcmlnVGV4dCwgdGV4dCwga2V5LCBpc1VuaWNvZGUpOw0KCQkJCQlyZXN1bHQgPSBmb3JtYXRTdHJpbmcoY3VzdG9tb3V0LCByZXN1bHRbMF0sIHJlc3VsdFsxXSwgcmVzdWx0WzJdLCByZXN1bHRbM10sIHJlc3VsdFs0XSk7DQoJCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRleHQiKS5pbm5lckhUTUwgPSByZXN1bHQ7DQoJCQkJfSBlbHNlIHsNCgkJCQkJdmFyIG91dHMgPSBbXTsNCgkJCQkJdmFyIGxpbmVzID0gdGV4dC5zcGxpdCgvXG4vKTsNCgkJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgew0KCQkJCQkJdGV4dCA9IGxpbmVzW2ldOw0KDQoJCQkJCQlpZiAoIXRleHQubGVuZ3RoKQ0KCQkJCQkJCWNvbnRpbnVlOw0KCQkJCQkJCQ0KCQkJCQkJaWYgKCFoYXNLZXkpDQoJCQkJCQkJa2V5ID0gZ2VuWG9yS2V5KGZhbHNlKTsNCg0KCQkJCQkJaWYgKGVzY2FwZVNlcXVlbmNlcy5jaGVja2VkKSB7DQoJCQkJCQkJdGV4dCA9IHRleHQucmVwbGFjZSgvXFwoW250XHJcXF0pL2csIHJlcGxhY2VFc2NhcGUpOw0KCQkJCQkJCXRleHQgPSBoZXgyQnl0ZSh0ZXh0KTsNCgkJCQkJCX0NCgkJCQkJCQ0KCQkJCQkJbGV0IG9yaWdUZXh0ID0gdGV4dDsNCgkJCQkJCQ0KCQkJCQkJaWYgKHV0Zl84LmNoZWNrZWQpIHsNCgkJCQkJCQl0ZXh0ID0gdXRmOC5lbmNvZGUodGV4dCk7DQoJCQkJCQkJaXNVbmljb2RlID0gZmFsc2U7DQoJCQkJCQl9IGVsc2UgaWYgKGlzRG91YmxlQnl0ZSh0ZXh0KSkgew0KCQkJCQkJCWlzVW5pY29kZSA9IHRydWU7DQoJCQkJCQl9DQoNCgkJCQkJCXJlc3VsdCA9IGdlbkNsYXNzWG9yU3Rpcm5nKG9yaWdUZXh0LCB0ZXh0LCBrZXksIGlzVW5pY29kZSk7DQoJCQkJCQlyZXN1bHQgPSBmb3JtYXRTdHJpbmcoY3VzdG9tb3V0LCByZXN1bHRbMF0sIHJlc3VsdFsxXSwgcmVzdWx0WzJdLCByZXN1bHRbM10sIHJlc3VsdFs0XSk7DQoJCQkJCQlvdXRzLnB1c2gocmVzdWx0KTsNCgkJCQkJfQ0KCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3V0ZXh0IikuaW5uZXJIVE1MID0gb3V0cy5qb2luKCJcbiIpOw0KCQkJCX0NCgkJCX0NCgkJPC9zY3JpcHQ+DQoJPC9ib2R5Pg0KPC9odG1sPg==
// utf8.js
// LyohIGh0dHBzOi8vbXRocy5iZS91dGY4anMgdjMuMC4wIGJ5IEBtYXRoaWFzICovDQo7KGZ1bmN0aW9uKHJvb3QpIHsNCg0KCXZhciBzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlOw0KDQoJLy8gVGFrZW4gZnJvbSBodHRwczovL210aHMuYmUvcHVueWNvZGUNCglmdW5jdGlvbiB1Y3MyZGVjb2RlKHN0cmluZykgew0KCQl2YXIgb3V0cHV0ID0gW107DQoJCXZhciBjb3VudGVyID0gMDsNCgkJdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7DQoJCXZhciB2YWx1ZTsNCgkJdmFyIGV4dHJhOw0KCQl3aGlsZSAoY291bnRlciA8IGxlbmd0aCkgew0KCQkJdmFsdWUgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspOw0KCQkJaWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkgew0KCQkJCS8vIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3Rlcg0KCQkJCWV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTsNCgkJCQlpZiAoKGV4dHJhICYgMHhGQzAwKSA9PSAweERDMDApIHsgLy8gbG93IHN1cnJvZ2F0ZQ0KCQkJCQlvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApOw0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZSBuZXh0DQoJCQkJCS8vIGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpcg0KCQkJCQlvdXRwdXQucHVzaCh2YWx1ZSk7DQoJCQkJCWNvdW50ZXItLTsNCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCW91dHB1dC5wdXNoKHZhbHVlKTsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gb3V0cHV0Ow0KCX0NCg0KCS8vIFRha2VuIGZyb20gaHR0cHM6Ly9tdGhzLmJlL3B1bnljb2RlDQoJZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSkgew0KCQl2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOw0KCQl2YXIgaW5kZXggPSAtMTsNCgkJdmFyIHZhbHVlOw0KCQl2YXIgb3V0cHV0ID0gJyc7DQoJCXdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7DQoJCQl2YWx1ZSA9IGFycmF5W2luZGV4XTsNCgkJCWlmICh2YWx1ZSA+IDB4RkZGRikgew0KCQkJCXZhbHVlIC09IDB4MTAwMDA7DQoJCQkJb3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7DQoJCQkJdmFsdWUgPSAweERDMDAgfCB2YWx1ZSAmIDB4M0ZGOw0KCQkJfQ0KCQkJb3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSk7DQoJCX0NCgkJcmV0dXJuIG91dHB1dDsNCgl9DQoNCglmdW5jdGlvbiBjaGVja1NjYWxhclZhbHVlKGNvZGVQb2ludCkgew0KCQlpZiAoY29kZVBvaW50ID49IDB4RDgwMCAmJiBjb2RlUG9pbnQgPD0gMHhERkZGKSB7DQoJCQl0aHJvdyBFcnJvcigNCgkJCQknTG9uZSBzdXJyb2dhdGUgVSsnICsgY29kZVBvaW50LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICsNCgkJCQknIGlzIG5vdCBhIHNjYWxhciB2YWx1ZScNCgkJCSk7DQoJCX0NCgl9DQoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCglmdW5jdGlvbiBjcmVhdGVCeXRlKGNvZGVQb2ludCwgc2hpZnQpIHsNCgkJcmV0dXJuIHN0cmluZ0Zyb21DaGFyQ29kZSgoKGNvZGVQb2ludCA+PiBzaGlmdCkgJiAweDNGKSB8IDB4ODApOw0KCX0NCg0KCWZ1bmN0aW9uIGVuY29kZUNvZGVQb2ludChjb2RlUG9pbnQpIHsNCgkJaWYgKChjb2RlUG9pbnQgJiAweEZGRkZGRjgwKSA9PSAwKSB7IC8vIDEtYnl0ZSBzZXF1ZW5jZQ0KCQkJcmV0dXJuIHN0cmluZ0Zyb21DaGFyQ29kZShjb2RlUG9pbnQpOw0KCQl9DQoJCXZhciBzeW1ib2wgPSAnJzsNCgkJaWYgKChjb2RlUG9pbnQgJiAweEZGRkZGODAwKSA9PSAwKSB7IC8vIDItYnl0ZSBzZXF1ZW5jZQ0KCQkJc3ltYm9sID0gc3RyaW5nRnJvbUNoYXJDb2RlKCgoY29kZVBvaW50ID4+IDYpICYgMHgxRikgfCAweEMwKTsNCgkJfQ0KCQllbHNlIGlmICgoY29kZVBvaW50ICYgMHhGRkZGMDAwMCkgPT0gMCkgeyAvLyAzLWJ5dGUgc2VxdWVuY2UNCgkJCWNoZWNrU2NhbGFyVmFsdWUoY29kZVBvaW50KTsNCgkJCXN5bWJvbCA9IHN0cmluZ0Zyb21DaGFyQ29kZSgoKGNvZGVQb2ludCA+PiAxMikgJiAweDBGKSB8IDB4RTApOw0KCQkJc3ltYm9sICs9IGNyZWF0ZUJ5dGUoY29kZVBvaW50LCA2KTsNCgkJfQ0KCQllbHNlIGlmICgoY29kZVBvaW50ICYgMHhGRkUwMDAwMCkgPT0gMCkgeyAvLyA0LWJ5dGUgc2VxdWVuY2UNCgkJCXN5bWJvbCA9IHN0cmluZ0Zyb21DaGFyQ29kZSgoKGNvZGVQb2ludCA+PiAxOCkgJiAweDA3KSB8IDB4RjApOw0KCQkJc3ltYm9sICs9IGNyZWF0ZUJ5dGUoY29kZVBvaW50LCAxMik7DQoJCQlzeW1ib2wgKz0gY3JlYXRlQnl0ZShjb2RlUG9pbnQsIDYpOw0KCQl9DQoJCXN5bWJvbCArPSBzdHJpbmdGcm9tQ2hhckNvZGUoKGNvZGVQb2ludCAmIDB4M0YpIHwgMHg4MCk7DQoJCXJldHVybiBzeW1ib2w7DQoJfQ0KDQoJZnVuY3Rpb24gdXRmOGVuY29kZShzdHJpbmcpIHsNCgkJdmFyIGNvZGVQb2ludHMgPSB1Y3MyZGVjb2RlKHN0cmluZyk7DQoJCXZhciBsZW5ndGggPSBjb2RlUG9pbnRzLmxlbmd0aDsNCgkJdmFyIGluZGV4ID0gLTE7DQoJCXZhciBjb2RlUG9pbnQ7DQoJCXZhciBieXRlU3RyaW5nID0gJyc7DQoJCXdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7DQoJCQljb2RlUG9pbnQgPSBjb2RlUG9pbnRzW2luZGV4XTsNCgkJCWJ5dGVTdHJpbmcgKz0gZW5jb2RlQ29kZVBvaW50KGNvZGVQb2ludCk7DQoJCX0NCgkJcmV0dXJuIGJ5dGVTdHJpbmc7DQoJfQ0KDQoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCglmdW5jdGlvbiByZWFkQ29udGludWF0aW9uQnl0ZSgpIHsNCgkJaWYgKGJ5dGVJbmRleCA+PSBieXRlQ291bnQpIHsNCgkJCXRocm93IEVycm9yKCdJbnZhbGlkIGJ5dGUgaW5kZXgnKTsNCgkJfQ0KDQoJCXZhciBjb250aW51YXRpb25CeXRlID0gYnl0ZUFycmF5W2J5dGVJbmRleF0gJiAweEZGOw0KCQlieXRlSW5kZXgrKzsNCg0KCQlpZiAoKGNvbnRpbnVhdGlvbkJ5dGUgJiAweEMwKSA9PSAweDgwKSB7DQoJCQlyZXR1cm4gY29udGludWF0aW9uQnl0ZSAmIDB4M0Y7DQoJCX0NCg0KCQkvLyBJZiB3ZSBlbmQgdXAgaGVyZSwgaXTigJlzIG5vdCBhIGNvbnRpbnVhdGlvbiBieXRlDQoJCXRocm93IEVycm9yKCdJbnZhbGlkIGNvbnRpbnVhdGlvbiBieXRlJyk7DQoJfQ0KDQoJZnVuY3Rpb24gZGVjb2RlU3ltYm9sKCkgew0KCQl2YXIgYnl0ZTE7DQoJCXZhciBieXRlMjsNCgkJdmFyIGJ5dGUzOw0KCQl2YXIgYnl0ZTQ7DQoJCXZhciBjb2RlUG9pbnQ7DQoNCgkJaWYgKGJ5dGVJbmRleCA+IGJ5dGVDb3VudCkgew0KCQkJdGhyb3cgRXJyb3IoJ0ludmFsaWQgYnl0ZSBpbmRleCcpOw0KCQl9DQoNCgkJaWYgKGJ5dGVJbmRleCA9PSBieXRlQ291bnQpIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KDQoJCS8vIFJlYWQgZmlyc3QgYnl0ZQ0KCQlieXRlMSA9IGJ5dGVBcnJheVtieXRlSW5kZXhdICYgMHhGRjsNCgkJYnl0ZUluZGV4Kys7DQoNCgkJLy8gMS1ieXRlIHNlcXVlbmNlIChubyBjb250aW51YXRpb24gYnl0ZXMpDQoJCWlmICgoYnl0ZTEgJiAweDgwKSA9PSAwKSB7DQoJCQlyZXR1cm4gYnl0ZTE7DQoJCX0NCg0KCQkvLyAyLWJ5dGUgc2VxdWVuY2UNCgkJaWYgKChieXRlMSAmIDB4RTApID09IDB4QzApIHsNCgkJCWJ5dGUyID0gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKTsNCgkJCWNvZGVQb2ludCA9ICgoYnl0ZTEgJiAweDFGKSA8PCA2KSB8IGJ5dGUyOw0KCQkJaWYgKGNvZGVQb2ludCA+PSAweDgwKSB7DQoJCQkJcmV0dXJuIGNvZGVQb2ludDsNCgkJCX0gZWxzZSB7DQoJCQkJdGhyb3cgRXJyb3IoJ0ludmFsaWQgY29udGludWF0aW9uIGJ5dGUnKTsNCgkJCX0NCgkJfQ0KDQoJCS8vIDMtYnl0ZSBzZXF1ZW5jZSAobWF5IGluY2x1ZGUgdW5wYWlyZWQgc3Vycm9nYXRlcykNCgkJaWYgKChieXRlMSAmIDB4RjApID09IDB4RTApIHsNCgkJCWJ5dGUyID0gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKTsNCgkJCWJ5dGUzID0gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKTsNCgkJCWNvZGVQb2ludCA9ICgoYnl0ZTEgJiAweDBGKSA8PCAxMikgfCAoYnl0ZTIgPDwgNikgfCBieXRlMzsNCgkJCWlmIChjb2RlUG9pbnQgPj0gMHgwODAwKSB7DQoJCQkJY2hlY2tTY2FsYXJWYWx1ZShjb2RlUG9pbnQpOw0KCQkJCXJldHVybiBjb2RlUG9pbnQ7DQoJCQl9IGVsc2Ugew0KCQkJCXRocm93IEVycm9yKCdJbnZhbGlkIGNvbnRpbnVhdGlvbiBieXRlJyk7DQoJCQl9DQoJCX0NCg0KCQkvLyA0LWJ5dGUgc2VxdWVuY2UNCgkJaWYgKChieXRlMSAmIDB4RjgpID09IDB4RjApIHsNCgkJCWJ5dGUyID0gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKTsNCgkJCWJ5dGUzID0gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKTsNCgkJCWJ5dGU0ID0gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKTsNCgkJCWNvZGVQb2ludCA9ICgoYnl0ZTEgJiAweDA3KSA8PCAweDEyKSB8IChieXRlMiA8PCAweDBDKSB8DQoJCQkJKGJ5dGUzIDw8IDB4MDYpIHwgYnl0ZTQ7DQoJCQlpZiAoY29kZVBvaW50ID49IDB4MDEwMDAwICYmIGNvZGVQb2ludCA8PSAweDEwRkZGRikgew0KCQkJCXJldHVybiBjb2RlUG9pbnQ7DQoJCQl9DQoJCX0NCg0KCQl0aHJvdyBFcnJvcignSW52YWxpZCBVVEYtOCBkZXRlY3RlZCcpOw0KCX0NCg0KCXZhciBieXRlQXJyYXk7DQoJdmFyIGJ5dGVDb3VudDsNCgl2YXIgYnl0ZUluZGV4Ow0KCWZ1bmN0aW9uIHV0ZjhkZWNvZGUoYnl0ZVN0cmluZykgew0KCQlieXRlQXJyYXkgPSB1Y3MyZGVjb2RlKGJ5dGVTdHJpbmcpOw0KCQlieXRlQ291bnQgPSBieXRlQXJyYXkubGVuZ3RoOw0KCQlieXRlSW5kZXggPSAwOw0KCQl2YXIgY29kZVBvaW50cyA9IFtdOw0KCQl2YXIgdG1wOw0KCQl3aGlsZSAoKHRtcCA9IGRlY29kZVN5bWJvbCgpKSAhPT0gZmFsc2UpIHsNCgkJCWNvZGVQb2ludHMucHVzaCh0bXApOw0KCQl9DQoJCXJldHVybiB1Y3MyZW5jb2RlKGNvZGVQb2ludHMpOw0KCX0NCg0KCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJcm9vdC52ZXJzaW9uID0gJzMuMC4wJzsNCglyb290LmVuY29kZSA9IHV0ZjhlbmNvZGU7DQoJcm9vdC5kZWNvZGUgPSB1dGY4ZGVjb2RlOw0KDQp9KHR5cGVvZiBleHBvcnRzID09PSAndW5kZWZpbmVkJyA/IHRoaXMudXRmOCA9IHt9IDogZXhwb3J0cykpOw0K
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment