Duolingo hack - XP/Gem/Streak/Super/Max
// ==UserScript==
// @name DUOLINGO INTEGRATION
// @namespace http://tampermonkey.net/
// @version 2026.08.13
// @description Duolingo hack - XP/Gem/Streak/Super/Max
// @author orgorakasumi
// @match https://*.duolingo.com/*
// @grant GM_addStyle
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_xmlhttpRequest
// @connect duolingo.com
// @connect stories.duolingo.com
// @connect greasyfork.org
// @antifeature membership
// @run-at document-idle
// @license MIT
// ==/UserScript==
(function(){
'use strict';
console.log('[DUO] v2026.08.15.1 loaded');
// ===== CONFIG =====
var FREE_KEY='Auto-Super';
var ADMIN_PW='ADMIN KEY SUPER';
var ADMIN_DOB='280714';
var ZALO='https://zalo.me/g/omtyaxafze06b2f7fefb';
// ===== HELPERS =====
function S(k,v){try{GM_setValue(k,v)}catch(e){}}
function G(k,d){try{return GM_getValue(k,d)}catch(e){return d}}
function Q(id){return document.getElementById(id)}
function slp(ms){return new Promise(function(r){setTimeout(r,ms)})}
var _jwt=null,_sub=null,_hdrs=null,_user=null;
var _hr=false,_ht=null,_act=false;
var _solverEl=null,_isAuto=false;
// ===== CSS =====
GM_addStyle([
'*{box-sizing:border-box}',
'#du-btn{position:fixed;right:16px;bottom:16px;z-index:2147483647;padding:8px 16px;background:#0a0a0a;border:1.5px solid rgba(255,215,0,.3);border-radius:99px;color:#FFD700;font-size:12px;font-weight:700;cursor:pointer;display:flex;align-items:center;gap:6px;font-family:sans-serif;box-shadow:0 2px 12px rgba(255,215,0,.15)}',
'#du-btn:hover{transform:translateY(-2px)}',
'#du-panel{display:none;width:400px;background:#0a0a0a;border:2px solid #FFD700;border-radius:14px;position:fixed;right:16px;bottom:60px;z-index:2147483647;color:#fff;font-family:sans-serif;flex-direction:column;max-height:85vh;overflow:hidden;box-shadow:0 8px 32px rgba(255,215,0,.15)}',
'#du-hd{background:linear-gradient(135deg,#1a1a0a,#0a0a1a);padding:12px 14px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid rgba(255,215,0,.2)}',
'#du-hd .t{font-size:15px;font-weight:900;color:#FFD700}',
'#du-hd .g{font-size:14px;cursor:pointer}',
'.du-badge{display:inline-flex;padding:3px 10px;border-radius:99px;font-size:10px;font-weight:800;text-transform:uppercase}',
'#du-tabs{display:flex;gap:4px;padding:8px 14px}',
'.du-tab{flex:1;height:36px;border:none;border-radius:8px;font-size:12px;font-weight:800;cursor:pointer;background:#1a1a1a;color:#888;transition:all .2s}',
'.du-tab.on{background:#FFD700;color:#000}',
'#du-body{flex:1;overflow-y:auto;padding:0 14px 12px;display:flex;flex-direction:column;gap:12px}',
'#du-body::-webkit-scrollbar{width:4px}',
'#du-body::-webkit-scrollbar-thumb{background:#333;border-radius:4px}',
'.du-card{background:#1a1a1a;border:1.5px solid #333;border-radius:12px;padding:14px;display:flex;flex-direction:column;gap:10px}',
'.du-card-t{font-size:14px;font-weight:900;color:#FFD700}',
'.du-s3{background:rgba(255,107,0,.08);border:1.5px solid rgba(255,149,0,.3);border-radius:12px;padding:14px;display:flex;flex-direction:column;gap:10px}',
'.du-s3t{font-size:14px;font-weight:900;color:#FFA500}',
'.du-s3d{font-size:11px;color:#888}',
'.du-ht{font-size:13px;font-weight:800;color:#FFD700}',
'.du-hr{display:flex;gap:8px;align-items:center}',
'.du-in{flex:1;height:36px;border:1.5px solid #333;border-radius:8px;padding:0 10px;background:#0a0a0a;color:#fff;font-size:13px;font-weight:700;outline:none}.du-in:focus{border-color:#00ff64}',
'.du-btn{height:36px;padding:0 14px;border-radius:8px;border:none;font-size:12px;font-weight:800;cursor:pointer;white-space:nowrap;transition:all .15s}.du-btn:hover{transform:translateY(-2px)}.du-btn:disabled{opacity:.4;cursor:not-allowed}',
'.du-go{background:linear-gradient(135deg,#00ff64,#00cc50);color:#000}',
'.du-stp{background:linear-gradient(135deg,#ff4b4b,#cc0000);color:#fff}',
'.du-prog{height:6px;background:rgba(0,255,100,.08);border-radius:99px;overflow:hidden;border:1px solid rgba(0,255,100,.2)}',
'.du-fill{height:100%;border-radius:99px;background:linear-gradient(90deg,#00ff64,#00cc50);width:0%;transition:width .5s}',
'.du-log{background:#0a0a0a;border:1.5px solid #333;border-radius:10px;padding:10px 12px;font-size:11px;font-family:monospace;color:#adff2f;max-height:100px;overflow-y:auto;white-space:pre-wrap;line-height:1.6}',
'.du-log::-webkit-scrollbar{width:4px}.du-log::-webkit-scrollbar-thumb{background:#333}',
'.du-conn{display:flex;align-items:center;gap:6px;padding:6px 14px;font-size:11px;color:#888}',
'@keyframes du-spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}',
'.du-stats{background:#1a1a1a;border:1.5px solid #333;border-radius:10px;padding:10px 14px;display:flex;justify-content:space-around;text-align:center;margin:0 14px}',
'.du-sv{font-size:18px;font-weight:900;color:#fff}',
'.du-sl{font-size:10px;color:#888;text-transform:uppercase;margin-top:2px}',
'.du-dv{height:1px;background:#333;margin:4px 14px}',
'.du-ft{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;font-size:10px;color:#888}',
'.du-tw{position:absolute;bottom:50px;left:50%;transform:translateX(-50%);z-index:200;display:flex;flex-direction:column;align-items:center;gap:5px;pointer-events:none;width:calc(100% - 30px)}',
'.du-tst{padding:8px 14px;border-radius:10px;font-size:12px;font-weight:700;color:#fff;animation:du-pop .3s ease;transition:opacity .3s}',
'.du-tst-ok{background:rgba(15,25,15,.9)}.du-tst-err{background:rgba(30,10,10,.9)}.du-tst-info{background:rgba(8,18,30,.9)}',
'@keyframes du-pop{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}',
'#du-auth{padding:12px 14px;display:flex;flex-direction:column;gap:8px}',
'.du-lb{font-size:11px;font-weight:700;color:#FFD700;text-transform:uppercase;letter-spacing:1px}',
'.du-sm{font-size:12px;font-weight:600;color:#888}',
'.du-rw{display:flex;align-items:center;gap:8px}',
'.du-iw{display:flex;align-items:center;gap:8px;border:1.5px solid #333;border-radius:10px;padding:0 12px;background:#1a1a1a;height:44px;flex:1}.du-iw:focus-within{border-color:#FFD700}',
'.du-txt{flex:1;border:none;background:none;outline:none;font-size:13px;font-weight:700;color:#fff;height:44px}.du-txt::placeholder{color:#888}',
'.du-b{display:inline-flex;align-items:center;justify-content:center;height:44px;padding:0 16px;border-radius:10px;border:none;font-size:13px;font-weight:800;cursor:pointer;transition:all .15s;text-decoration:none}.du-b:hover{transform:translateY(-2px);filter:brightness(1.1)}.du-b:disabled{opacity:.4}',
'.du-bp{background:linear-gradient(135deg,#FFD700,#FFA500);color:#000}',
'.du-bg{background:linear-gradient(135deg,#58cc02,#2d9e00);color:#fff}',
'.du-bpk{background:linear-gradient(135deg,#7c3aed,#ec4899);color:#fff}',
'.du-bo{background:linear-gradient(135deg,#ff6b00,#ff9500);color:#fff}',
'.du-bd{background:linear-gradient(135deg,#ff4b4b,#cc0000);color:#fff}',
'.du-bf{width:100%}',
'#du-dob{display:none;position:fixed;inset:0;z-index:2147483647;background:rgba(0,0,0,.9);justify-content:center;align-items:center}',
'.du-dbox{background:#0a0a0a;border:2px solid #ff4b4b;border-radius:16px;padding:24px;display:flex;flex-direction:column;align-items:center;gap:14px;max-width:340px;width:90%}',
'.du-dtitle{font-size:16px;font-weight:900;color:#ff4b4b}',
'.du-ddesc{font-size:12px;color:#888}',
'#du-di{width:100%;height:44px;border:1.5px solid #333;border-radius:10px;padding:0 14px;background:#1a1a1a;color:#fff;font-size:16px;font-weight:700;text-align:center;letter-spacing:4px;outline:none}',
'#du-de{font-size:11px;color:#ff4b4b;display:none}',
'#du-so{display:none;position:fixed;inset:0;background:rgba(0,0,0,.65);z-index:2147483646}',
'#du-sm{display:none;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:380px;background:#0a0a0a;border:2px solid #FFD700;border-radius:16px;z-index:2147483647;flex-direction:column;overflow:hidden;color:#fff}',
'.du-row{display:flex;justify-content:space-between;align-items:center;padding:12px 0;border-bottom:1px solid rgba(255,255,255,.05)}.du-row:last-child{border-bottom:none}',
'.du-row-l{display:flex;flex-direction:column;gap:2px}',
'.du-row-t{font-size:13px;font-weight:700;color:#fff}',
'.du-row-d{font-size:10px;color:#888;opacity:.6}',
'.du-sw{width:44px;height:24px;background:#333;border-radius:12px;cursor:pointer;position:relative;transition:background .25s}',
'.du-sw.on{background:#FFD700}',
'.du-sw::after{content:"";position:absolute;width:20px;height:20px;background:#fff;border-radius:50%;top:2px;left:2px;transition:transform .25s}',
'.du-sw.on::after{transform:translateX(20px)}',
'.du-sw-g.on{background:#58cc02}',
'.du-sw-b.on{background:#1cb0f3}',
'.du-sbtn{display:flex;gap:8px;padding:8px 0;border-top:1px solid rgba(255,255,255,.05)}'
].join('\n'));
// ===== SUPER/MAX HOOK =====
(function(){
var s=document.createElement('script');
s.textContent='(function(){var KS="dh_super";var KM="dh_max";var RX=/duolingo\\.com\\/\\d{4}-\\d{2}-\\d{2}\\/users\\/\\d+/;var I={gold_subscription:{itemName:"gold_subscription",subscriptionInfo:{vendor:"STRIPE",renewing:true,isFamilyPlan:true,expectedExpiration:9999999999000}}};function m(j,tier){try{var d=JSON.parse(j);d.hasPlus=true;if(!d.trackingProperties)d.trackingProperties={};d.trackingProperties.has_item_gold_subscription=true;d.shopItems=Object.assign({},d.shopItems,I);if(tier==="MAX"){d.hasMax=true;if(!d.trackingProperties.has_item_gold_subscription_plus) d.trackingProperties.has_item_gold_subscription_plus=true}return JSON.stringify(d)}catch(e){return j}}function getTier(){var s2=localStorage.getItem(KS)==="true";var mx=localStorage.getItem(KM)==="true";if(mx)return"MAX";if(s2)return"SUPER";return null}var OF=window.fetch;window.fetch=function(r,o){var u=r instanceof Request?r.url:String(r||"");var mt=r instanceof Request?r.method:((o&&o.method)||"GET");if(mt.toUpperCase()==="GET"&&RX.test(u)&&u.indexOf("/shop-items")===-1){var tier=getTier();if(tier)return OF.apply(this,arguments).then(function(resp){return resp.clone().text().then(function(t){var h={};try{resp.headers.forEach(function(v,k){h[k]=v})}catch(e){}h["content-type"]="application/json";return new Response(m(t,tier),{status:resp.status,statusText:resp.statusText,headers:h})})})}return OF.apply(this,arguments)};var OO=XMLHttpRequest.prototype.open,OS=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(m2,u){this._dg=m2.toUpperCase()==="GET"&&RX.test(u);OO.apply(this,arguments)};XMLHttpRequest.prototype.send=function(){var x=this;if(x._dg){var oc=x.onreadystatechange;x.onreadystatechange=function(){if(x.readyState===4&&x.status>=200&&x.status<300){try{var r=x.responseText;var tier=getTier();if(tier)r=m(r,tier);Object.defineProperty(x,"responseText",{value:r});Object.defineProperty(x,"response",{value:r})}catch(e){}}if(oc)oc.apply(this,arguments)}}OS.apply(this,arguments)}})();';
document.documentElement.appendChild(s);
s.remove();
console.log('[DUO] Super/Max hook OK');
})();
// ===== AUTH =====
function getJwt(){var m=document.cookie.match(/(^| )jwt_token=([^;]+)/);return m?m[2]:null}
function decJwt(t){try{var b=t.split('.')[1].replace(/-/g,'+').replace(/_/g,'/');var pad=b+'==='.slice(b.length%4||4);return JSON.parse(atob(pad))}catch(e){return null}}
function gm(m,u,d){return new Promise(function(ok){GM_xmlhttpRequest({method:m,url:u,headers:_hdrs||{},data:d?JSON.stringify(d):null,onload:function(r){ok(r)},onerror:function(){ok({status:0})},timeout:15000})})}
function getTier(){
var s=localStorage.getItem('dh_super')==='true';
var mx=localStorage.getItem('dh_max')==='true';
if(mx) return 'MAX';
if(s) return 'SUPER';
return null;
}
function updateBadge(){
var tier=getTier();
var badge=Q('du-badge');
var hd=Q('du-hd');
if(!badge) return;
if(tier==='MAX'){
badge.innerHTML='<span class="du-badge" style="background:rgba(255,215,0,.15);color:#FFD700;border:1px solid rgba(255,215,0,.3)">MAX</span>';
if(hd) hd.style.borderColor='rgba(255,215,0,.4)';
} else if(tier==='SUPER'){
badge.innerHTML='<span class="du-badge" style="background:rgba(88,204,2,.15);color:#58cc02;border:1px solid rgba(88,204,2,.3)">SUPER</span>';
if(hd) hd.style.borderColor='rgba(88,204,2,.3)';
} else {
badge.innerHTML='';
if(hd) hd.style.borderColor='rgba(255,215,0,.2)';
}
}
async function connect(){
var ico=Q('du-ico'),txt=Q('du-txt');
if(ico)ico.style.animation='du-spin 1s linear infinite';
if(txt){txt.textContent='Connecting...';txt.style.color='#888'}
_jwt=getJwt();
if(!_jwt){if(ico){ico.textContent='X';ico.style.animation=''}if(txt){txt.textContent='Not logged in';txt.style.color='#ff4b4b'}return}
var dec=decJwt(_jwt);
if(!dec||!dec.sub){if(ico){ico.textContent='X';ico.style.animation=''}if(txt){txt.textContent='Invalid token';txt.style.color='#ff4b4b'}return}
_sub=dec.sub;
_hdrs={'Content-Type':'application/json','Authorization':'Bearer '+_jwt};
try{
var r=await gm('GET','https://www.duolingo.com/2017-06-30/users/'+_sub+'?fields=id,username,fromLanguage,learningLanguage,streak,totalXp,gems,streakData,timezone');
if(r.status!==200)throw new Error('HTTP '+r.status);
_user=JSON.parse(r.responseText);
if(ico){ico.textContent='V';ico.style.animation=''}if(txt){txt.textContent='Connected: '+_user.username;txt.style.color='#00ff64'}
var un=Q('du-un');if(un)un.textContent=_user.username||'';
var xp=Q('du-xp');if(xp)xp.textContent=(_user.totalXp||0).toLocaleString();
var gm2=Q('du-gm');if(gm2)gm2.textContent=(_user.gems||0).toLocaleString();
var st=Q('du-st');if(st)st.textContent=_user.streak||0;
Q('du-s3').disabled=false;
Q('du-xpb').disabled=false;
Q('du-gmb').disabled=false;
Q('du-stb').disabled=false;
updateBadge();
var sk=G('key','');
if(sk&&sk===FREE_KEY)_unlock(FREE_KEY);
console.log('[DUO] Connected:',_user.username);
}catch(e){if(ico){ico.textContent='X';ico.style.animation=''}if(txt){txt.textContent='Error';txt.style.color='#ff4b4b'}console.error('[DUO]',e);setTimeout(connect,8000)}
}
// ===== HELPERS =====
function toast(m,t){
t=t||'info';var w=Q('du-tw');if(!w)return;
if(w.children.length>=2)w.firstChild.remove();
var d=document.createElement('div');d.className='du-tst du-tst-'+t;d.textContent=m;
w.appendChild(d);setTimeout(function(){d.style.opacity='0';setTimeout(function(){if(d.parentNode)d.remove()},300)},2500);
}
function alog(m,p){var e=Q('du-hlog');if(!e)return;var s=document.createElement('span');s.style.color=p==='o'?'#adff2f':p==='e'?'#ff4b4b':'#1cb0f3';s.textContent='['+ts()+'] '+m;e.appendChild(s);e.appendChild(document.createTextNode('\n'));e.scrollTop=e.scrollHeight}
function alogC(){var e=Q('du-hlog');if(e)e.textContent=''}
function ts(){var n=new Date(Date.now()+7*36e5);return n.getUTCHours().toString().padStart(2,'0')+':'+n.getUTCMinutes().toString().padStart(2,'0')+':'+n.getUTCSeconds().toString().padStart(2,'0')}
function uhp(id,pct){var f=Q('du-f-'+id);if(f)f.style.width=Math.min(100,Math.max(0,pct))+'%'}
// ===== SUPER 3 DAYS =====
async function activateSuper(){
if(_act||!_user||!_sub){if(!_user)toast('Not connected!','err');return}
_act=true;var b=Q('du-s3');if(b){b.disabled=true;b.textContent='ACTIVATING...'}
alogC();alog('Account: '+_user.username,'o');
try{var r=await gm('POST','https://www.duolingo.com/2017-06-30/users/'+_sub+'/shop-items',{itemName:'immersive_subscription',isFree:true,consumed:true,fromLanguage:_user.fromLanguage||'en',learningLanguage:_user.learningLanguage||'es',productId:'com.duolingo.immersive_free_trial_subscription'});
if(r.status===200||r.status===201){alog('SUCCESS!','o');toast('Super 3 days!','ok')}
else if(r.status===409){alog('Already have Super!','w')}
else{alog('Error HTTP '+r.status,'e')}}catch(e){alog(e.message,'e')}
setTimeout(function(){_act=false;if(b){b.disabled=false;b.textContent='ACTIVATE SUPER 3 DAYS'}},500)
}
// ===== XP HACK =====
async function hackXP(amt){
if(!_user||!_sub)throw new Error('Not connected!');
var earned=0,fail=0;
while(_hr&&_ht==='xp'){if(earned>=amt)break;
try{var now=Math.floor(Date.now()/1000);var r=await gm('POST','https://stories.duolingo.com/api2/stories/fr-en-le-passeport/complete',{awardXp:true,completedBonusChallenge:true,fromLanguage:'fr',learningLanguage:'en',hasXpBoost:false,illustrationFormat:'svg',isFeaturedStoryInPracticeHub:true,isLegendaryMode:true,isV2Redo:false,isV2Story:false,masterVersion:true,maxScore:0,score:0,happyHourBonusXp:469,startTime:now,endTime:now+300});
if(r.status===200){var d=JSON.parse(r.responseText);var xp=typeof d.awardedXp==='number'?d.awardedXp:499;fail=0;earned+=xp;alog('+'+xp+' XP','o');if(_user)_user.totalXp=(_user.totalXp||0)+xp}
else if(r.status===429){fail++;if(fail>=5){alog('Rate limit!','e');break}await slp(3000);continue}
else{fail++;if(fail>=5)break;await slp(2000);continue}}catch(e){fail++;if(fail>=5)break}
uhp('xp',Math.min(100,Math.floor(earned/amt*100)));await slp(1000)}return earned}
// ===== GEM HACK =====
async function hackGem(){
if(!_user||!_sub)throw new Error('Not connected!');
var total=0,fail=0;
while(_hr&&_ht==='gem'){
try{var rr=await gm('GET','https://www.duolingo.com/2023-05-23/users/'+_sub+'?fields=rewardBundles{rewards}');
if(rr.status!==200){fail++;if(fail>=5)break;await slp(3000);continue}
var rd=JSON.parse(rr.responseText);var gems=[];
(rd.rewardBundles||[]).forEach(function(b){(b.rewards||[]).forEach(function(rw){if(!rw.consumed&&(rw.id||'').match(/^SKILL_COMPLETION/))gems.push({id:rw.id,amount:rw.amount||0})})});
if(!gems.length){await slp(500);continue}fail=0;
var res=await Promise.all(gems.map(function(g){return gm('PATCH','https://www.duolingo.com/2023-05-23/users/'+_sub+'/rewards/'+g.id,{consumed:true,fromLanguage:_user.fromLanguage||'en',learningLanguage:_user.learningLanguage||'en'})}));
var bat=0;res.forEach(function(ok,i){if(ok.status===200)bat+=gems[i].amount||0});
if(bat>0){total+=bat;alog('+'+bat+' Gems','o');if(_user)_user.gems=(_user.gems||0)+bat}}catch(e){fail++}
uhp('gem',total>0?50:0);await slp(400)}return total}
// ===== STREAK HACK =====
async function hackStreak(days){
if(!_user||!_sub)throw new Error('Not connected!');
var done=0,fail=0;var tz=_user.timezone||Intl.DateTimeFormat().resolvedOptions().timeZone;
var base,ds=_user.streakData&&_user.streakData.currentStreak&&_user.streakData.currentStreak.startDate;
if(ds&&/^\d{4}-\d{2}-\d{2}$/.test(ds)){var p=ds.split('-');base={y:+p[0],m:+p[1],d:+p[2]}}
else{var dtf=new Intl.DateTimeFormat('en-US',{timeZone:tz,year:'numeric',month:'2-digit',day:'2-digit'});var parts={};dtf.formatToParts(new Date()).forEach(function(x){if(x.type!=='literal')parts[x.type]=x.value});base={y:+parts.year,m:+parts.month,d:+parts.day}}
function w2s(y,m,d,hh,mn,s){var g=Date.UTC(y,m-1,d,hh,mn,s);var dtf2=new Intl.DateTimeFormat('en-US',{timeZone:tz,hourCycle:'h23',year:'numeric',month:'2-digit',day:'2-digit',hour:'2-digit',minute:'2-digit',second:'2-digit'});var o={};dtf2.formatToParts(new Date(g)).forEach(function(x){if(x.type!=='literal')o[x.type]=x.value});var la=Date.UTC(+o.year,+o.month-1,+o.day,+o.hour,+o.minute,+o.second);return Math.floor((g-(la-g))/1000)}
var CH=['assist','completeReverseTranslation','dialogue','form','judge','listen','listenMatch','match','select','translate','tapComplete'];
while(_hr&&_ht==='streak'){if(done>=days)break;
var es=w2s(base.y,base.m,base.d-1-done,12,0,0);var sess=null;
try{var sr=await gm('POST','https://www.duolingo.com/2017-06-30/sessions',{challengeTypes:CH,fromLanguage:_user.fromLanguage||'en',learningLanguage:_user.learningLanguage||'en',type:'GLOBAL_PRACTICE',isFinalLevel:false,isV2:true,juicy:true,smartTipsVersion:2});if(sr.status===200){var sd=JSON.parse(sr.responseText);if(sd.id)sess=sd}}catch(e){}
if(!sess){fail++;if(fail>=5)break;await slp(2000);continue}
try{var ur=await gm('PUT','https://www.duolingo.com/2017-06-30/sessions/'+sess.id,Object.assign({},sess,{heartsLeft:5,startTime:es-1,endTime:es,enableBonusPoints:false,failed:false,maxInLessonStreak:9,shouldLearnThings:true}));
if(ur.status===200){fail=0;done++;alog('+'+done+' Streak','o');if(_user)_user.streak=(_user.streak||0)+1}else{fail++;if(fail>=5)break}}catch(e){fail++}
uhp('streak',Math.min(100,Math.floor(done/days*100)));await slp(1000)}return done}
// ===== AUTO SOLVER =====
function solveOnce(){
try{
var skips=document.querySelectorAll('[data-test="practice-hub-ad-no-thanks-button"],.vpDIE,[data-test="plus-no-thanks"],[data-test="story-start"]');
skips.forEach(function(e){if(e)e.click()});
var me=document.querySelector('[data-test="challenge"]')||document.querySelector('[data-test="stories-choice"]');
if(!me){var nb=document.querySelector('[data-test="player-next"]')||document.querySelector('[data-test="stories-player-done"]');if(nb&&!nb.disabled)nb.click();return}
var key=Object.keys(me).find(function(k){return k.startsWith('__reactFiber$')});
if(!key){var nb2=document.querySelector('[data-test="player-next"]');if(nb2&&!nb2.disabled)nb2.click();return}
var fiber=me[key];var comp=fiber;
for(var i=0;i<3;i++){var p=comp.return;while(p&&typeof p.type==='string')p=p.return;if(p)comp=p}
var sol=comp.stateNode&&comp.stateNode.props&&comp.stateNode.props.currentChallenge;
if(!sol){var nb3=document.querySelector('[data-test="player-next"]');if(nb3&&!nb3.disabled)nb3.click();return}
var t=sol.type;
if(t==='speak'||t==='listenSpeak'){var sk2=document.querySelector('[data-test="player-skip"]');if(sk2)sk2.click()}
else if(t==='translate'){var ct=sol.correctTokens,cs=sol.correctSolutions;if(ct&&ct.length){var tk=document.querySelectorAll('[data-test$="challenge-tap-token"]');var u=[];ct.forEach(function(w){for(var j=0;j<tk.length;j++){if(u.indexOf(j)<0&&tk[j].innerText.trim()===w.trim()&&!tk[j].disabled){tk[j].click();u.push(j);break}}})}else if(cs){var ta=document.querySelector('textarea[data-test="challenge-translate-input"]');if(ta){var setter=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,'value').set;setter.call(ta,cs[0]);ta.dispatchEvent(new Event('input',{bubbles:true}))}}}
else if(t==='completeReverseTranslation'){var blanks=sol.displayTokens?sol.displayTokens.filter(function(t2){return t2.isBlank}):[];var inp=document.querySelector('[data-test="challenge-text-input"]');if(blanks[0]&&inp){var s2=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,'value').set;s2.call(inp,blanks[0].text);inp.dispatchEvent(new Event('input',{bubbles:true}))}}
else if(t==='judge'||t==='dialogue'||t==='characterIntro'){var ci=sol.correctIndices?sol.correctIndices[0]:sol.correctIndex||0;var jt=document.querySelectorAll('[data-test="challenge-judge-text"]');if(jt.length&&jt[ci])jt[ci].click();else{var ch=document.querySelectorAll('[data-test="challenge-choice"]');if(ch[ci])ch[ci].click()}}
else if(t==='select'||t==='characterSelect'||t==='form'||t==='readComprehension'){var si=sol.correctIndex||0;var cards=document.querySelectorAll('[data-test="challenge-choice-card"]');if(cards.length&&cards[si])cards[si].click();else{var ch2=document.querySelectorAll('[data-test="challenge-choice"]');if(ch2[si])ch2[si].click()}}
else if(t==='listenTap'||t==='listen'){var lt=document.querySelectorAll('[data-test$="challenge-tap-token"]');var lu=[];(sol.correctTokens||[]).forEach(function(w){for(var j=0;j<lt.length;j++){if(lu.indexOf(j)<0&<[j].innerText.trim()===w.trim()&&!lt[j].disabled){lt[j].click();lu.push(j);break}}})}
else if(t==='match'){var pb=document.querySelectorAll('[data-test*="challenge-tap-token"]:not(span)');var pt=document.querySelectorAll('[data-test="challenge-tap-token-text"]');(sol.pairs||[]).forEach(function(pair){for(var j=0;j<pb.length;j++){if(pb[j].disabled)continue;var tx=pt[j].innerText.toLowerCase().trim();if(tx===(pair.learningToken||'').toLowerCase()||tx===(pair.fromToken||'').toLowerCase()){pb[j].click();break}}})}
var next=document.querySelector('[data-test="player-next"]')||document.querySelector('[data-test="stories-player-continue"]')||document.querySelector('[data-test="stories-player-done"]');
if(next&&!next.disabled&&next.getAttribute('aria-disabled')!=='true')next.click()
}catch(e){var n=document.querySelector('[data-test="player-next"]');if(n&&!n.disabled)n.click()}
}
function checkSolver(){var inL=location.pathname.includes('/lesson')||location.pathname.includes('/practice');var on=G('solver',false);if(inL&&on&&!_solverEl){_solverEl=document.createElement('div');_solverEl.style.cssText='position:fixed;bottom:20px;left:50%;transform:translateX(-50%);z-index:2147483647;display:flex;gap:12px';_solverEl.innerHTML='<button id="du-ss" style="padding:12px 24px;background:#58cc02;border:none;border-bottom:4px solid #2d9e00;border-radius:12px;color:#fff;font-weight:700;font-size:14px;cursor:pointer">SOLVE</button><button id="du-sa" style="padding:12px 24px;background:#ffc800;border:none;border-bottom:4px solid #ff9600;border-radius:12px;color:#fff;font-weight:700;font-size:14px;cursor:pointer">SOLVE ALL</button>';document.body.appendChild(_solverEl);Q('du-ss').onclick=function(){solveOnce()};Q('du-sa').onclick=function(){_isAuto=!_isAuto;var b=Q('du-sa');b.textContent=_isAuto?'STOP':'SOLVE ALL';b.style.background=_isAuto?'#ff4b4b':'#ffc800';b.style.borderBottomColor=_isAuto?'#cc0000':'#ff9600';if(_isAuto){(async function(){while(_isAuto){solveOnce();await slp(200)}})()}}}else if((!inL||!on)&&_solverEl){_solverEl.remove();_solverEl=null;_isAuto=false}}
setInterval(checkSolver,1000);
// ===== UNLOCK =====
function _unlock(key){if(!key)return;key=key.trim();if(key===ADMIN_PW){Q('du-dob').style.display='flex';setTimeout(function(){Q('du-di').focus()},100);return}if(key!==FREE_KEY){toast('Invalid key!','err');return}S('key',key);Q('du-auth').style.display='none';Q('du-main').style.display='flex';var dtb=Q('du-dtb');if(dtb){dtb.textContent='FREE';dtb.style.background='#d7ffb8';dtb.style.color='#2d6a00'}updateBadge();toast((_user?_user.username:'User')+' [FREE]','ok')}
// ===== BUILD UI =====
var el=document.createElement('div');
el.innerHTML='<div id="du-btn">👁 <span class="txt">HIDE</span></div><div id="du-panel"><div class="du-tw" id="du-tw"></div><div id="du-hd"><div style="display:flex;align-items:center;gap:10px"><span class="t">Duolingo INTEGRATION</span><span id="du-badge"></span></div><span class="g" id="du-gear">⚙</span></div><div id="du-auth"><div class="du-lb">ENTER KEY</div><div class="du-rw"><div class="du-iw"><input id="du-ki" class="du-txt" type="password" placeholder="Enter key..." autocomplete="off"></div><button class="du-b du-bp" id="du-ubtn">SUBMIT</button></div><button class="du-b du-bg du-bf" id="du-fbtn">FREE USE</button><div style="display:flex;justify-content:space-between;align-items:center"><span class="du-sm">VIP = No limits</span><a href="'+ZALO+'" target="_blank" class="du-b du-bpk" style="height:36px;font-size:12px;padding:0 12px">GET VIP KEY</a></div></div><div id="du-main" style="display:none;flex-direction:column;flex:1;min-height:0"><div style="display:flex;justify-content:space-between;align-items:center;padding:8px 14px;background:rgba(28,176,243,.08);border:1.5px solid rgba(28,176,243,.2);border-radius:10px;margin:12px 14px 0"><span style="font-size:13px;font-weight:800;color:#1cb0f3" id="du-un">...</span><span class="du-badge" id="du-dtb" style="background:#d7ffb8;color:#2d6a00">FREE</span></div><div class="du-conn"><span id="du-ico">●</span><span id="du-txt">Connecting...</span></div><div class="du-stats"><div><div class="du-sv" id="du-xp">-</div><div class="du-sl">XP</div></div><div><div class="du-sv" id="du-gm">-</div><div class="du-sl">GEMS</div></div><div><div class="du-sv" id="du-st">-</div><div class="du-sl">STREAK</div></div></div><div id="du-tabs"><button class="du-tab on" id="du-t1">SUPER</button><button class="du-tab" id="du-t2">HACK</button></div><div id="du-body"><div id="du-p1" style="display:flex;flex-direction:column;gap:12px"><div class="du-card"><div class="du-s3"><div class="du-s3t">Activate Super 3 Days</div><div class="du-s3d">Free Super Duolingo ~3 days</div><button class="du-b du-bo du-bf" id="du-s3" disabled>ACTIVATE SUPER</button></div><div class="du-log" id="du-log">Click button...</div></div></div><div id="du-p2" style="display:none;flex-direction:column;gap:12px"><div class="du-card"><div class="du-ht">Farm XP (~499XP)</div><div class="du-hr"><input type="number" class="du-in" id="du-xpi" value="5000"><button class="du-btn du-go" id="du-xpb" disabled>FARM</button></div><div class="du-prog"><div class="du-fill" id="du-f-xp"></div></div></div><div class="du-card"><div class="du-ht">Hack Gems</div><div class="du-hr"><button class="du-btn du-go du-bf" id="du-gmb" disabled>FARM GEMS</button></div><div class="du-prog"><div class="du-fill" id="du-f-gem"></div></div></div><div class="du-card"><div class="du-ht">Hack Streak</div><div class="du-hr"><input type="number" class="du-in" id="du-sti" value="100"><button class="du-btn du-go" id="du-stb" disabled>FARM</button></div><div class="du-prog"><div class="du-fill" id="du-f-streak"></div></div></div><div class="du-card"><div class="du-card-t">ACTIVITY LOG</div><div class="du-log" id="du-hlog">Ready...</div></div></div></div><div class="du-dv"></div><div class="du-ft"><span>v2026.08.15.1</span><a href="'+ZALO+'" target="_blank" style="color:#FFD700;text-decoration:none">Zalo</a></div></div></div><div id="du-dob"><div class="du-dbox"><div class="du-dtitle">ADMIN AUTH</div><div class="du-ddesc">Enter DOB (ddMMyy)</div><input type="password" id="du-di" placeholder="******" maxlength="6"><div id="du-de">Wrong!</div><div style="display:flex;gap:8px;width:100%"><button class="du-b du-bd" style="flex:1" id="du-dc">CANCEL</button><button class="du-b du-bg" style="flex:1" id="du-dk">CONFIRM</button></div></div></div><div id="du-so"></div><div id="du-sm"><div style="display:flex;justify-content:space-between;align-items:center;padding:14px;border-bottom:1px solid #333;background:linear-gradient(135deg,#1a1a0a,#0a0a1a)"><div class="du-lb" style="font-size:14px">⚙ SETTINGS</div><button class="du-b du-bd" style="height:36px;font-size:12px;padding:0 12px" id="du-csm">✕</button></div><div style="padding:12px 14px;display:flex;flex-direction:column"><div class="du-row"><div class="du-row-l"><span class="du-row-t">Custom Theme</span><span class="du-row-d">Dark red theme</span></div><div class="du-sw" id="du-swr"></div></div><div class="du-row"><div class="du-row-l"><span class="du-row-t">Super Duolingo</span><span class="du-row-d">API mod - hasPlus:true</span></div><div class="du-sw du-sw-g" id="du-sws"></div></div><div class="du-row"><div class="du-row-l"><span class="du-row-t">Max Duolingo</span><span class="du-row-d">API mod - hasPlus + hasMax</span></div><div class="du-sw du-sw-g" id="du-swm"></div></div><div class="du-row"><div class="du-row-l"><span class="du-row-t">Auto Solver</span><span class="du-row-d">Show SOLVE in lessons</span></div><div class="du-sw du-sw-b" id="du-swv"></div></div><div class="du-sbtn"><button class="du-b du-bpk" style="flex:1;height:38px;font-size:12px" id="du-ck">CHANGE KEY</button><button class="du-b du-bd" style="flex:1;height:38px;font-size:12px" id="du-rk">REMOVE KEY</button></div></div></div>';
document.body.appendChild(el);
// ===== INIT STATES =====
var sws=Q('du-sws'),swm=Q('du-swm'),swv=Q('du-swv'),swr=Q('du-swr');
if(sws)sws.classList.toggle('on',localStorage.getItem('dh_super')==='true');
if(swm)swm.classList.toggle('on',localStorage.getItem('dh_max')==='true');
if(swv)swv.classList.toggle('on',G('solver',false));
if(G('red',false)&&swr)swr.classList.add('on');
updateBadge();
// ===== EVENTS =====
Q('du-btn').onclick=function(){var p=Q('du-panel');var t=this.querySelector('.txt');if(!p||!t)return;if(t.textContent==='HIDE'){p.style.display='none';t.textContent='SHOW'}else{p.style.display='flex';t.textContent='HIDE'}};
Q('du-gear').onclick=function(){Q('du-so').style.display='block';Q('du-sm').style.display='flex'};
Q('du-csm').onclick=function(){Q('du-so').style.display='none';Q('du-sm').style.display='none'};
Q('du-so').onclick=function(){Q('du-so').style.display='none';Q('du-sm').style.display='none'};
Q('du-t1').onclick=function(){Q('du-t1').classList.add('on');Q('du-t2').classList.remove('on');Q('du-p1').style.display='flex';Q('du-p2').style.display='none'};
Q('du-t2').onclick=function(){Q('du-t2').classList.add('on');Q('du-t1').classList.remove('on');Q('du-p2').style.display='flex';Q('du-p1').style.display='none'};
Q('du-fbtn').onclick=function(){_unlock(FREE_KEY)};
Q('du-ubtn').onclick=function(){var k=Q('du-ki').value.trim();if(k)_unlock(k)};
Q('du-ki').onkeydown=function(e){if(e.key==='Enter'){var k=this.value.trim();if(k)_unlock(k)}};
Q('du-s3').onclick=function(){activateSuper()};
Q('du-ck').onclick=function(){Q('du-so').style.display='none';Q('du-sm').style.display='none';S('key','');Q('du-main').style.display='none';Q('du-auth').style.display='';Q('du-ki').value='';Q('du-ki').focus();toast('Enter new key','info')};
Q('du-rk').onclick=function(){if(!confirm('Remove key?'))return;Q('du-so').style.display='none';Q('du-sm').style.display='none';S('key','');Q('du-main').style.display='none';Q('du-auth').style.display='';Q('du-ki').value='';toast('Key removed','ok')};
Q('du-dk').onclick=function(){var di=Q('du-di');if(di.value.trim()===ADMIN_DOB){Q('du-dob').style.display='none';di.value='';Q('du-de').style.display='none';S('key',ADMIN_PW);Q('du-auth').style.display='none';Q('du-main').style.display='flex';var dtb=Q('du-dtb');if(dtb){dtb.textContent='ADMIN';dtb.style.background='linear-gradient(135deg,#ff4b4b,#ff0000)';dtb.style.color='#fff'}updateBadge();toast('ADMIN','ok')}else{Q('du-de').style.display='';di.value='';toast('Wrong!','err')}};
Q('du-di').onkeydown=function(e){if(e.key==='Enter')Q('du-dk').click()};
Q('du-dc').onclick=function(){Q('du-dob').style.display='none';Q('du-di').value='';Q('du-de').style.display='none'};
// ===== SUPER/MAX TOGGLES - INDEPENDENT =====
Q('du-sws').onclick=function(){
var on=localStorage.getItem('dh_super')==='true';
var next=!on;
localStorage.setItem('dh_super',next?'true':'false');
this.classList.toggle('on',next);
updateBadge();
toast(next?'Super ON':'Super OFF',next?'ok':'info');
if(on!==next){setTimeout(function(){location.reload()},800)}
};
Q('du-swm').onclick=function(){
var on=localStorage.getItem('dh_max')==='true';
var next=!on;
localStorage.setItem('dh_max',next?'true':'false');
this.classList.toggle('on',next);
updateBadge();
toast(next?'Max ON':'Max OFF',next?'ok':'info');
if(on!==next){setTimeout(function(){location.reload()},800)}
};
Q('du-swv').onclick=function(){var next=!G('solver',false);S('solver',next);this.classList.toggle('on',next);toast(next?'Solver ON':'Solver OFF','ok')};
Q('du-swr').onclick=function(){var on=this.classList.toggle('on');S('red',on)};
// ===== HACK BUTTONS =====
Q('du-xpb').onclick=async function(){var btn=this;if(_hr&&_ht==='xp'){_hr=false;_ht=null;btn.textContent='FARM';btn.className='du-btn du-go';return}var v=parseInt(Q('du-xpi').value)||5000;_hr=true;_ht='xp';btn.textContent='STOP';btn.className='du-btn du-stp';alogC();alog('Farming XP...','i');uhp('xp',0);try{var e=await hackXP(v);if(e>0){alog('+'+e+' XP!','o');toast('+'+e+' XP!','ok');uhp('xp',100);var x=Q('du-xp');if(x&&_user)x.textContent=(_user.totalXp||0).toLocaleString()}}catch(ex){alog(ex.message,'e');toast(ex.message,'err')}_hr=false;_ht=null;btn.textContent='FARM';btn.className='du-btn du-go'};
Q('du-gmb').onclick=async function(){var btn=this;if(_hr&&_ht==='gem'){_hr=false;_ht=null;btn.textContent='FARM GEMS';btn.className='du-btn du-go';return}_hr=true;_ht='gem';btn.textContent='STOP';btn.className='du-btn du-stp';alogC();alog('Hacking Gems...','i');uhp('gem',0);try{var g=await hackGem();if(g>0){alog('+'+g+' Gems!','o');toast('+'+g+' Gems!','ok');uhp('gem',100);var x=Q('du-gm');if(x&&_user)x.textContent=(_user.gems||0).toLocaleString()}}catch(ex){alog(ex.message,'e');toast(ex.message,'err')}_hr=false;_ht=null;btn.textContent='FARM GEMS';btn.className='du-btn du-go'};
Q('du-stb').onclick=async function(){var btn=this;if(_hr&&_ht==='streak'){_hr=false;_ht=null;btn.textContent='FARM';btn.className='du-btn du-go';return}var v=parseInt(Q('du-sti').value)||100;_hr=true;_ht='streak';btn.textContent='STOP';btn.className='du-btn du-stp';alogC();alog('Hacking Streak...','i');uhp('streak',0);try{var s2=await hackStreak(v);if(s2>0){alog('+'+s2+' Streak!','o');toast('+'+s2+'!','ok');uhp('streak',100);var x=Q('du-st');if(x&&_user)x.textContent=_user.streak||0}}catch(ex){alog(ex.message,'e');toast(ex.message,'err')}_hr=false;_ht=null;btn.textContent='FARM';btn.className='du-btn du-go'};
// ===== START =====
console.log('[DUO] UI mounted');
toast('v2026.08.15.1 Ready','info');
connect();
})();