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

Diogo Schelp

Campanha de Covas entendeu que precisava vender esperança, como Boulos

Campanha do prefeito percebeu que, além de martelar na experiência de Covas, deveria usar estratégia do rival do PSOL - Zanone Fraissat/Folhapress
Campanha do prefeito percebeu que, além de martelar na experiência de Covas, deveria usar estratégia do rival do PSOL Imagem: Zanone Fraissat/Folhapress

Colunista do UOL

28/11/2020 12h00

Diante da mesa de canapés e lanches, Bruno Covas (PSDB) e Guilherme Boulos (PSOL) se cumprimentaram.
-- Estou vendo o Bruno mais do que minha esposa -- brincou Boulos.
-- Enquanto não estiver sonhando comigo, está ótimo -- devolveu Covas, rindo.
O diálogo entre os dois candidatos que se enfrentam no segundo turno da eleição para a prefeitura de São Paulo ocorreu na última segunda-feira (23), no estúdio da TV Cultura, antes de serem sabatinados no programa Roda Viva.

Começava ali a corrida final, a contagem regressiva de seis dias para a votação de domingo (29), quando os paulistanos escolherão quem comandará a cidade pelos próximos quatro anos.

Nesses dias, além dos encontros em sabatinas e debates, Covas e Boulos ganharam motivos adicionais para povoarem os sonhos — ou pesadelos — um do outro: a disputa se tornou mais acirrada, com Boulos diminuindo a vantagem de Covas nas pesquisas, e a temperatura da campanha elevou-se em alguns graus, com ataques mais intensos de ambas as partes.

O clima de trégua entre os dois só voltou a dar as caras quando Boulos foi diagnosticado com covid-19 na tarde de ontem (sexta-feira, 27) e o tucano lhe desejou "pronta recuperação".

Nos bastidores, pessoas próximas de Covas veem esse segundo turno como um embate entre a experiência e a esperança.

A experiência é reivindicada pelo tucano, que sempre teve a política por profissão e que já desempenhou diversos cargos públicos. Boulos, por sua vez, transmite, segundo avaliação dos próprios estrategistas da campanha do PSDB, a imagem de esperança e a promessa da realização de sonhos.

Campanha de Covas ligou alerta para o mote "esperança"

"Boulos fala bonito e de maneira simples sobre temas complexos", diz um assessor de Covas. "Covas é o oposto: ele está há tanto tempo na política que sabe das dificuldades, da dura realidade dos fatos, e que não pode sair por aí dizendo qualquer coisa de maneira irresponsável."

O crescimento de Boulos nas pesquisas, na avaliação de integrantes da campanha do tucano, é reflexo do fato de que, em eleições, as pessoas compram esperança, não a dura realidade.

A discussão nos bastidores da equipe de Covas nessa reta final, portanto, era como conseguir atribuir para o prefeito esse papel de provedor de esperança. Esse esforço se verificou, por exemplo, no último dia de propaganda eleitoral na TV do candidato do PSDB, que falou de realizações, mas também procurou imprimir um tom de motivação e do sonho da "igualdade de oportunidades".

A preocupação com o crescimento do adversário do PSOL nas pesquisas manifestou-se com intensidades diferentes nos núcleos mais centrais ou mais distantes da campanha de Covas.

Militância cobrou postura mais dura

No núcleo mais próximo, predominou o reconhecimento da dificuldade de conter o avanço de um adversário que tem o apelo da mudança. Não houve, porém, desespero. A preocupação maior é com a possibilidade de que a abstenção na votação deste domingo seja alta, em especial entre eleitores mais velhos (muitos deles eleitores de Covas, segundo as pesquisas), que temem a contaminação por covid-19 e por isso talvez prefiram ficar em casa.

A aflição e a angústia são mais palpáveis nos núcleos mais distantes das decisões estratégicas da campanha tucana. São os militantes que estão nas ruas ou nas redes sociais e que nos últimos dias questionaram os coordenadores, pedindo uma postura mais dura de Covas contra Boulos na reta final.

Até mais ver

Isso talvez viesse a ocorrer no último debate entre os dois candidatos, pela Rede Globo. Mas Boulos foi diagnosticado com covid-19 (Covas já teve a doença) e o enfrentamento na TV teve de ser cancelado.

Com isso, o psolista, de maneira involuntária, encerrou mais cedo essa fase de sua vida em que ele vê Bruno Covas com mais frequência do que a própria mulher.

E o tucano, por sua vez, conta as horas para o momento em que não precisará mais se preocupar com os sonhos de Guilherme Boulos.