;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Esse conteúdo é antigo

Bombardeio em festa de casamento mata cinco mulheres e deixa feridos no Iêmen

28.mar.2019 - Pessoas andam no local de um ataque aéreo que atingiu um posto de gasolina perto de um hospital no distrito de Kutaf, na província de Saada, no noroeste do Iêmen - Naif Rahma/Reuters
28.mar.2019 - Pessoas andam no local de um ataque aéreo que atingiu um posto de gasolina perto de um hospital no distrito de Kutaf, na província de Saada, no noroeste do Iêmen Imagem: Naif Rahma/Reuters

02/01/2021 08h14

Cinco mulheres morreram após a queda de um explosivo em um salão de festas durante um casamento, na madrugada de hoje, em Hodeida, cidade em guerra no sudoeste do Iêmen. O local fica perto do aeroporto da cidade, localizado na linha de frente entre as forças pró-governo e os rebeldes Houthis, que controlam a cidade portuária no Mar Vermelho.

A explosão deixou sete feridos, incluindo crianças. "Um crime hediondo cometido pelos Houthis contra civis", acusou o general Sadek Douid, representante do governo em uma comissão da ONU para manutenção da trégua na região.

O ataque ilustra a precariedade da paz que prevalece nesta cidade, onde uma trégua negociada pela ONU tem sido geralmente respeitada, desde 2018, pelos rebeldes Houthi e pelas forças pró-governo. O salão bombardeado fica localizado na saída sul da cidade, na linha de frente entre os campos rivais, que se acusam mutuamente pelo ataque.

O representante dos Houthis em Hodeida, Mohammed Ayache, culpou as forças do governo pelo ataque. "As forças agressoras cometem crimes e não hesitam em culpar os outros", disse ele, à estação de TV rebelde Al-Massirah.

Seis anos de conflito

Desencadeado em 2014 por uma ofensiva dos Houthis, que apreenderam grandes áreas do território, principalmente no norte do Iêmen, incluindo a capital Sanaa, o conflito já custou dezenas de milhares de vidas, de acordo com ONGs internacionais.

Os rebeldes resistem desde março de 2015 à intervenção militar de uma coalizão liderada pela vizinha Arábia Saudita, que apoia o governo iemenita do presidente Abd Rabbo Mansour Hadi.

Embora os combates no Iêmen tenham diminuído drasticamente por muitos meses, a violência recomeçou em dezembro, em Hodeida, que é também o principal ponto de entrada para ajuda humanitária no Iêmen, e em Aden, no sul do país.

Em 4 de dezembro, pelo menos oito pessoas morreram no bombardeio de um complexo industrial na cidade. Poucos dias antes, cinco crianças e três mulheres foram mortas em um bombardeio, atribuído aos Houthis, em áreas residenciais.

No final de novembro, os campos militares Houthis em Hodeida haviam sido alvo de ataques aéreos da coalizão militar, em retaliação a um ataque a um campo de exploração de petróleo saudita atribuído aos insurgentes iemenitas.

Em Aden, na quarta-feira (30), um ataque teve como alvo o aeroporto desta capital provisória do novo governo, resultado da divisão do poder entre as diferentes facções hostis aos Houthis.

Apesar do ataque, as autoridades prometeram "estabilizar" a situação no Iêmen, o país mais pobre da Península Arábica, onde a pior crise humanitária do mundo deixou milhões de desabrigados e uma população à beira da fome, de acordo com a ONU.

*Com informações da AFP