рдПрдЪрдЯреАрдПрдордПрд▓ рдПрдирдХреЛрдбрд░/рдбрд┐рдХреЛрдбрд░

рдЙрдиреНрдирдд рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкреЗрд╢реЗрд╡рд░ рдПрдЪрдЯреАрдПрдордПрд▓ рдПрдирдХреЛрдбрд┐рдВрдЧ рдФрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЯреВрд▓ред XSS рд╣рдорд▓реЛрдВ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛, рд╡рд┐рд╢реЗрд╖ рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рдПрдирдХреЛрдб рдХрд░реЗрдВ, рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╡реЗрдм рд╕рд╛рдордЧреНрд░реА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред рд░реАрдпрд▓-рдЯрд╛рдЗрдо рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╕рд╛рде рдиреЗрдореНрдб рдПрдВрдЯрд┐рдЯреАрдЬ, рдиреНрдпреВрдореЗрд░рд┐рдХ рдПрдВрдЯрд┐рдЯреАрдЬ рдФрд░ URL рдПрдирдХреЛрдбрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдПрдирдХреЛрдбрд┐рдВрдЧ рдкреНрд░рдХрд╛рд░
рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдк
рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдВ
рдПрдирдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЖрдЙрдЯрдкреБрдЯ
рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЖрдЙрдЯрдкреБрдЯ

рд╕рд╛рдорд╛рдиреНрдп рдПрдЪрдЯреАрдПрдордПрд▓ рдПрдВрдЯрд┐рдЯреАрдЬ рд╕рдВрджрд░реНрдн

рдЕрдХреНрд╖рд░ рдиреЗрдореНрдб рдПрдВрдЯрд┐рдЯреА рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдПрдВрдЯрд┐рдЯреА рд╣реЗрдХреНрд╕ рдПрдВрдЯрд┐рдЯреА рд╡рд┐рд╡рд░рдг
< < < < рд╕реЗ рдХрдо
> > > > рд╕реЗ рдЕрдзрд┐рдХ
& & & & рдПрдореНрдкрд░рд╕реИрдВрдб
" " " " рдбрдмрд▓ рдХреЛрдЯ
' ' ' ' рд╕рд┐рдВрдЧрд▓ рдХреЛрдЯ
┬а       рдиреЙрди-рдмреНрд░реЗрдХрд┐рдВрдЧ рд╕реНрдкреЗрд╕
┬й © © © рдХреЙрдкреАрд░рд╛рдЗрдЯ
┬о ® ® ® рдкрдВрдЬреАрдХреГрдд рдЯреНрд░реЗрдбрдорд╛рд░реНрдХ

рдПрдиреНрдХреЛрдбрд┐рдВрдЧ/рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг

рдПрдХреНрд╕.рдПрд╕.рдПрд╕. рд╣рдорд▓рд╛ рд░реЛрдХрдерд╛рдо
рд╕рд╛рдорд╛рдиреНрдп рдПрдХреНрд╕.рдПрд╕.рдПрд╕. рд╣рдорд▓рд╛ рдкреИрдЯрд░реНрди рдЬрд┐рд╕реЗ рдЙрдЪрд┐рдд рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдПрдЪ.рдЯреА.рдПрдо.рдПрд▓. рд╕рд╛рдордЧреНрд░реА
рдирдорд╕реНрддреЗ рдФрд░ рд╕реНрд╡рд╛рдЧрдд рд╣реИ
рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рдПрдЪ.рдЯреА.рдПрдо.рдПрд▓.
рдЙрджреНрдзрд░рдг рдкреНрд░рдмрдВрдзрди
рдЙрд╕рдиреЗ рдХрд╣рд╛ "рдирдорд╕реНрддреЗ" рдФрд░ рдЙрд╕рдиреЗ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ 'рд╣рд╛рдп'
рдПрдХрд▓ рдФрд░ рджреЛрд╣рд░реЗ рдЙрджреНрдзрд░рдг рд╡рд╛рд▓рд╛ рдЯреЗрдХреНрд╕реНрдЯ
рдпреВрдирд┐рдХреЛрдб рд╡рд░реНрдг
┬й 2025 рдХрдВрдкрдиреАтДв тАв рд╕рд░реНрд╡рд╛рдзрд┐рдХрд╛рд░ рд╕реБрд░рдХреНрд╖рд┐рдд
рд╡рд┐рд╢реЗрд╖ рдкреНрд░рддреАрдХ рдФрд░ рдпреВрдирд┐рдХреЛрдб рд╡рд░реНрдг
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЬреЗрдХреНрд╢рди
javascript:alert(document.cookie)
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпреВ.рдЖрд░.рдПрд▓. рдЗрдВрдЬреЗрдХреНрд╢рди рдкреНрд░рдпрд╛рд╕
рдлреЙрд░реНрдо рдбреЗрдЯрд╛
name=John&email=john@example.com&message=Hello!
рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде рдпреВ.рдЖрд░.рдПрд▓.-рдПрдиреНрдХреЛрдбреЗрдб рдлреЙрд░реНрдо рдбреЗрдЯрд╛

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╡реЗрдм рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╛рдзрд╛рди рдЪрд╛рд╣рд┐рдП?

рд╢реАрд░реНрд╖ рдХреНрд▓рд╛рдЙрдб рд╕реБрд░рдХреНрд╖рд╛ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВ

тЬи Smart Nation's Core Infrastructure: WIA Code тЬи

рдбреНрд░реЛрди┬╖рд░реЛрдмреЛрдЯ рдбрд┐рд▓реАрд╡рд░реА, рд╕реНрд╡рд╛рдпрддреНрдд рдбреНрд░рд╛рдЗрд╡рд┐рдВрдЧ, рдЖрдкрд╛рддрдХрд╛рд▓реАрди рдмрдЪрд╛рд╡ рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ - 30 рджрд┐рдиреЛрдВ рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░реЗрдВ, рдЖрдкрдХреЗ рджреЗрд╢ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рдореБрдлреНрдд!

рдбрдмреНрд▓реНрдпреВрдЖрдИрдП рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдиреЗрдВ

ЁЯдЦ рдЕрдкрдирд╛ рдПрдЖрдИ рд╕рд╣рд╛рдпрдХ рдЪреБрдиреЗрдВ

ЁЯТм рдЪреИрдЯрдЬреАрдкреАрдЯреА
рд╕рдмрд╕реЗ рдмрд╣реБрдореБрдЦреА тАв рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда
ЁЯза рдХреНрд▓реЙрдб
рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рддрд░реНрдХ тАв рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрддреНрддрдо
тЬи рдЬреЗрдорд┐рдиреА рдирд┐рдГрд╢реБрд▓реНрдХ
рджреИрдирд┐рдХ рдореБрдлреНрдд рд╕реАрдорд╛ тАв рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЪреИрдЯ
', html: '
рдирдорд╕реНрдХрд╛рд░ рдФрд░ рд╕реНрд╡рд╛рдЧрдд рд╣реИ
', quotes: 'He said "Hello" & she replied \'Hi\'', unicode: '┬й 2025 CompanyтДв тАв All Rights Reserved', javascript: 'javascript:alert(document.cookie)', form: 'name=John&email=john@example.com&message=Hello!' }; // HTML Entities Map const HTML_ENTITIES = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '\n': ' ', '\r': ' ', '\t': ' ' }; // Extended HTML Entities const EXTENDED_ENTITIES = { '┬й': '┬й', '┬о': '┬о', 'тДв': 'тДв', 'тВм': 'тВм', '┬г': '┬г', '┬е': '┬е', '┬з': '┬з', '┬╢': '┬╢', 'тАв': 'тАв', 'тАж': 'тАж', 'тАУ': 'тАУ', 'тАФ': 'тАФ', ''': 'тАШ', ''': 'тАЩ', '"': 'тАЬ', '"': 'тАЭ', '┬л': '┬л', '┬╗': '┬╗', '┬░': '┬░', '┬▒': '┬▒', '├Ч': '├Ч', '├╖': '├╖', '┬╝': '┬╝', '┬╜': '┬╜', '┬╛': '┬╛', '╬▒': '╬▒', '╬▓': '╬▓', '╬│': '╬│', '╬┤': '╬┤', '╬╡': '╬╡', '╬╗': '╬╗', '╬╝': '╬╝', '╧А': '╧А', '╧Г': '╧Г', '╧Д': '╧Д', '╧Ж': '╧Ж', '╧Й': '╧Й' }; // XSS Pattern Detection const XSS_PATTERNS = [ /]*>/i, /javascript:/i, /vbscript:/i, /onload\s*=/i, /onclick\s*=/i, /onerror\s*=/i, /onmouseover\s*=/i, /onfocus\s*=/i, /onblur\s*=/i, /eval\s*\(/i, /document\.cookie/i, /document\.write/i, /window\.location/i, /alert\s*\(/i, /confirm\s*\(/i, /prompt\s*\(/i, /]*>/i, /]*>/i, /]*>/i, /]*>/i, /]*>/i, /data:[^;]*;base64/i, /\.innerHTML/i, /\.outerHTML/i ]; // ========== MAIN PROCESSING FUNCTIONS ========== // Main processing function function processText() { const input = document.getElementById('inputText').value; if (!input.trim()) { document.getElementById('encodedOutput').textContent = ''; document.getElementById('decodedOutput').textContent = ''; hideSecurityAnalysis(); return; } try { // Encode const encoded = encodeHTML(input); document.getElementById('encodedOutput').textContent = encoded; // Decode const decoded = decodeHTML(input); document.getElementById('decodedOutput').textContent = decoded; // Security analysis performSecurityAnalysis(input); // Show OTA after successful processing showOTA(); // Track usage trackEvent('html_processed', { hasXSSPatterns: detectXSSPatterns(input).length > 0 }); } catch (error) { showNotification(`Error: ${error.message}`, 'error'); } } // HTML Encoding Function function encodeHTML(text) { let encoded = text; // Basic HTML encoding if (document.getElementById('encodeBasic').checked) { encoded = encoded.replace(/&/g, '&') .replace(//g, '>'); } // Quote encoding if (document.getElementById('encodeQuotes').checked) { encoded = encoded.replace(/"/g, '"') .replace(/'/g, '''); } // Extended characters if (document.getElementById('encodeExtended').checked) { for (const [char, entity] of Object.entries(EXTENDED_ENTITIES)) { encoded = encoded.replace(new RegExp(escapeRegExp(char), 'g'), entity); } } // Numeric entities if (document.getElementById('encodeNumeric').checked) { encoded = encoded.replace(/[^\x00-\x7F]/g, function(char) { return '&#' + char.charCodeAt(0) + ';'; }); } // Newlines if (document.getElementById('encodeNewlines').checked) { encoded = encoded.replace(/\n/g, ' ') .replace(/\r/g, ' ') .replace(/\t/g, ' '); } // URL encoding if (document.getElementById('urlEncode').checked) { encoded = encodeURIComponent(encoded); } return encoded; } // HTML Decoding Function function decodeHTML(text) { let decoded = text; try { // URL decode first if needed if (text.includes('%')) { try { decoded = decodeURIComponent(decoded); } catch (e) { // If URL decoding fails, continue with original text } } // Decode HTML entities const tempDiv = document.createElement('div'); tempDiv.innerHTML = decoded; decoded = tempDiv.textContent || tempDiv.innerText || ''; return decoded; } catch (error) { return text; // Return original if decoding fails } } // XSS Pattern Detection function detectXSSPatterns(text) { const detectedPatterns = []; for (const pattern of XSS_PATTERNS) { if (pattern.test(text)) { detectedPatterns.push(pattern.source); } } return detectedPatterns; } // Security Analysis function performSecurityAnalysis(text) { const items = []; // XSS pattern detection const xssPatterns = detectXSSPatterns(text); if (xssPatterns.length > 0) { items.push({ type: 'error', icon: 'ЁЯЪи', message: `Potential XSS patterns detected: ${xssPatterns.length} suspicious patterns found` }); } else { items.push({ type: 'success', icon: 'тЬЕ', message: 'рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдПрдХреНрд╕.рдПрд╕.рдПрд╕ рдкреИрдЯрд░реНрди рдирд╣реАрдВ рдорд┐рд▓рд╛' }); } // HTML tag detection const htmlTags = text.match(/<[^>]+>/g); if (htmlTags) { if (htmlTags.length > 5) { items.push({ type: 'warning', icon: 'тЪая╕П', message: `Contains ${htmlTags.length} HTML tags - verify if intentional` }); } else { items.push({ type: 'info', icon: 'тД╣я╕П', message: `Contains ${htmlTags.length} HTML tags` }); } } // JavaScript protocol detection if (/javascript:/i.test(text)) { items.push({ type: 'error', icon: 'ЁЯЫС', message: 'рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдпреБрдХреНрдд - рдЙрдЪреНрдЪ рдПрдХреНрд╕.рдПрд╕.рдПрд╕ рдЬреЛрдЦрд┐рдо!' }); } // Event handler detection if (/on\w+\s*=/i.test(text)) { items.push({ type: 'error', icon: 'тЪб', message: 'рдПрдЪрдЯреАрдПрдордПрд▓ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдпреБрдХреНрдд - рд╕рдВрднрд╛рд╡рд┐рдд рдПрдХреНрд╕.рдПрд╕.рдПрд╕ рд╡реЗрдХреНрдЯрд░' }); } // Special characters analysis const specialChars = text.match(/[<>&"']/g); if (specialChars) { items.push({ type: 'info', icon: 'ЁЯФд', message: `Contains ${specialChars.length} special HTML characters` }); } // Unicode analysis const unicodeChars = text.match(/[^\x00-\x7F]/g); if (unicodeChars) { items.push({ type: 'info', icon: 'ЁЯМР', message: `Contains ${unicodeChars.length} Unicode characters` }); } // Encoding recommendations if (xssPatterns.length > 0 || htmlTags) { items.push({ type: 'warning', icon: 'ЁЯТб', message: 'рд╕реБрдЭрд╛рд╡: рд╡реЗрдм рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн-рдЬрд╛рдЧрд░реВрдХ рдПрдирдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ' }); } displaySecurityAnalysis(items); } // Display Security Analysis function displaySecurityAnalysis(items) { const container = document.getElementById('securityItems'); const analysisSection = document.getElementById('securityAnalysis'); container.innerHTML = ''; items.forEach(item => { const div = document.createElement('div'); div.className = `security-item ${item.type}`; div.innerHTML = ` ${item.icon} ${item.message} `; container.appendChild(div); }); analysisSection.style.display = 'block'; } // Hide Security Analysis function hideSecurityAnalysis() { document.getElementById('securityAnalysis').style.display = 'none'; } // Use Sample function useSample(sampleId) { const sample = HTML_SAMPLES[sampleId]; if (!sample) return; document.getElementById('inputText').value = sample; processText(); // Smooth scroll to results setTimeout(() => { document.querySelector('.results-section').scrollIntoView({ behavior: 'smooth', block: 'start' }); }, 100); trackEvent('sample_used', { sample: sampleId }); } // Clear All function clearAll() { document.getElementById('inputText').value = ''; document.getElementById('encodedOutput').textContent = ''; document.getElementById('decodedOutput').textContent = ''; hideSecurityAnalysis(); } // Swap Input/Output function swapInputOutput() { const input = document.getElementById('inputText'); const encoded = document.getElementById('encodedOutput').textContent; if (encoded) { input.value = encoded; processText(); } } // ========== UTILITY FUNCTIONS ========== // Escape RegExp function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\ рдПрдкреАрдЖрдИ рдХреА рдмрджрд▓реЗрдВ'; } else { statusEl.textContent = 'рдХреЛрдИ рдПрдкреАрдЖрдИ рдХреА рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ'; } } // ь▒ДэМЕ ыйФьЛЬьзА ь╢Фъ░А function addMessage(type, content) { const chatMessages = document.getElementById('chatMessages'); const messageDiv = document.createElement('div'); messageDiv.className = `message ${type}`; if (type === 'user') { messageDiv.innerHTML = `You: ${content}`; } else { messageDiv.innerHTML = `тЬи Gemini:
${content.replace(/\n/g, '
')}`; } chatMessages.appendChild(messageDiv); chatMessages.scrollTop = chatMessages.scrollHeight; } // GeminiьЧР ыйФьЛЬьзА ьаДьЖб async function sendToGemini() { const input = document.getElementById('geminiInput'); const message = input.value.trim(); if (!message) return; addMessage('user', message); input.value = ''; const loadingMsg = document.createElement('div'); loadingMsg.className = 'message assistant'; loadingMsg.innerHTML = 'тЬи Gemini:
Thinking...'; loadingMsg.id = 'loading-message'; document.getElementById('chatMessages').appendChild(loadingMsg); try { const currentText = document.getElementById('inputText').value.trim(); let contextInfo = ''; if (currentText) { const xssPatterns = detectXSSPatterns(currentText); contextInfo = `\n\nCurrent HTML content context: - Length: ${currentText.length} characters - Contains HTML tags: ${/<[^>]+>/.test(currentText)} - XSS patterns detected: ${xssPatterns.length} - Special characters: ${/[<>&"']/.test(currentText)}`; } const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=${aiModalState.apiKey}`, { method: 'рдкреЛрд╕реНрдЯ', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ contents: [{ parts: [{ text: `You are a web security expert helping a developer with HTML encoding/decoding and XSS prevention. Context: The user is working with an HTML encoder/decoder tool for web security purposes. They need help with proper character encoding, XSS prevention, and secure web development practices. Please provide accurate, security-focused advice about: - HTML entity encoding/decoding - XSS prevention techniques - Context-aware output encoding - Web security best practices - Character set handling ${contextInfo} User question: ${message}` }] }], generationConfig: { temperature: 0.7, maxOutputTokens: 1000 } }) }); const data = await response.json(); document.getElementById('loading-message').remove(); if (data.candidates && data.candidates[0] && data.candidates[0].content) { const reply = data.candidates[0].content.parts[0].text; addMessage('assistant', reply); } else { addMessage('assistant', 'Sorry, I could not generate a response. Please try again.'); } } catch (error) { document.getElementById('loading-message')?.remove(); if (error.message.includes('рдПрдкреАрдЖрдИ рдХреА')) { addMessage('error', 'Invalid API key. Please check your API key and try again.'); showAPIKeySetup(); } else { addMessage('error', 'Failed to connect to Gemini. Please check your internet connection and try again.'); } } } // ========== EVENT LISTENERS ========== document.addEventListener('рдбреАрдУрдПрдо рдХрдВрдЯреЗрдВрдЯ рд▓реЛрдбреЗрдб', function() { // AI ы▓ДэК╝ ьЭ┤ы▓дэК╕ document.getElementById('aiBtn').addEventListener('click', openAIModal); // ыкиыЛм ьЩ╕ы╢А эБ┤ыжньЛЬ ыЛлъ╕░ document.getElementById('aiModal').addEventListener('click', function(e) { if (e.target === this) { closeAIModal(); } }); // эВды│┤ыУЬ ьЭ┤ы▓дэК╕ document.addEventListener('keydown', function(e) { if (e.key === 'рдПрдВрдЯрд░') { const geminiInput = document.getElementById('geminiInput'); if (document.activeElement === geminiInput) { sendToGemini(); } } if (e.key === 'рдПрд╕реНрдХреЗрдк') { closeAIModal(); } }); // ь┤Иъ╕░эЩФ updateAPIKeyStatus(); updateCurrentYear(); updateToolCount(); // Load default sample useSample('html'); }); // ========== DYNAMIC TOOL COUNT ========== async function updateToolCount() { try { const response = await fetch('/api/tool-count.php'); const data = await response.json(); document.querySelectorAll('.dynamic-tools-count').forEach(el => { el.textContent = `${data.count}+ free online tools in 206 languages. No signup, no fees, just tools that work.`; }); document.querySelectorAll('.dynamic-count').forEach(el => { const prefix = el.getAttribute('data-text') || ''; const suffix = el.getAttribute('data-suffix') || ''; const icon = el.textContent.split(' ')[0] || ''; el.textContent = `${icon} ${prefix} ${data.count}+ ${suffix}`; }); } catch (error) { const fallbackCount = 333; document.querySelectorAll('.dynamic-tools-count').forEach(el => { el.textContent = `${fallbackCount}+ free online tools in 206 languages. No signup, no fees, just tools that work.`; }); document.querySelectorAll('.dynamic-count').forEach(el => { const prefix = el.getAttribute('data-text') || ''; const suffix = el.getAttribute('data-suffix') || ''; const icon = el.textContent.split(' ')[0] || ''; el.textContent = `${icon} ${prefix} ${fallbackCount}+ ${suffix}`; }); } } function updateCurrentYear() { const currentYear = new Date().getFullYear(); document.querySelectorAll('.current-year').forEach(el => { el.textContent = currentYear; }); } // ========== ANALYTICS ========== window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-XXXXXXXXX'); trackEvent('page_view', { tool: TOOL_CONFIG.name, category: TOOL_CONFIG.category });