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

Técnico do PSG diz que Cavani fica no clube: "Isso não é Monopoly"

Thomas Tuchel, técnico do PSG, gesticula durante jogo - REUTERS/Regis Duvignau
Thomas Tuchel, técnico do PSG, gesticula durante jogo Imagem: REUTERS/Regis Duvignau

07/01/2020 13h15

O técnico do PSG, Thomas Tuchel, afirmou que Cavani não deve deixar o clube na atual janela do mercado da bola. O treinador adotou mesma linha do diretor esportivo do clube, o brasileiro Leonardo, que não pretende vender o atacante para o Atlético de Madri agora em janeiro.

"Temos (Tuchel e Leonardo) o mesmo ponto de vista. Não gostamos muito de mudanças durante o inverno, porque isso não é Monopoly", declarou o técnico alemão fazendo referência ao jogo de tabuleiro.

"Leonardo é muito experiente. Ele sabe como ganhar títulos e sabe o que é necessário para que uma equipe alcance esse objetivo. Queremos ganhar todos os títulos possíveis e para isso precisamos de uma grande equipe", completou Tuchel.

Cavani, maior artilheiro da história do PSG (198 gols), tem contrato com o clube parisiense até o fim da atual temporada. Segundo a emissora espanhola RMC, o uruguaio chegou a um acordo de contrato de dois anos e meio com o Atlético de Madri para se transferir já em janeiro.

"É um vestiário, uma equipe que trabalha bem junta, os jogadores criaram um espírito de equipe entre eles. E, toda vez que um jogador sai ou chega, isso cria algumas incertezas, e não gostamos muito disso. Estamos felizes com o grupo que temos agora", analisou Tuchel.

Desde que o PSG contratou o centroavante argentino Mauro Icardi no início da temporada, Cavani, vítima de repetidas lesões, perdeu sua vaga cativa na equipe titular.

"Kylian (Mbappé) e Mauro (Icardi) vêm jogando muito bem juntos. Foi duro para Edison lutar e se machucar. Ele está voltando agora a lutar por seu lugar, e é isso que lhe pedimos", explicou o técnico.

"É uma situação com uma grande concorrência, todo mundo quer jogar, mas não posso prometer nada a ninguém. É sempre uma competição, e isso é uma força para uma equipe como o PSG", concluiu.