Classificazione immagine con Cloudflare Worker

Oggi stiamo sperimentando una caratteristica AI utile che riguarda la classificazione delle immagini, cioè un modello AI creato appositamente per restituire una spiegazione scritta di un'immagine tramite l'URL dell'immagine. Per cosa può essere utile? Come prima applicazione, per sapere cosa c'è dentro un'immagine senza nemmeno aprirla; questo apre le porte a una serie di altre applicazioni come il riconoscimento di abusi o comportamenti inappropriati attraverso la scansione di un elenco di trascrizioni di testo da immagini. È anche utile per avere automaticamente una descrizione dell'immagine e salvarla in qualche database. Di cosa abbiamo bisogno?
1) Un account- [Account: an Account contains the personal information that is assigned to those who register and access with email and password] - Cloudflare (anche gratis)
2) A lavoratore nel tuo Account Cloudflare (anche gratis)
Nei lavoratori Cloudflare c'è già uno script preimpostato per generare trascrizioni di testo da immagini, ma gli script preimpostati non sono affatto sicuri da usare in un ambiente di produzione; in questo post vedremo come possiamo personalizzare lo script per renderlo più sicuro e utilizzarlo in un ambiente PHP.

Cosa vogliamo fare? L'obiettivo principale è quello di creare uno script che, a partire da un URL di immagine inviato con il metodo POST, restituisce la descrizione dell'immagine attraverso il modello di intelligenza artificiale chiamato "resnet-50". ResNet è una rete neurale convoluzionale molto profonda (CNN), composta da 152 strati, che con l'aiuto di una tecnica conosciuta come connessione skip ha spianato la strada per reti residue (rete residuale).

Cosa dobbiamo generare? Per la richiesta al nostro lavoratore useremo un file PHP; mentre per lo script da inserire nel nostro lavoratore useremo uno personalizzabile che è più sicuro di quello predefinito.

Scrittore di lavoro

esportazione predefinita (')
async fetch(richiesta, env) {
// Verificare se l'intestazione di autorizzazione contiene un token valido
const authHeader = request.headers.get("Authorization");
constretto valido Token = "YOUR_AUTHENTICATION_TOKEN";

Se (!authHeader) Traduzione: (')
// Se il token è mancante o non valido, restituire un errore 401 non autorizzato
ritorno nuovo Risposta(
JSON.stringify({ errore: "Token di autenticazione non valido o mancante." }),
{ stato: 401, intestazioni: { "Content-Type": "applicazione/json" } }
);
#

// Processo solo richieste POST valide
se (richiesta. metodo!= "POST") {
// Se il metodo non è POST, restituire un metodo 405 Non consentito errore
ritorno nuovo Response(" Metodo di richiesta non valido. Utilizzare POST con i dati richiesti.", (')
stato: 405,
headers: { "Content-Type": "text/plain" },
});
#

prova {}
// Convalida il tipo di contenuto della richiesta
contenuto Tipo = request.headers.get("Content-Type") || ";
se (!contentType.includes("applicazione/json")) {
// Se Content-Type non è JSON, restituisci un errore di 400 Bad Request
ritorno nuovo Risposta(
JSON.stringify({ errore: "Contenuto non valido-Tipo. Domanda prevista/json." }),
{ stato: 400, intestazioni: { "Content-Type": "applicazione/json" } }
);
#

// Parsare il corpo della richiesta
const body = attendere richiesta.text();
se (!body) {
// Se il corpo di richiesta è vuoto, restituisci un errore di 400 Bad Request
ritorno nuovo Risposta(
JSON.stringify({ errore: "Il corpo della richiesta è vuoto." }),
{ stato: 400, intestazioni: { "Content-Type": "applicazione/json" } }
);
#

const {} immagine Url } = JSON.parse(corpo);
se (!imageUrl) {
// Se l'URL dell'immagine non viene fornito nel corpo, restituisci un errore di 400 Bad Request
ritorno nuovo Risposta(
JSON.stringify({ errore: "Nessun URL immagine fornito." }),
{ stato: 400, intestazioni: { "Content-Type": "applicazione/json" } }
);
#

// Prelevare l'immagine dall'URL fornito
const imageResponse = attendere fetch (imageUrl);
const blob = attend imageResponse.arrayBuffer();

// Preparare gli input per il modello AI
const inputs = (')
immagine: [...new Uint8Array(blob)],
}

// Eseguire il modello AI e ottenere la risposta
const risposta = attendere env.AI.run("@cf/microsoft/resnet-50", ingressi);

// Ritorna la risposta del modello AI
ritorno nuovo Risposta(
JSON.stringify
{ headers: { "Content-Type": "applicazione/json" } }
);
} cattura (error) {
// Gestire eventuali errori inaspettati e restituire un errore di server interno 500
ritorno nuovo Risposta(
JSON.stringify({ errore: error.message }),
{ stato: 500, intestazioni: { "Content-Type": "applicazione/json" } }
);
#
♪
}

Cosa considerare quando personalizzare questo script? La costante valido Token deve contenere il token personalizzato per passare al momento della richiesta, inserire una password e poi ricordarlo di reinserirlo nel file PHP più in basso; se i token non sono uguali lo script restituirà un errore di 401 e salverà ulteriori lavori della CPU (questa costante può essere modificata ma deve essere lo stesso sul formato PHP); inoltre se la richiesta non viene da un metodo POST, lo script restituirà un errore di lavoro 405 anche usato per salvare Se tutto è corretto, allora possiamo andare avanti per inviare il file immagine all'intelligenza artificiale, che restituirà la sua descrizione in formato JSON pronto per essere catturato dallo script PHP che stiamo per costruire.

script PHP

Chiamiamo questo script imageai.php e salvarlo in una directory protetta

<
// URL del tuo Worker Cloudflare
$cloudflare Url = "https://yoururl.workers.dev/";
$authToken = "YOUR_AUTHENTICATION_TOKEN"; // Token di autenticazione per abbinare il Worker

Se ($_SERVER['REQUEST_METHOD'] == 'POST') {
$imageUrl = $_POST['imageUrl'];

se (vuoto($imageUrl)) (')
// Controllare se l'URL dell'immagine è fornito; in caso contrario, restituire un errore
echo json_encode(['error' => 'Image URL è mancante.');
uscita;
#

// Verifica se l'URL punta a un'immagine reale controllando l'intestazione Content-Type
$headers = get_headers($imageUrl, 1);
se (!isset($headers['Content-Type']) || strpos($headers['Content-Type'], 'image/') === false) {
// Se l'URL non indica un'immagine, restituire un errore
echo json_encode(['error' => 'L'URL non contiene un'immagine valida.');
uscita;
#

// Preparare il carico di pagamento JSON per la richiesta
$data = json_encode(['imageUrl' => $imageUrl]);

// Impostare le opzioni di richiesta, incluso l'intestazione di autorizzazione con il gettone
$options = [
«http» = >
'header' => "Content-Type: applicazione/json\r\n" .
"Autorizzazione: Bearer $authToken\r\n",
// Includere il token nell'intestazione di autorizzazione
'metodo' = > 'POST',
"contenuto" = > $data,
]
]

// Inviare la richiesta al lavoratore e ottenere la risposta
$context = stream_context_create($options);
$response = file_get_contents($cloudflare Url, falso, $context);

se ($response === FALSE) {
// Se il lavoratore è irraggiungibile, restituire un errore
echo json_encode(['error' => "Incapace di contattare il lavoratore".
uscita;
#

// Decodifica la risposta JSON dal Worker
$decodedResponse = json_decode($response, true);
se ($decodedResponse == null) {
// Se la risposta non è valida JSON, restituisci un errore
echo json_encode(['error' => "La risposta non è valida JSON".
uscita;
#

// Uscita della risposta decodificata
echo json_encode($decodedResponse);
#
>

Cosa considerare quando personalizzare questo script? La variabile $authToken contiene i token di autenticazione che abbiamo impostato nello script del lavoratore (precedentemente); il valore deve essere lo stesso in entrambi gli script. La variabile $cloudflare Ur contiene l'intero URL in cui viene salvato lo script del lavoratore (precedentemente salvato), di solito inizia con https:// e termina con i lavoratori. dev ma è anche possibile associare un subdominio personalizzato (a vostra preferenza). Lo script può essere chiamato da un
in html e deve passare l'url dell'immagine da un campo con id "imageUrl", ovviamente può essere chiamato anche via POST da un altro script in javascript (come si preferisce); lo script PHP a questo punto controlla che l'url passato via POST è lì e lo controlla per verificare se è in realtà un'immagine; una volta che i controlli hanno passato chiama lo script del lavoratore, controlla se il servizio è disponibile e raggiungibile, e restituisce il formato JSON che deve essere risposta.

Modulo HTML

Oh! DOCTYPE html
Traduzione:
<


 Image Classificazione
Traduzione:
corpo fisico
font-family: Arial, sans-serif;
margine: 20px;
imbottitura: 0;
sfondo-colore: #f4f4f9;
colore: #333;
#
formulario
larghezza massima: 400px;
margine: 0 auto;
imbottitura: 20px;
sfondo: #fff;
confine: 1px solido #ddd;
confine-radio: 5px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0,1);
#
input[type="text"] {
larghezza: 100%;
imbottitura: 10px;
margine: 10px 0;
confine: 1px solido #ccc;
confine-radio: 3px;
#
pulsante {}
larghezza: 100%;
imbottitura: 10px;
sfondo-colore: #007bff;
colore: bianco;
confine: nessuno;
confine-radio: 3px;
cursore: puntatore;
#
pulsante:hover {
sfondo-colore: #0056b3;
#
.descrizione {}
margin-top: 20px;
font-size: 16px;
testo-align: centro;
imbottitura: 10px;
confine-radio: 5px;
#
.descrizione.successo {
sfondo-colore: #d4edda;
colore: #155724;
#
.description.error (')
sfondo-colore: #f8d7da;
colore: #721c24;
#
< >
< >
*
Classificazione
<p> Inserisci l'URL di un'immagine per classificarla:

<form id="classificationForm" metodo="POST">
<input type="text" name="imageUrl" id="imageUrl" segnaposto="Enter image URL" richiesto>
<button type="submit"> Classifica immagine
< >
>
<div id="descriptionContainer" class="descrizione" style="display: noe;">

Traduzione:
document.getElementById('classificazioneForm').addEventListener('submit', funzione asincrona (event) {
event.preventDefault(); // Prevenire la presentazione del modulo e la ricarica della pagina

immagine const Url = document.getElementById('imageUrl').value;
descrizioneContainer = document.getElementById('descriptionContainer');

prova {}
// Invia l'URL dell'immagine tramite POST allo script PHP
risposta const = attendere fetch('imageai.php', {
metodo: 'POST',
intestazioni: (')
«Content-Type»: «applicazione/x-www-form-urlencoded»,
♪
corpo: 'imageUrl='+encodeURIComponent(imageUrl)
});

const risultato = attendere risposta.json();

se (response.ok) {
// Visualizza la descrizione ricevuta dallo script PHP
descrizioneContainer.textContent = 'Descrizione: '+result.response;
descrizioneContainer.className = 'successo della descrizione';
} altro {
// Visualizza un messaggio di errore
descrizioneContainer.textContent = 'Errore: '+result.error+' Si è verificato un errore inaspettato».
descrizioneContainer.className = 'errore di descrizione';
#

descrizioneContainer.style.display = 'blocco'; // Rendere visibile il contenitore
} cattura (error) {
// Gestire errori di rete o server
descrizioneContainer.textContent = Errore: '+error.message;
descrizioneContainer.className = 'errore di descrizione';
descrizioneContainer.style.display = 'blocco';
#
});
< >
< >
></pre><h2 class="wp-block-heading">Conclusioni</h2><p>Questo script può essere utilizzato attraverso un modulo HTML (come qui presentato) o anche attraverso uno script javascript che si occuperà di inviare la richiesta POST, ma può anche essere utilizzato interamente attraverso PHP forse assicurandosi che il risultato sia salvato direttamente a un database da essere restituito in un secondo momento (quando richiesto). L'applicazione può avere funzioni diverse a seconda della necessità; ricorda che è sempre meglio fare richieste meno complicate ai lavoratori perché, anche se hanno limiti elevati anche con un account gratuito, hanno ancora limiti. È buona pratica salvare le informazioni ricevute in un database, e per la stessa url (o la stessa immagine) e recuperare le informazioni attraverso il database (caching) per non intasare il lavoratore con troppe richieste. I controlli implementati (controllo di token e host) sono utilizzati con precisione per non inviare troppe richieste che potrebbero raggiungere i limiti del lavoratore. Inoltre, in Cloudflare, è anche possibile impostare il firewall di applicazione (WAF) per garantire che le richieste a quel lavoratore devono provenire dall'host specificato (in modo da non aumentare il contatore limiti del lavoratore). Ricorda che per una migliore prestazione il modello resnet-50 si aspetta la dimensione dell'immagine 224×224 pixel, quindi si consiglia di ridimensionare l'immagine a quelle dimensioni prima di inviarlo.</p><div class="printfriendly pf-button pf-button-content pf-alignright">
                    <a href="#" rel="nofollow" onclick="window.print(); return false;" title="Printer Friendly, PDF & Email">
                    <img decoding="async" class="pf-button-img" src="https://cdn.printfriendly.com/buttons/printfriendly-pdf-button-nobg.png" alt="Print Friendly, PDF & Email" style="width: 112px;height: 24px;"  />
                    </a>
                </div></div>
		
		
			</div><!-- .entry-content .clear -->
</div>

	
</article><!-- #post-## -->

<nav class="navigation post-navigation" aria-label="Posts">
				<div class="nav-links"><div class="nav-previous"><a title="Frontline images" href="https://blog.myetv.tv/2025/04/04/frontline-images/" rel="prev"><span class="ast-left-arrow" aria-hidden="true">←</span> Previous Post</a></div><div class="nav-next"><a title="MYCLOUD upload and security update" href="https://blog.myetv.tv/2025/04/15/mycloud-upload-and-security-update/" rel="next">Next Post <span class="ast-right-arrow" aria-hidden="true">→</span></a></div></div>
		</nav>			</main><!-- #main -->
			
		
	</div><!-- #primary -->


	<div class="widget-area secondary" id="secondary" itemtype="https://schema.org/WPSideBar" itemscope="itemscope">
	<div class="sidebar-main" >
		
		<aside id="shortcode-widget-2" class="widget shortcode_widget"><h2 class="widget-title">Language of this blog</h2>						<div class="textwidget"><div class="freedomtranslate-selector-wrapper"><form method="get" id="freedomtranslate-form"><select name="freedomtranslate_lang" onchange="showTranslationLoader(); this.form.submit();"><option value="ar" >Arabic</option><option value="az" >Azerbaijani</option><option value="zh" >Chinese</option><option value="cs" >Czech</option><option value="da" >Danish</option><option value="nl" >Dutch</option><option value="en" >English</option><option value="fi" >Finnish</option><option value="fr" >Français</option><option value="de" >Deutsch</option><option value="el" >Greek</option><option value="he" >Hebrew</option><option value="hi" >Hindi</option><option value="hu" >Hungarian</option><option value="id" >Indonesian</option><option value="ga" >Irish</option><option value="it" selected>Italiano</option><option value="ja" >Japanese</option><option value="ko" >Korean</option><option value="no" >Norwegian</option><option value="pl" >Polish</option><option value="pt" >Português</option><option value="ro" >Romanian</option><option value="ru" >Русский</option><option value="sk" >Slovak</option><option value="es" >Español</option><option value="sv" >Swedish</option><option value="tr" >Turkish</option><option value="uk" >Ukrainian</option><option value="vi" >Vietnamese</option></select></form><span class="freedomtranslate-mode-indicator" title="Automatic: browser-detected default">🌐</span></div>
    <div id="freedomtranslate-loader" style="display: none;">
        <div class="freedomtranslate-loader-content">
            <div class="freedomtranslate-spinner"></div>
            <p>Translation loading...</p>
        </div>
    </div><style>
    .freedomtranslate-selector-wrapper { display: inline-flex; align-items: center; gap: 8px; }
    .freedomtranslate-selector-wrapper form { margin: 0; display: inline; }
    .freedomtranslate-selector-wrapper select { padding: 5px 10px; border-radius: 4px; }
    .freedomtranslate-mode-indicator { font-size: 18px; cursor: help; }
    
    /* Loading overlay styles */
    #freedomtranslate-loader {
        position: fixed;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background: rgba(0, 0, 0, 0.7);
        z-index: 999999;
        display: flex;
        align-items: center;
        justify-content: center;
    }
    
    .freedomtranslate-loader-content {
        background: white;
        padding: 30px 50px;
        border-radius: 10px;
        text-align: center;
        box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
    }
    
    .freedomtranslate-spinner {
        border: 4px solid #f3f3f3;
        border-top: 4px solid #3498db;
        border-radius: 50%;
        width: 50px;
        height: 50px;
        animation: freedomtranslate-spin 1s linear infinite;
        margin: 0 auto 15px;
    }
    
    @keyframes freedomtranslate-spin {
        0% { transform: rotate(0deg); }
        100% { transform: rotate(360deg); }
    }
    
    .freedomtranslate-loader-content p {
        margin: 0;
        font-size: 16px;
        color: #333;
        font-weight: 500;
    }
    </style><script>
    function showTranslationLoader() {
        var loader = document.getElementById("freedomtranslate-loader");
        if (loader) {
            loader.style.display = "flex";
        }
    }
    
    // Show loader if page is reloading with language parameter
    if (window.location.search.indexOf("freedomtranslate_lang=") !== -1) {
        window.addEventListener("DOMContentLoaded", function() {
            var loader = document.getElementById("freedomtranslate-loader");
            if (loader) {
                loader.style.display = "flex";
            }
        });
    }
    </script></div>
			</aside><aside id="search-2" class="widget widget_search"><h2 class="widget-title">Search Engine</h2><form role="search" method="get" class="search-form" action="https://blog.myetv.tv/">
	<label for="search-field">
		<span class="screen-reader-text">Search for:</span>
		<input type="search" id="search-field" class="search-field"   placeholder="Search..." value="" name="s" tabindex="-1">
			</label>
			<input type="submit" class="search-submit" value="Search">
	</form>
</aside><aside id="categories-7" class="widget widget_categories"><h2 class="widget-title">Talk About</h2><form action="https://blog.myetv.tv" method="get"><label class="screen-reader-text" for="cat">Talk About</label><select  name='cat' id='cat' class='postform'>
	<option value='-1'>Select Category</option>
	<option class="level-0" value="104">Advertising</option>
	<option class="level-0" value="15">Coding</option>
	<option class="level-0" value="14">Design</option>
	<option class="level-0" value="1822">For Fun</option>
	<option class="level-0" value="1">From the Developers</option>
	<option class="level-0" value="12">General Arguments</option>
	<option class="level-0" value="13">Help and Documents</option>
	<option class="level-1" value="1671">   Digital Credits</option>
	<option class="level-1" value="1672">   My Cloud</option>
	<option class="level-1" value="1585">   My Extensions</option>
	<option class="level-1" value="1670">   Networks of Contents</option>
	<option class="level-0" value="5">Reviews and Tutorials</option>
	<option class="level-0" value="2">Supports</option>
	<option class="level-1" value="1652">   Native Apps</option>
	<option class="level-0" value="6">Updates</option>
	<option class="level-0" value="4">What’s new on MYETV</option>
	<option class="level-0" value="3">World at Work</option>
	<option class="level-1" value="1648">   Social Area</option>
	<option class="level-1" value="1512">   Translators Area</option>
	<option class="level-1" value="1487">   Work with us</option>
</select>
</form><script>
( ( dropdownId ) => {
	const dropdown = document.getElementById( dropdownId );
	function onSelectChange() {
		setTimeout( () => {
			if ( 'escape' === dropdown.dataset.lastkey ) {
				return;
			}
			if ( dropdown.value && parseInt( dropdown.value ) > 0 && dropdown instanceof HTMLSelectElement ) {
				dropdown.parentElement.submit();
			}
		}, 250 );
	}
	function onKeyUp( event ) {
		if ( 'Escape' === event.key ) {
			dropdown.dataset.lastkey = 'escape';
		} else {
			delete dropdown.dataset.lastkey;
		}
	}
	function onClick() {
		delete dropdown.dataset.lastkey;
	}
	dropdown.addEventListener( 'keyup', onKeyUp );
	dropdown.addEventListener( 'click', onClick );
	dropdown.addEventListener( 'change', onSelectChange );
})( "cat" );

//# sourceURL=WP_Widget_Categories%3A%3Awidget
</script>
</aside><aside id="custom_html-2" class="widget_text widget widget_custom_html"><div class="textwidget custom-html-widget"><div align="center" style="width:100%;">
	<iframe style="border:none;margin:0px 0px 0px 0px;padding:0px 0px 0px 0px;" id="MYETVBLOG48734567536428" name="MYETVBLOG48734567536428" class="MYETVBLOG48734567536428" src="https://store.myetv.tv/myetvad-300x250/" frameborder="0" scrolling="no" width="300" height="250" allowtransparency="true" border="0"></iframe>
</div></div></aside><aside id="calendar-5" class="widget-container widget_archive widget widget_calendar"><div id="calendar_wrap" class="calendar_wrap"><table id="wp-calendar" class="wp-calendar-table">
	<caption>April 2025</caption>
	<thead>
	<tr>
		<th scope="col" aria-label="Monday">M</th>
		<th scope="col" aria-label="Tuesday">T</th>
		<th scope="col" aria-label="Wednesday">W</th>
		<th scope="col" aria-label="Thursday">T</th>
		<th scope="col" aria-label="Friday">F</th>
		<th scope="col" aria-label="Saturday">S</th>
		<th scope="col" aria-label="Sunday">S</th>
	</tr>
	</thead>
	<tbody>
	<tr>
		<td colspan="1" class="pad"> </td><td>1</td><td><a href="https://blog.myetv.tv/2025/04/02/" aria-label="Posts published on April 2, 2025">2</a></td><td>3</td><td><a href="https://blog.myetv.tv/2025/04/04/" aria-label="Posts published on April 4, 2025">4</a></td><td>5</td><td>6</td>
	</tr>
	<tr>
		<td>7</td><td>8</td><td><a href="https://blog.myetv.tv/2025/04/09/" aria-label="Posts published on April 9, 2025">9</a></td><td>10</td><td>11</td><td>12</td><td>13</td>
	</tr>
	<tr>
		<td>14</td><td><a href="https://blog.myetv.tv/2025/04/15/" aria-label="Posts published on April 15, 2025">15</a></td><td>16</td><td>17</td><td>18</td><td>19</td><td>20</td>
	</tr>
	<tr>
		<td>21</td><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td><td>27</td>
	</tr>
	<tr>
		<td><a href="https://blog.myetv.tv/2025/04/28/" aria-label="Posts published on April 28, 2025">28</a></td><td>29</td><td>30</td>
		<td class="pad" colspan="4"> </td>
	</tr>
	</tbody>
	</table><nav aria-label="Previous and next months" class="wp-calendar-nav">
		<span class="wp-calendar-nav-prev"><a href="https://blog.myetv.tv/2025/03/">« Mar</a></span>
		<span class="pad"> </span>
		<span class="wp-calendar-nav-next"><a href="https://blog.myetv.tv/2025/05/">May »</a></span>
	</nav></div></aside><aside id="astra-widget-social-profiles-2" class="widget astra-widget-social-profiles">
			<div class="astra-widget-social-profiles-inner clearfix inline circle-outline icon-official-color">
									<ul>
													<li>
								<a href="https://www.facebook.com/myetv.tv/" target="_blank" rel="noopener nofollow" aria-label="facebook-square">
										<span class="ast-widget-icon facebook-square">
																							<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" width="15" height="15"><path d="M448 80v352c0 26.5-21.5 48-48 48h-85.3V302.8h60.6l8.7-67.6h-69.3V192c0-19.6 5.4-32.9 33.5-32.9H384V98.7c-6.2-.8-27.4-2.7-52.2-2.7-51.6 0-87 31.5-87 89.4v49.9H184v67.6h60.9V480H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48z"></path></svg>
																					</span>
																	</a>
							</li>
													<li>
								<a href="https://x.com/myetvtv/" target="_blank" rel="noopener nofollow" aria-label="hashtag">
										<span class="ast-widget-icon hashtag">
																							<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" width="15" height="15"><path d="M440.667 182.109l7.143-40c1.313-7.355-4.342-14.109-11.813-14.109h-74.81l14.623-81.891C377.123 38.754 371.468 32 363.997 32h-40.632a12 12 0 0 0-11.813 9.891L296.175 128H197.54l14.623-81.891C213.477 38.754 207.822 32 200.35 32h-40.632a12 12 0 0 0-11.813 9.891L132.528 128H53.432a12 12 0 0 0-11.813 9.891l-7.143 40C33.163 185.246 38.818 192 46.289 192h74.81L98.242 320H19.146a12 12 0 0 0-11.813 9.891l-7.143 40C-1.123 377.246 4.532 384 12.003 384h74.81L72.19 465.891C70.877 473.246 76.532 480 84.003 480h40.632a12 12 0 0 0 11.813-9.891L151.826 384h98.634l-14.623 81.891C234.523 473.246 240.178 480 247.65 480h40.632a12 12 0 0 0 11.813-9.891L315.472 384h79.096a12 12 0 0 0 11.813-9.891l7.143-40c1.313-7.355-4.342-14.109-11.813-14.109h-74.81l22.857-128h79.096a12 12 0 0 0 11.813-9.891zM261.889 320h-98.634l22.857-128h98.634l-22.857 128z"></path></svg>
																					</span>
																	</a>
							</li>
													<li>
								<a href="https://www.youtube.com/myetvtv" target="_blank" rel="noopener nofollow" aria-label="youtube">
										<span class="ast-widget-icon youtube">
																							<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" width="15" height="15"><path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"></path></svg>
																					</span>
																	</a>
							</li>
													<li>
								<a href="https://www.linkedin.com/company/myetv" target="_blank" rel="noopener nofollow" aria-label="linkedin">
										<span class="ast-widget-icon linkedin">
																							<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" width="15" height="15"><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"></path></svg>
																					</span>
																	</a>
							</li>
													<li>
								<a href="https://www.tumblr.com/myetv" target="_blank" rel="noopener nofollow" aria-label="tumblr-square">
										<span class="ast-widget-icon tumblr-square">
																							<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" width="15" height="15"><path d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-82.3 364.2c-8.5 9.1-31.2 19.8-60.9 19.8-75.5 0-91.9-55.5-91.9-87.9v-90h-29.7c-3.4 0-6.2-2.8-6.2-6.2v-42.5c0-4.5 2.8-8.5 7.1-10 38.8-13.7 50.9-47.5 52.7-73.2.5-6.9 4.1-10.2 10-10.2h44.3c3.4 0 6.2 2.8 6.2 6.2v72h51.9c3.4 0 6.2 2.8 6.2 6.2v51.1c0 3.4-2.8 6.2-6.2 6.2h-52.1V321c0 21.4 14.8 33.5 42.5 22.4 3-1.2 5.6-2 8-1.4 2.2.5 3.6 2.1 4.6 4.9l13.8 40.2c1 3.2 2 6.7-.3 9.1z"></path></svg>
																					</span>
																	</a>
							</li>
													<li>
								<a href="https://www.pinterest.it/myetvtv/" target="_blank" rel="noopener nofollow" aria-label="pinterest">
										<span class="ast-widget-icon pinterest">
																							<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512" width="15" height="15"><path d="M496 256c0 137-111 248-248 248-25.6 0-50.2-3.9-73.4-11.1 10.1-16.5 25.2-43.5 30.8-65 3-11.6 15.4-59 15.4-59 8.1 15.4 31.7 28.5 56.8 28.5 74.8 0 128.7-68.8 128.7-154.3 0-81.9-66.9-143.2-152.9-143.2-107 0-163.9 71.8-163.9 150.1 0 36.4 19.4 81.7 50.3 96.1 4.7 2.2 7.2 1.2 8.3-3.3.8-3.4 5-20.3 6.9-28.1.6-2.5.3-4.7-1.7-7.1-10.1-12.5-18.3-35.3-18.3-56.6 0-54.7 41.4-107.6 112-107.6 60.9 0 103.6 41.5 103.6 100.9 0 67.1-33.9 113.6-78 113.6-24.3 0-42.6-20.1-36.7-44.8 7-29.5 20.5-61.3 20.5-82.6 0-19-10.2-34.9-31.4-34.9-24.9 0-44.9 25.7-44.9 60.2 0 22 7.4 36.8 7.4 36.8s-24.5 103.8-29 123.2c-5 21.4-3 51.6-.9 71.2C65.4 450.9 0 361.1 0 256 0 119 111 8 248 8s248 111 248 248z"></path></svg>
																					</span>
																	</a>
							</li>
													<li>
								<a href="https://web.telegram.org/k/#@MYETV" target="_blank" rel="noopener nofollow" aria-label="telegram">
										<span class="ast-widget-icon telegram">
																							<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512" width="15" height="15"><path d="M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm121.8 169.9l-40.7 191.8c-3 13.6-11.1 16.9-22.4 10.5l-62-45.7-29.9 28.8c-3.3 3.3-6.1 6.1-12.5 6.1l4.4-63.1 114.9-103.8c5-4.4-1.1-6.9-7.7-2.5l-142 89.4-61.2-19.1c-13.3-4.2-13.6-13.3 2.8-19.7l239.1-92.2c11.1-4 20.8 2.7 17.2 19.5z"></path></svg>
																					</span>
																	</a>
							</li>
											</ul>
							</div>

			</aside>
	</div><!-- .sidebar-main -->
</div><!-- #secondary -->


	</div> <!-- ast-container -->
	</div><!-- #content -->
<footer
class="site-footer" id="colophon" itemtype="https://schema.org/WPFooter" itemscope="itemscope" itemid="#colophon">
			<div class="site-primary-footer-wrap ast-builder-grid-row-container site-footer-focus-item ast-builder-grid-row-3-equal ast-builder-grid-row-tablet-3-equal ast-builder-grid-row-mobile-full ast-footer-row-stack ast-footer-row-tablet-stack ast-footer-row-mobile-stack" data-section="section-primary-footer-builder">
	<div class="ast-builder-grid-row-container-inner">
					<div class="ast-builder-footer-grid-columns site-primary-footer-inner-wrap ast-builder-grid-row">
											<div class="site-footer-primary-section-1 site-footer-section site-footer-section-1">
							<aside
		class="footer-widget-area widget-area site-footer-focus-item" data-section="sidebar-widgets-footer-widget-2" aria-label="Footer Widget 2" role="region"		>
			<div class="footer-widget-area-inner site-info-inner"><section id="shortcode-widget-4" class="widget shortcode_widget">						<div class="textwidget"><div class="freedomtranslate-selector-wrapper"><form method="get" id="freedomtranslate-form"><select name="freedomtranslate_lang" onchange="showTranslationLoader(); this.form.submit();"><option value="ar" >Arabic</option><option value="az" >Azerbaijani</option><option value="zh" >Chinese</option><option value="cs" >Czech</option><option value="da" >Danish</option><option value="nl" >Dutch</option><option value="en" >English</option><option value="fi" >Finnish</option><option value="fr" >Français</option><option value="de" >Deutsch</option><option value="el" >Greek</option><option value="he" >Hebrew</option><option value="hi" >Hindi</option><option value="hu" >Hungarian</option><option value="id" >Indonesian</option><option value="ga" >Irish</option><option value="it" selected>Italiano</option><option value="ja" >Japanese</option><option value="ko" >Korean</option><option value="no" >Norwegian</option><option value="pl" >Polish</option><option value="pt" >Português</option><option value="ro" >Romanian</option><option value="ru" >Русский</option><option value="sk" >Slovak</option><option value="es" >Español</option><option value="sv" >Swedish</option><option value="tr" >Turkish</option><option value="uk" >Ukrainian</option><option value="vi" >Vietnamese</option></select></form><span class="freedomtranslate-mode-indicator" title="Automatic: browser-detected default">🌐</span></div>
    <div id="freedomtranslate-loader" style="display: none;">
        <div class="freedomtranslate-loader-content">
            <div class="freedomtranslate-spinner"></div>
            <p>Translation loading...</p>
        </div>
    </div><style>
    .freedomtranslate-selector-wrapper { display: inline-flex; align-items: center; gap: 8px; }
    .freedomtranslate-selector-wrapper form { margin: 0; display: inline; }
    .freedomtranslate-selector-wrapper select { padding: 5px 10px; border-radius: 4px; }
    .freedomtranslate-mode-indicator { font-size: 18px; cursor: help; }
    
    /* Loading overlay styles */
    #freedomtranslate-loader {
        position: fixed;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background: rgba(0, 0, 0, 0.7);
        z-index: 999999;
        display: flex;
        align-items: center;
        justify-content: center;
    }
    
    .freedomtranslate-loader-content {
        background: white;
        padding: 30px 50px;
        border-radius: 10px;
        text-align: center;
        box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
    }
    
    .freedomtranslate-spinner {
        border: 4px solid #f3f3f3;
        border-top: 4px solid #3498db;
        border-radius: 50%;
        width: 50px;
        height: 50px;
        animation: freedomtranslate-spin 1s linear infinite;
        margin: 0 auto 15px;
    }
    
    @keyframes freedomtranslate-spin {
        0% { transform: rotate(0deg); }
        100% { transform: rotate(360deg); }
    }
    
    .freedomtranslate-loader-content p {
        margin: 0;
        font-size: 16px;
        color: #333;
        font-weight: 500;
    }
    </style><script>
    function showTranslationLoader() {
        var loader = document.getElementById("freedomtranslate-loader");
        if (loader) {
            loader.style.display = "flex";
        }
    }
    
    // Show loader if page is reloading with language parameter
    if (window.location.search.indexOf("freedomtranslate_lang=") !== -1) {
        window.addEventListener("DOMContentLoaded", function() {
            var loader = document.getElementById("freedomtranslate-loader");
            if (loader) {
                loader.style.display = "flex";
            }
        });
    }
    </script></div>
			</section></div>		</aside>
						</div>
											<div class="site-footer-primary-section-2 site-footer-section site-footer-section-2">
								<div class="ast-builder-layout-element ast-flex site-footer-focus-item" data-section="section-fb-social-icons-1">
				<div class="ast-footer-social-1-wrap ast-footer-social-wrap"><div class="footer-social-inner-wrap element-social-inner-wrap social-show-label-false ast-social-color-type-custom ast-social-stack-none ast-social-element-style-filled"><a href="https://www.facebook.com/myetv.tv" aria-label="Facebook" target="_blank" rel="noopener noreferrer" style="--color: #557dbc; --background-color: transparent;" class="ast-builder-social-element ast-inline-flex ast-facebook footer-social-item"><span aria-hidden="true" class="ahfb-svg-iconset ast-inline-flex svg-baseline"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'><path d='M400 32H48A48 48 0 0 0 0 80v352a48 48 0 0 0 48 48h137.25V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.27c-30.81 0-40.42 19.12-40.42 38.73V256h68.78l-11 71.69h-57.78V480H400a48 48 0 0 0 48-48V80a48 48 0 0 0-48-48z'></path></svg></span></a><a href="https://twitter.com/myetvtv" aria-label="Twitter" target="_blank" rel="noopener noreferrer" style="--color: #7acdee; --background-color: transparent;" class="ast-builder-social-element ast-inline-flex ast-twitter footer-social-item"><span aria-hidden="true" class="ahfb-svg-iconset ast-inline-flex svg-baseline"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M18.244 2.25H21.552L14.325 10.51L22.827 21.75H16.17L10.956 14.933L4.99 21.75H1.68L9.41 12.915L1.254 2.25H8.08L12.793 8.481L18.244 2.25ZM17.083 19.77H18.916L7.084 4.126H5.117L17.083 19.77Z'/></svg></span></a><a href="https://www.linkedin.com/company/myetv/" aria-label="Linkedin" target="_blank" rel="noopener noreferrer" style="--color: #1c86c6; --background-color: transparent;" class="ast-builder-social-element ast-inline-flex ast-linkedin footer-social-item"><span aria-hidden="true" class="ahfb-svg-iconset ast-inline-flex svg-baseline"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'><path d='M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z'></path></svg></span></a><a href="https://web.telegram.org/k/#@MYETV" aria-label="Telegram" target="_blank" rel="noopener noreferrer" style="--color: #229CCE; --background-color: transparent;" class="ast-builder-social-element ast-inline-flex ast-telegram footer-social-item"><span aria-hidden="true" class="ahfb-svg-iconset ast-inline-flex svg-baseline"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 496 512'><path d='M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm121.8 169.9l-40.7 191.8c-3 13.6-11.1 16.9-22.4 10.5l-62-45.7-29.9 28.8c-3.3 3.3-6.1 6.1-12.5 6.1l4.4-63.1 114.9-103.8c5-4.4-1.1-6.9-7.7-2.5l-142 89.4-61.2-19.1c-13.3-4.2-13.6-13.3 2.8-19.7l239.1-92.2c11.1-4 20.8 2.7 17.2 19.5z'></path></svg></span></a><a href="https://www.youtube.com/myetvtv" aria-label="YouTube" target="_blank" rel="noopener noreferrer" style="--color: #e96651; --background-color: transparent;" class="ast-builder-social-element ast-inline-flex ast-youtube footer-social-item"><span aria-hidden="true" class="ahfb-svg-iconset ast-inline-flex svg-baseline"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 576 512'><path d='M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z'></path></svg></span></a></div></div>			</div>
						</div>
											<div class="site-footer-primary-section-3 site-footer-section site-footer-section-3">
							<aside
		class="footer-widget-area widget-area site-footer-focus-item" data-section="sidebar-widgets-footer-widget-4" aria-label="Footer Widget 4" role="region"		>
			<div class="footer-widget-area-inner site-info-inner"><section id="custom_html-7" class="widget_text widget widget_custom_html"><div class="textwidget custom-html-widget"><a href="https://tree-nation.com/profile/impact/my-incorporate#co2" target="_blank" style="position:relative;cursor:pointer;display:block;z-index:999;">
<img src="https://tree-nation.com/images/tracking/label-co2-website-white-en.png" style="width:157px;height:auto;">
</a>
<script src="https://tree-nation.com/js/track.js"></script>
<script>treenation_track("6158cd8659ff2");</script></div></section></div>		</aside>
						</div>
										</div>
			</div>

</div>
<div class="site-below-footer-wrap ast-builder-grid-row-container site-footer-focus-item ast-builder-grid-row-full ast-builder-grid-row-tablet-full ast-builder-grid-row-mobile-full ast-footer-row-stack ast-footer-row-tablet-stack ast-footer-row-mobile-stack" data-section="section-below-footer-builder">
	<div class="ast-builder-grid-row-container-inner">
					<div class="ast-builder-footer-grid-columns site-below-footer-inner-wrap ast-builder-grid-row">
											<div class="site-footer-below-section-1 site-footer-section site-footer-section-1">
								<div class="ast-builder-layout-element ast-flex site-footer-focus-item ast-footer-copyright" data-section="section-footer-builder">
				<div class="ast-footer-copyright"><p><span style="color: #b8860b">Copyright © 2021 <span class="ast-footer-site-title"><strong>MYETV</strong> Blog</span> | Powered by <a style="color: #b8860b" href="https://www.myetv.tv/" target="_blank" rel="noopener">https://www.myetv.tv</a></span></p>
</div>			</div>
						</div>
										</div>
			</div>

</div>
	</footer><!-- #colophon -->
	</div><!-- #page -->
<script type="speculationrules">
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/astra-child/*","/wp-content/themes/astra/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>

<!-- Cloudflare Web Analytics --><script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "e86cb90cdef94923b7bd0035e63ef172"}'></script><!-- End Cloudflare Web Analytics -->
<div id="bsf_rt_progress_bar_container" class="progress-container-bottom">
				 <div class="progress-bar" id="bsf_rt_progress_bar"></div>
				 </div>     <script type="text/javascript" id="pf_script">
                      var pfHeaderImgUrl = '';
          var pfHeaderTagline = '';
          var pfdisableClickToDel = '1';
          var pfImagesSize = 'full-size';
          var pfImageDisplayStyle = 'right';
          var pfEncodeImages = '0';
          var pfShowHiddenContent  = '0';
          var pfDisableEmail = '0';
          var pfDisablePDF = '0';
          var pfDisablePrint = '0';

            
          var pfPlatform = 'WordPress';

        (function($){
            $(document).ready(function(){
                if($('.pf-button-content').length === 0){
                    $('style#pf-excerpt-styles').remove();
                }
            });
        })(jQuery);
        </script>
      <script defer src='https://cdn.printfriendly.com/printfriendly.js'></script>
            
            			<script>
			/(trident|msie)/i.test(navigator.userAgent)&&document.getElementById&&window.addEventListener&&window.addEventListener("hashchange",function(){var t,e=location.hash.substring(1);/^[A-z0-9_-]+$/.test(e)&&(t=document.getElementById(e))&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())},!1);
			</script>
			<script id="astra-theme-js-js-extra">
var astra = {"break_point":"768","isRtl":"","is_scroll_to_id":"","is_scroll_to_top":"","is_header_footer_builder_active":"1","responsive_cart_click":"flyout","is_dark_palette":""};
//# sourceURL=astra-theme-js-js-extra
</script>
<script src="https://blog.myetv.tv/wp-content/themes/astra/assets/js/minified/frontend.min.js?ver=4.11.16" id="astra-theme-js-js"></script>
<script type="module" src="https://blog.myetv.tv/wp-content/plugins/all-in-one-seo-pack/dist/Lite/assets/table-of-contents.95d0dfce.js?ver=4.9.1.1" id="aioseo/js/src/vue/standalone/blocks/table-of-contents/frontend.js-js"></script>
<script src="https://blog.myetv.tv/wp-content/plugins/anchor-block/public/anchor-block.js?ver=1681062791" id="anchor-block-public-scripts-js"></script>
<script src="https://blog.myetv.tv/wp-content/plugins/halloween-panda/assets/js/snowfall.jquery.min.js?ver=4b55abb3c310c6cc05e7cfc6ef533ca5" id="pix-hp-wp-script-fall-js"></script>
<script src="https://blog.myetv.tv/wp-content/plugins/halloween-panda/assets/js/js.cookie.min.js?ver=4b55abb3c310c6cc05e7cfc6ef533ca5" id="pix-hp-wp-script-cookies-js"></script>
<script src="https://blog.myetv.tv/wp-content/plugins/halloween-panda/assets/js/hp-frontend.min.js?ver=4b55abb3c310c6cc05e7cfc6ef533ca5" id="pix-hp-wp-script-js"></script>
<script type="module" src="https://blog.myetv.tv/wp-content/plugins/wp-cloudflare-page-cache/assets/js/instantpage.min.js?ver=5.2.0" id="swcfpc_instantpage-js"></script>
<script id="swcfpc_auto_prefetch_url-js-before">
			function swcfpc_wildcard_check(str, rule) {
			let escapeRegex = (str) => str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
			return new RegExp("^" + rule.split("*").map(escapeRegex).join(".*") + "$").test(str);
			}

			function swcfpc_can_url_be_prefetched(href) {

			if( href.length == 0 )
			return false;

			if( href.startsWith("mailto:") )
			return false;

			if( href.startsWith("https://") )
			href = href.split("https://"+location.host)[1];
			else if( href.startsWith("http://") )
			href = href.split("http://"+location.host)[1];

			for( let i=0; i < swcfpc_prefetch_urls_to_exclude.length; i++) {

			if( swcfpc_wildcard_check(href, swcfpc_prefetch_urls_to_exclude[i]) )
			return false;

			}

			return true;

			}

			let swcfpc_prefetch_urls_to_exclude = '["\/*ao_noptirocket*","\/*jetpack=comms*","\/*kinsta-monitor*","*ao_speedup_cachebuster*","\/*removed_item*","\/my-account*","\/wc-api\/*","\/edd-api\/*","\/wp-json*"]';
			swcfpc_prefetch_urls_to_exclude = (swcfpc_prefetch_urls_to_exclude) ? JSON.parse(swcfpc_prefetch_urls_to_exclude) : [];

			
//# sourceURL=swcfpc_auto_prefetch_url-js-before
</script>
<script src="https://blog.myetv.tv/wp-content/plugins/social-icons-widget-by-wpzoom/assets/js/social-icons-widget-frontend.js?ver=1764978202" id="zoom-social-icons-widget-frontend-js"></script>
<script src="https://blog.myetv.tv/wp-content/plugins/enlighter/cache/enlighterjs.min.js?ver=o5ECoglU4KARGjG" id="enlighterjs-js"></script>
<script id="enlighterjs-js-after">
!function(e,n){if("undefined"!=typeof EnlighterJS){var o={"selectors":{"block":"pre.EnlighterJSRAW","inline":"code.EnlighterJSRAW"},"options":{"indent":2,"ampersandCleanup":true,"linehover":true,"rawcodeDbclick":false,"textOverflow":"break","linenumbers":true,"theme":"enlighter","language":"generic","retainCssClasses":false,"collapse":false,"toolbarOuter":"","toolbarTop":"{BTN_RAW}{BTN_COPY}{BTN_WINDOW}{BTN_WEBSITE}","toolbarBottom":""}};(e.EnlighterJSINIT=function(){EnlighterJS.init(o.selectors.block,o.selectors.inline,o.options)})()}else{(n&&(n.error||n.log)||function(){})("Error: EnlighterJS resources not loaded yet!")}}(window,console);
//# sourceURL=enlighterjs-js-after
</script>
<script src="https://blog.myetv.tv/wp-content/plugins/wporg-glossary/includes/../js/popper.min.js?ver=1.3.2" id="popper-js"></script>
<script src="https://blog.myetv.tv/wp-content/plugins/wporg-glossary/includes/../js/tippy.min.js?ver=1.3.2" id="tippy-js"></script>
<script src="https://blog.myetv.tv/wp-includes/js/hoverintent-js.min.js?ver=2.2.1" id="hoverintent-js-js"></script>
<script src="https://blog.myetv.tv/wp-content/plugins/wporg-glossary/includes/../js/glossary-hovercards.js?ver=20200519" id="glossary-hovercards-js"></script>
<script id="bsfrt_frontend-js-extra">
var myObj = {"option":""};
//# sourceURL=bsfrt_frontend-js-extra
</script>
<script src="https://blog.myetv.tv/wp-content/plugins/read-meter/assets/js/bsf-rt-frontend.min.js?ver=1.0.11" id="bsfrt_frontend-js"></script>
<script id="wp-emoji-settings" type="application/json">
{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://blog.myetv.tv/wp-includes/js/wp-emoji-release.min.js?ver=4b55abb3c310c6cc05e7cfc6ef533ca5"}}
</script>
<script type="module">
/*! This file is auto-generated */
const a=JSON.parse(document.getElementById("wp-emoji-settings").textContent),o=(window._wpemojiSettings=a,"wpEmojiSettingsSupports"),s=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const a=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===a[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,a){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!a(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,a){let r;const o=(r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),s=(o.textBaseline="top",o.font="600 32px Arial",{});return e.forEach(e=>{s[e]=t(o,e,n,a)}),s}function r(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}a.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),c.toString(),p.toString()].join(",")+"));",a=new Blob([e],{type:"text/javascript"});const r=new Worker(URL.createObjectURL(a),{name:"wpTestEmojiSupports"});return void(r.onmessage=e=>{i(n=e.data),r.terminate(),t(n)})}catch(e){}i(n=f(s,u,c,p))}t(n)}).then(e=>{for(const n in e)a.supports[n]=e[n],a.supports.everything=a.supports.everything&&a.supports[n],"flag"!==n&&(a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&a.supports[n]);var t;a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&!a.supports.flag,a.supports.everything||((t=a.source||{}).concatemoji?r(t.concatemoji):t.wpemoji&&t.twemoji&&(r(t.twemoji),r(t.wpemoji)))});
//# sourceURL=https://blog.myetv.tv/wp-includes/js/wp-emoji-loader.min.js
</script>
<script>
	window.addEventListener("load", function() {
		jQuery(document).ready(function($){
			$(document).christmasify({
	      snowflakes: 25,
	      classy_snow: true,
	      snow_speed: 'medium',
	      santa: false,
	      music: false,
	      image_frame: false,
	      font: false			}); 
		});
	});
</script>

			</body>
</html>
<!--
Performance optimized by Redis Object Cache. Learn more: https://wprediscache.com

Retrieved 5017 objects (139 MB) from Redis using PhpRedis (v5.3.7).
-->
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="ec0fb20c7741f3f80a0d9bc5-|49" defer></script>