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

Jilmar Tatto declara apoio a Boulos em SP e o chama de 'irmão mais novo'

Jilmar Tatto (PT) durante carreata no bairro de Parelheiros, na zona sul de São Paulo - Reprodução/Twitter
Jilmar Tatto (PT) durante carreata no bairro de Parelheiros, na zona sul de São Paulo Imagem: Reprodução/Twitter

Do UOL, em São Paulo

15/11/2020 23h38Atualizada em 16/11/2020 00h14

Candidato do PT na eleição para a Prefeitura de São Paulo, Jilmar Tatto publicou, na noite de hoje, uma mensagem parabenizando Guilherme Boulos (PSOL) pelo resultado no primeiro turno da votação. Até o momento, com mais de 99,67% das urnas apuradas, o psolista vai avançando para o segundo turno atrás de Bruno Covas (PSDB).

"Acabei de ligar para Guilherme Boulos, a quem tenho como um irmão mais novo. Desejei sorte e disse que ele pode contar comigo e com a nossa valente militância para virar o jogo em São Paulo", escreveu Tatto no Twitter.

Posteriormente, Boulos respondeu com um agradecimento na rede social.

"Obrigado pelo gesto, Jilmar Tatto! Parabéns pela campanha, sempre deixando claro quem são nossos reais adversários. Vamos juntos agora virar o jogo em São Paulo!"

Apuração em SP

Por volta de 0h, com 99,67% das urnas apuradas, São Paulo tinha Covas na liderança, com 32,85% dos votos válidos (1.747.938 votos), e Guilherme Boulos (PSOL) logo atrás, com 20,24% (1.077.168).

Depois, vêm Márcio França (PSB), com 13,65%; Celso Russomanno (Republicanos), 10,50%; Arthur do Val (Patriota), 9,78%; Jilmar Tatto (PT), 8,65%; e Joice Hasselmann (PSL), 1,84%.

O percentual de votos nulos era de 10,11%, enquanto 5,87% dos eleitores votaram em branco.

Embora a apuração esteja em ritmo avançado, o Placar UOL Eleições, abastecido pelo sistema do TSE, continua apresentando um certo atraso em relação às urnas apuradas.

Isso porque, conforme explicou o presidente do tribunal nesta noite, ministro Luís Roberto Barroso, o sistema de totalização e divulgação dos resultados do TSE teve uma pane técnica, uma falha em um dos processadores, que atrasou todo o processo.

Apesar disso, Barroso reforçou que o atraso não compromete a lisura do processo eleitoral. Ele ainda negou qualquer relação entre a falha no processador e a tentativa de ataque cibernético ao sistema que ocorreu na manhã de hoje.

O crescimento de Boulos durante a campanha

O resultado vai apontando grande descolamento de Boulos em relação a Márcio França (PSB) e Celso Russomanno (Republicanos). Nas últimas pesquisas antes da eleição, o psolista vinha aparecendo tecnicamente empatado com os outros dois candidatos.

Ainda ontem, o Ibope apontava que Boulos tinha 16% de intenção de votos válidos (com margem de erro de três pontos percentuais, para mais ou para menos).

No final de outubro, o Datafolha indicava que Boulos não era conhecido por quatro em cada dez eleitores paulistanos. Com apenas 17 segundos de propaganda eleitoral na TV, ele investiu na campanha em redes sociais e atraiu a atenção de boa parte do eleitorado mais jovem.

Morador do Campo Limpo, na zona sul da cidade, ele impulsionou a campanha alegando viver na periferia, sem se limitar a visitá-la apenas em campanhas eleitorais. Também investiu em campanhas de rua, se apresentando aos eleitores, o que lhe rendeu uma chamada de atenção do MPE (Ministério Público Eleitoral) por provocar aglomerações e apertar a mão das pessoas — algo não indicado durante a pandemia do novo coronavírus.