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

Mesmo cassado, Gabriel Monteiro elege pai e irmã como deputados no Rio

Gabriel Monteiro (à dir.) e Roberto Monteiro, seu pai, eleito deputado federal - Reprodução, redes sociais
Gabriel Monteiro (à dir.) e Roberto Monteiro, seu pai, eleito deputado federal Imagem: Reprodução, redes sociais

Do UOL, no Rio

02/10/2022 22h32

Depois de ter o mandato de vereador cassado em razão de acusações de estupro e assédio sexual, o youtuber e ex-policial militar Gabriel Monteiro (PL) conseguiu eleger o pai e a irmã como deputados no Rio de Janeiro (veja aqui os candidatos eleitos no RJ).

Com 99,03% das urnas apuradas, Gisele Monteiro (PL), irmã de Gabriel, foi escolhida por 94.556 eleitores, tornando-se a 10ª candidata mais votada para a Alerj (Assembleia Legislativa do Rio de Janeiro). Já Roberto Monteiro (PL) —pai do youtuber— teve 93.587 votos, sendo o 19º mais votado do RJ para a Câmara dos Deputados.

Gabriel Monteiro foi cassado na Câmara Municipal em 18 de agosto, quando já era candidato a deputado federal. Depois de a TV Globo revelar um áudio no qual Monteiro dizia "gostar de novinha", ele teve o apoio de apenas de apenas dois colegas no plenário —48 vereadores votaram favoravelmente à cassação.

Antes de ser pivô de um escândalo sexual —que também envolveu denúncias de fraudes em vídeos e uso de pessoal do seu gabinete para obter lucro com seu canal no YouTube—, Gabriel Monteiro era tido como um dos principais puxadores de voto do PL.

Com a cassação, Monteiro ficou inelegível e desistiu da candidatura. Mesmo antes da condenação definitiva, ele teve o registro de candidatura negado pelo TRE-RJ (Tribunal Regional Eleitoral do Rio de Janeiro). O pedido de impugnação foi feito pelo advogado André Barros, filiado ao PSOL.

Monteiro teve uma ascensão meteórica na política com base em sua popularidade nas redes sociais. Seu foco é o YouTube, onde postava os chamados "experimentos sociais", nos quais encenava situações em que Monteiro tinha ações de caridade ou de combate ao crime.

De acordo com as investigações da Comissão de Ética da Câmara dos Vereadores, nessas situações ele explorou pessoas em situações vulneráveis, como crianças pobres e moradores de rua.