;(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

Após web resgatar foto com Bolsonaro, Covas diz que anulou voto em 2018

Selfie de março de 2019 de Bruno Covas ao lado de Luiz Eduardo Ramos (na época chefe do Comando Militar do Sudeste), do presidente Jair Bolsonaro e do governador João Doria - Reprodução
Selfie de março de 2019 de Bruno Covas ao lado de Luiz Eduardo Ramos (na época chefe do Comando Militar do Sudeste), do presidente Jair Bolsonaro e do governador João Doria Imagem: Reprodução

Wanderley Preite Sobrinho

Do UOL, em São Paulo

18/11/2020 11h23

O prefeito de São Paulo e candidato à reeleição, Bruno Covas (PSDB), negou hoje cedo que simpatize com o presidente Jair Bolsonaro (sem partido), com quem posou para fotos no ano ado. De acordo com Covas —que ontem recebeu o apoio de Celso Russomanno (Republicanos)—, ele anulou o voto para presidente no segundo turno da eleição de 2018.

A resposta do tucano se deve a uma selfie publicada por ele em março do ano ado ao lado do presidente e do governador paulista João Doria (PSDB) e que ontem viralizou. Na época chefe do Comando Militar do Sudeste, o atual ministro-chefe da Secretaria de Governo, Luiz Eduardo Ramos, também está na foto.

"Anulei meu voto na eleição presidencial de 2018 por não ver em Bolsonaro discurso que agregasse discurso democrático na campanha dele", afirmou após caminhar pelo comércio na zona sul da cidade.

Covas disse ainda que já se posicionou contrariamente "a ações que ele diz, como quando o então ministro da educação disse que faria revisão dos livros de história para que a ditadura não fosse viste como uma ditadura militar".

"Mantenho meu posicionamento contrário aos posicionamentos dele, seja na área de direitos humanos, ambiental, cultural", disse. "Não vou mudar para ganhar eleição ou apoiador."

Apoio de Russomanno

Covas disse ainda que ligou para Russomanno - apoiado por Bolsonaro no primeiro turno - para pedir seu apoio.

"O apoio foi costurado com o Marcos Pereira, depois conversei com o Russomanno que aderiu sem nenhum tipo de contrapartida, como participação em secretaria", disse.

"Ele teve 10% dos votos, não tem o menor problema em agregar apoio até porque estamos falando de apoios programáticos para a cidade de São Paulo", concluiu.