1(function () { 2 function injectHtmlAd(container, rawHtml) { 3 container.innerHTML = ""; 4 5 const temp = document.createElement("div"); 6 temp.innerHTML = rawHtml; 7 8 Array.from(temp.childNodes).forEach((node) => { 9 if (node.nodeName === "SCRIPT") { 10 const script = document.createElement("script"); 11 12 Array.from(node.attributes).forEach((attr) => { 13 script.setAttribute(attr.name, attr.value); 14 }); 15 16 if (node.textContent) { 17 if (node.textContent.includes("adsbygoogle") && node.textContent.includes("push")) { 18 script.textContent = `try { ${node.textContent} } catch(e) {}`; 19 } else { 20 script.textContent = node.textContent; 21 } 22 } 23 24 container.appendChild(script); 25 } else if (node.nodeType === 1 && node.classList?.contains("adsbygoogle")) { 26 const clone = node.cloneNode(true); 27 28 clone.style.opacity = "0"; 29 clone.style.transition = "opacity 0.3s ease"; 30 31 container.appendChild(clone); 32 33 const adObserver = new MutationObserver(() => { 34 if (clone.dataset.adStatus === "filled" || clone.querySelector("iframe")) { 35 clone.style.opacity = "1"; 36 adObserver.disconnect(); 37 } 38 }); 39 40 adObserver.observe(clone, { 41 childList: true, 42 subtree: true, 43 attributes: true, 44 attributeFilter: ["data-ad-status"], 45 }); 46 47 setTimeout(() => { 48 clone.style.opacity = "1"; 49 adObserver.disconnect(); 50 }, 3000); 51 } else { 52 container.appendChild(node.cloneNode(true)); 53 } 54 }); 55 } 56 57 function createAdvertServeLoader({ selector, adUrl }) { 58 const processedAds = new WeakSet(); 59 60 function loadAd(container) { 61 if (processedAds.has(container)) return; 62 processedAds.add(container); 63 64 fetch(adUrl) 65 .then((response) => response.text()) 66 .then((html) => { 67 if (!container.isConnected) return; 68 69 const isAdSense = /adsbygoogle/i.test(html); 70 71 if (isAdSense) { 72 injectHtmlAd(container, html); 73 } else { 74 const parser = new DOMParser(); 75 const doc = parser.parseFromString(html, "text/html"); 76 const adElement = doc.body.firstElementChild || doc.querySelector("a, img, div"); 77 if (!adElement) return; 78 79 adElement.querySelectorAll("img").forEach((img) => { 80 img.removeAttribute("width"); 81 img.removeAttribute("height"); 82 img.style.width = "100%"; 83 img.style.height = "auto"; 84 }); 85 86 container.innerHTML = ""; 87 container.appendChild(adElement); 88 } 89 }) 90 .catch((err) => { 91 console.error("AdvertServe ad failed:", selector, err); 92 }); 93 } 94 95 function injectAds() { 96 document.querySelectorAll(selector).forEach(loadAd); 97 } 98 99 injectAds(); 100 101 const observer = new MutationObserver(injectAds); 102 observer.observe(document.body, { 103 childList: true, 104 subtree: true, 105 }); 106 } 107 108 createAdvertServeLoader({ 109 selector: ".advertserve-long", 110 adUrl: "https://slowtwitch2.advertserve.com/servlet/view/banner/url/zone?zid=5&pid=0", 111 }); 112 createAdvertServeLoader({ 113 selector: ".advertserve-sidebar-small", 114 adUrl: "https://slowtwitch2.advertserve.com/servlet/view/banner/url/zone?zid=6&pid=0", 115 }); 116 createAdvertServeLoader({ 117 selector: ".advertserve-sidebar-tall", 118 adUrl: "https://slowtwitch2.advertserve.com/servlet/view/banner/url/zone?zid=7&pid=0", 119 }); 120})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.