/* hitstat v3 — visitor analytics. Без кук (localStorage→sessionStorage, pseudonymous), без query, referrer host-only, 1 GET-пиксель same-origin, failure-silent. Плейсхолдер mem_id подставляет hitstat-emit.php. */ (function () { try { if (typeof Image === "undefined" || !window.location) return; var D = document, N = navigator, W = window, E = encodeURIComponent, i, LS = null, SS = null; try { LS = W.localStorage; } catch (e) {} try { SS = W.sessionStorage; } catch (e) {} // persistent vid + first_seen(день); seq — на вкладку var vid = "", fs = 0, seq = 0, day = (Date.now() / 864e5) | 0, ST = LS || SS; if (ST) try { vid = ST.getItem("hc_vid") || ""; if (!/^[0-9a-f]{16}$/.test(vid)) { vid = ""; for (i = 0; i < 16; i++) vid += "0123456789abcdef"[Math.random() * 16 | 0]; ST.setItem("hc_vid", vid); ST.setItem("hc_fs", String(day)); } fs = +(ST.getItem("hc_fs") || 0) || day; } catch (e) {} if (SS) try { seq = (SS.getItem("hc_seq") | 0) + 1; SS.setItem("hc_seq", String(seq)); } catch (e) {} // боты: webdriver|headlessUA|phantom|noScreen|noPlugins|permAnomaly|CDP var b = 0; try { if (N.webdriver) b |= 1; if (/HeadlessChrome|PhantomJS|SlimerJS|jsdom/i.test(N.userAgent || "")) b |= 2; if (W.callPhantom || W._phantom || W.__nightmare || W.domAutomation) b |= 4; if (!screen.width || !screen.height) b |= 8; if (N.plugins && N.plugins.length === 0 && (N.languages || []).length === 0) b |= 16; if (N.permissions && typeof Notification === "undefined") b |= 32; if (W.cdc_ || D.$cdc_) b |= 64; } catch (e) {} // UA-CH: платформа + точная версия браузера; соединение var g = "", ub = ""; try { var u = N.userAgentData; if (u) { g = (u.platform || "") + (u.mobile ? ".m" : ".d"); if (u.brands) { for (i = 0; i < u.brands.length; i++) { var br = u.brands[i]; if (!/Not/.test(br.brand)) ub = br.brand + " " + br.version; if (!/Not|Chromium/.test(br.brand)) break; } ub = ub.slice(0, 32); } } } catch (e) {} var ct = ""; try { var cn = N.connection; if (cn && cn.effectiveType) ct = String(cn.effectiveType).charAt(0); } catch (e) {} // класс устройства: ядра/память/тач/DNT var hc = N.hardwareConcurrency | 0, dm = 0; try { var mm = N.deviceMemory; if (mm) dm = mm <= 1 ? 1 : mm <= 2 ? 2 : mm <= 4 ? 4 : 8; } catch (e) {} var tp = Math.min(N.maxTouchPoints | 0, 9), nt = 0; try { if (N.doNotTrack === "1" || W.doNotTrack === "1") nt = 1; } catch (e) {} // поведение: mouse|scroll|touch|key var h = 0; function bh(k) { return function () { h |= k; }; } try { D.addEventListener("mousemove", bh(1)); D.addEventListener("scroll", bh(2)); D.addEventListener("touchstart", bh(4)); D.addEventListener("keydown", bh(8)); } catch (e) {} // видимое время (visibilitychange-накопитель) var vt = 0, vs = D.visibilityState === "visible" ? Date.now() : 0; try { D.addEventListener("visibilitychange", function () { try { if (D.visibilityState === "visible") { if (!vs) vs = Date.now(); } else if (vs) { vt += Date.now() - vs; vs = 0; } } catch (e) {} }); } catch (e) {} function vsec() { return (vt + (vs ? Date.now() - vs : 0)) / 1e3; } // adblock bait var ab = 0, RAF = W.requestAnimationFrame || function (f) { setTimeout(f, 60); }; function adb() { try { var dv = D.createElement("div"); dv.className = "adsbox pub_300x250 ad"; dv.style.cssText = "position:absolute;left:-999px;top:-999px;width:1px;height:1px"; (D.body || D.documentElement).appendChild(dv); RAF(function () { try { ab = dv.offsetHeight ? 0 : 1; } catch (e) {} try { if (dv.parentNode) dv.parentNode.removeChild(dv); } catch (e) {} }); } catch (e) {} } // перф: "ttfb.load" бакеты + протокол h1/h2/h3 function pB(ms) { return ms < 200 ? 0 : ms < 500 ? 1 : ms < 1000 ? 2 : ms < 2000 ? 3 : ms < 5000 ? 4 : 5; } function tB(s) { return s < 5 ? "a" : s < 15 ? "b" : s < 30 ? "c" : s < 60 ? "d" : s < 180 ? "e" : s < 600 ? "f" : "g"; } function navPerf() { try { var n = performance && performance.getEntriesByType ? performance.getEntriesByType("navigation")[0] : null; if (!n || !n.responseStart) return ["", ""]; var f = pB(n.responseStart - n.startTime) + "." + pB(n.loadEventEnd ? n.loadEventEnd - n.startTime : n.duration || 0); var p = n.nextHopProtocol || ""; p = p.indexOf("h2") === 0 ? "h2" : p.indexOf("h3") === 0 ? "h3" : p.indexOf("http/1") === 0 ? "h1" : ""; return [f, p]; } catch (e) { return ["", ""]; } } // CDN: catalog_common_new.js → [duration-бакет, size-бакет(c=кэш)] function cdn() { try { var rs = performance.getEntriesByType("resource"); for (i = 0; i < rs.length; i++) { if (rs[i].name.indexOf("catalog_common_new.js") > 0) { var z = rs[i].transferSize | 0; return [pB(rs[i].duration), z === 0 ? "c" : z < 20480 ? "0" : z < 102400 ? "1" : z < 307200 ? "2" : z < 1048576 ? "3" : "4"]; } } } catch (e) {} return ["", ""]; } // отправка: один пиксель на страницу var fired = false; function fire() { if (fired) return; fired = true; try { var rh = ""; try { if (D.referrer) rh = (D.referrer.split("/")[2] || "").toLowerCase(); } catch (e) {} var np = navPerf(), cd = cdn(); var q = "m=162705&v=" + vid + "&fs=" + fs + "&q=" + seq + "&p=" + E((location.pathname || "/").slice(0, 200)) + "&r=" + E(rh.slice(0, 100)) + "&l=" + E((N.language || "").slice(0, 16)) + "&s=" + (screen.width | 0) + "x" + (screen.height | 0) + "&t=" + new Date().getTimezoneOffset() + "&b=" + b + "&h=" + h + "&d=" + tB(vsec()) + "&f=" + np[0] + "&np=" + np[1] + "&rn=" + cd[0] + "&rz=" + cd[1] + "&c=" + ct + "&g=" + E(g.slice(0, 24)) + "&ub=" + E(ub) + "&hc=" + hc + "&dm=" + dm + "&tp=" + tp + "&nt=" + nt + "&ab=" + ab; var im = new Image(); im.src = location.protocol + "//" + location.host + "/hitcounter/hitstat.gif?" + q; } catch (e) {} } // pagehide | кап 45s | страховка 10s без load; adblock-замер после load+rAF var armed = false; function arm() { armed = true; adb(); W.addEventListener("pagehide", fire); setTimeout(fire, 45000); } if (D.readyState === "complete") arm(); else { W.addEventListener("load", arm); setTimeout(function () { if (!armed) fire(); }, 10000); } } catch (e) {} })();