blogspot/dist/tai-lieu.min.js · Tủ sách lý luận nạp từ kho (__khoRun) thay cho Cloudflare; gốc a7d6c97

/* tai-lieu.min.js ban chay tu kho (goc a7d6c97): Tu sach ly luan nap tu kho (ly-luan-thu-phap/ly-luan-thu-phap.kho.js) bang __khoRun thay cho script Cloudflare. Phan con lai giu nguyen. */
/* kho-get v1: lay file tu kho jsthanhphong theo duong dan (JSONP + nho trong IndexedDB "kho"). Dung chung cho cac file .kho.js can tai them du lieu luc dang chay. */
(function(w,d){if(w.__khoGet)return;var B='https://jsthanhphong.blogspot.com/feeds/posts/',n=0,mem={};function lab(p){return 'f-'+String(p).toLowerCase().replace(/[^a-z0-9]+/g,'-').replace(/^-+|-+$/g,'')}function dec(h){var p=new DOMParser().parseFromString(h,'text/html').querySelector('pre');if(!p)return '';p.querySelectorAll('br').forEach(function(b){b.replaceWith('\n')});var t=p.textContent;if(/kho-b64/.test(p.className))t=new TextDecoder().decode(Uint8Array.from(atob(t.replace(/\s+/g,'')),function(x){return x.charCodeAt(0)}));return t}function pid(e){return String(e.id.$t).split('.post-')[1]}function jsonp(kind,p){return new Promise(function(ok,fail){var c='khoG'+Date.now().toString(36)+(n++),s=d.createElement('script'),t=setTimeout(function(){end();fail(new Error('Kho khong phan hoi: '+p))},25000);function end(){clearTimeout(t);try{delete w[c]}catch(e){w[c]=void 0}if(s.parentNode)s.parentNode.removeChild(s)}w[c]=function(x){end();var e=((x.feed||{}).entry||[])[0];if(e)ok(e);else fail(new Error('Kho khong co file '+p))};s.onerror=function(){end();fail(new Error('Khong tai duoc '+p))};s.async=true;s.src=B+kind+'/-/'+lab(p)+'?alt=json-in-script&max-results=1&orderby=published&callback='+c;d.head.appendChild(s)})}function db(){return new Promise(function(ok){var t=setTimeout(function(){ok(null)},800);try{var o=w.indexedDB.open('kho',1);o.onupgradeneeded=function(){o.result.createObjectStore('f')};o.onsuccess=function(){clearTimeout(t);ok(o.result)};o.onerror=function(){clearTimeout(t);ok(null)}}catch(e){clearTimeout(t);ok(null)}})}function rd(D,p){return new Promise(function(ok){if(!D)return ok(null);try{var g=D.transaction('f').objectStore('f').get(p);g.onsuccess=function(){ok(g.result||null)};g.onerror=function(){ok(null)}}catch(e){ok(null)}})}function full(D,p){return jsonp('default',p).then(function(e){var s=dec(e.content.$t);if(!s)throw new Error('Kho tra ve noi dung rong: '+p);try{if(D)D.transaction('f','readwrite').objectStore('f').put({id:pid(e),code:s},p)}catch(z){}return s})}w.__khoGet=function(p){if(mem[p])return mem[p];return mem[p]=db().then(function(D){return rd(D,p).then(function(v){if(v&&typeof v.code==='string'){jsonp('summary',p).then(function(e){if(pid(e)!==v.id)return full(D,p)}).catch(function(){});return v.code}return full(D,p)})}).catch(function(err){delete mem[p];throw err})};w.__khoRun=function(p){return w.__khoGet(p).then(function(s){(0,eval)(s+'\n//# sourceURL=kho/'+p)})}})(window,document);
/* Thư Đạo · tai-lieu · nguồn: blogspot/pages/tai-lieu.html */
(function(I,C,H,J){var d=document,w=window,r=d.getElementById(I);if(!r||r.getAttribute("data-on"))return;r.setAttribute("data-on","1");if(C){var st=d.createElement("style");st.textContent=C;d.head.appendChild(st);}r.insertAdjacentHTML("beforebegin",H);r.parentNode.removeChild(r);var late=d.readyState!=="loading";function fire(t,f,o){var e=new Event(t);setTimeout(function(){typeof f==="function"?f.call(o,e):f&&f.handleEvent&&f.handleEvent(e);});}if(late){d.addEventListener=function(t,f){if(t==="DOMContentLoaded")return fire(t,f,d);return EventTarget.prototype.addEventListener.apply(this,arguments);};w.addEventListener=function(t,f){if(t==="DOMContentLoaded"||(t==="load"&&d.readyState==="complete"))return fire(t,f,w);return EventTarget.prototype.addEventListener.apply(this,arguments);};}try{for(var i=0;i<J.length;i++){var s=d.createElement("script");s.textContent=J[i];d.body.appendChild(s);}}finally{if(late){delete d.addEventListener;delete w.addEventListener;}}if(w.__tdpFriendly)w.__tdpFriendly(I);})("tdp-tai-lieu","#tpCalligraphyLibrary{--ink:#29251f;--soft:#665f56;--brown:#86613b;--dark:#604326;--gold:#b39468;--paper:#f7f2e8;--light:#fffdf8;--line:#e4dbcc;--red:#a54135;font-family:Georgia,Times New Roman,serif;color:var(--ink)}#tpCalligraphyLibrary,#tpCalligraphyLibrary *{box-sizing:border-box}#tpCalligraphyLibrary button,#tpCalligraphyLibrary input{font:inherit}#tpCalligraphyLibrary .tp-login{min-height:100vh;display:flex;justify-content:center;align-items:flex-start;padding:18px 12px;background:var(--paper)}#tpCalligraphyLibrary .tp-login-box{width:100%;max-width:520px;padding:30px 18px;background:var(--light);border:1px solid var(--line);box-shadow:0 12px 35px #46341e14;text-align:center}#tpCalligraphyLibrary .tp-seal{width:56px;height:56px;margin:0 auto 17px;display:flex;align-items:center;justify-content:center;border:1px solid var(--brown);color:var(--brown);font-size:26px}#tpCalligraphyLibrary .tp-eye{color:var(--brown);font-size:10px;font-weight:700;letter-spacing:2px}#tpCalligraphyLibrary .tp-login h2{margin:8px 0 0;font-size:27px}#tpCalligraphyLibrary .tp-desc{max-width:430px;margin:12px auto 19px;color:var(--soft);font-size:13px;line-height:1.7}#tpCalligraphyLibrary .tp-login-form{display:grid;grid-template-columns:1fr;gap:8px}#tpCalligraphyLibrary .tp-input{width:100%;height:47px;padding:0 13px;border:1px solid #e4dbcc;background:#fff;outline:0}#tpCalligraphyLibrary .tp-main-btn{min-height:47px;border:0;background:var(--dark);color:#fff;cursor:pointer;font-size:12px;font-weight:700}#tpCalligraphyLibrary .tp-main-btn:disabled{opacity:.6;cursor:default}#tpCalligraphyLibrary .tp-msg{min-height:19px;margin-top:8px;color:var(--red);font-size:11.5px}#tpCalligraphyLibrary .tp-up-check{display:none}#tpCalligraphyLibrary .tp-up-label{display:flex;align-items:center;justify-content:center;gap:9px;margin-top:18px;padding-top:15px;border-top:1px solid var(--line);color:var(--dark);cursor:pointer}#tpCalligraphyLibrary .tp-up-label small{display:block;color:var(--soft);font-size:10px}#tpCalligraphyLibrary .tp-chev{width:8px;height:8px;border-right:1px solid currentColor;border-bottom:1px solid currentColor;transform:rotate(45deg)}#tpCalligraphyLibrary .tp-up-check:checked+.tp-up-label .tp-chev{transform:rotate(225deg)}#tpCalligraphyLibrary .tp-upgrade{display:none;margin-top:12px;padding:15px;border:1px solid var(--line);background:#faf7f0;text-align:left;font-size:11.5px}#tpCalligraphyLibrary .tp-up-check:checked~.tp-upgrade{display:block}#tpCalligraphyLibrary .tp-price{display:flex;justify-content:space-between;margin:11px 0;padding:9px 0;border-top:1px dashed #e4dbcc;border-bottom:1px dashed #e4dbcc}#tpCalligraphyLibrary .tp-price strong{color:#a54135;font-size:18px}#tpCalligraphyLibrary .tp-bank{margin-top:11px;padding:9px 11px;border:1px solid var(--line);background:#fff}#tpCalligraphyLibrary .tp-bank div{display:flex;justify-content:space-between;gap:10px;padding:5px 0;border-bottom:1px dashed #eee4d7}#tpCalligraphyLibrary .tp-bank div:last-child{border:0}#tpCalligraphyLibrary .tp-bank span{color:var(--soft)}#tpCalligraphyLibrary .tp-red{color:var(--red)}#tpCalligraphyLibrary .tp-qr{text-align:center;margin-top:13px}#tpCalligraphyLibrary .tp-qr img{width:180px;max-width:100%;display:block;margin:8px auto;border:1px solid var(--line)}#tpCalligraphyLibrary .tp-note{margin-top:11px;padding:9px 10px;border-left:3px solid var(--gold);background:#fffaf1;color:var(--soft);line-height:1.6}#tpCalligraphyLibrary .tp-up-benefits{margin:12px 0;padding:12px;border:1px solid var(--line);background:#fff}#tpCalligraphyLibrary .tp-up-benefits-title{margin-bottom:7px;color:var(--dark);font-weight:700}#tpCalligraphyLibrary .tp-up-benefit{display:flex;gap:8px;padding:7px 0;border-bottom:1px dashed #eee4d7}#tpCalligraphyLibrary .tp-up-benefit:last-child{border:0}#tpCalligraphyLibrary .tp-up-benefit-icon{width:19px;height:19px;flex:none;display:flex;align-items:center;justify-content:center;border:1px solid #d8c9b5;border-radius:50%}#tpCalligraphyLibrary .tp-library{display:none;width:100%;max-width:1220px;margin:auto;padding:12px;background:var(--paper)}#tpCalligraphyLibrary .tp-welcome{display:none;margin-bottom:13px;padding:15px;border:1px solid #d8c9b5;background:var(--light)}#tpCalligraphyLibrary .tp-w-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;padding-bottom:12px;border-bottom:1px solid #e4dbcc}#tpCalligraphyLibrary .tp-w-identity{min-width:0;flex:1;display:flex;align-items:center;gap:10px}#tpCalligraphyLibrary .tp-w-avatar{width:48px;height:48px;flex:0 0 48px;display:flex;align-items:center;justify-content:center;overflow:hidden;border:1px solid #d8c9b5;border-radius:50%;background:#faf7f0;color:#86613b;font-size:20px}#tpCalligraphyLibrary .tp-w-avatar img{width:100%;height:100%;display:block;object-fit:cover}#tpCalligraphyLibrary .tp-w-user{min-width:0;flex:1}#tpCalligraphyLibrary .tp-w-small{color:#86613b;font-size:9px;font-weight:700;letter-spacing:1.5px}#tpCalligraphyLibrary .tp-w-name{margin:4px 0 0;font-size:18px}#tpCalligraphyLibrary .tp-w-code{margin-top:4px;color:#665f56;font-size:10px}#tpCalligraphyLibrary .tp-head-assets{width:auto;max-width:260px;display:flex;flex-direction:column;align-items:flex-end;gap:5px}#tpCalligraphyLibrary .tp-asset-label{color:#86613b;font-size:7px;font-weight:700;letter-spacing:.8px;text-transform:uppercase}#tpCalligraphyLibrary .tp-header-gems{max-width:180px;display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:3px}#tpCalligraphyLibrary .tp-head-gem{display:inline-flex;align-items:center;gap:2px;min-height:19px;padding:2px 4px 2px 2px;border:1px solid #e4dbcc;border-radius:5px;background:#faf7f0;font-size:8px}#tpCalligraphyLibrary .tp-head-gem img{width:13px;height:13px;object-fit:contain}#tpCalligraphyLibrary .tp-head-gem strong{font-size:8px;line-height:1}#tpCalligraphyLibrary .tp-no-gem{padding:3px 5px;border:1px solid #e4dbcc;border-radius:5px;color:#665f56;font-size:8px}#tpCalligraphyLibrary .tp-header-items{width:100%;max-width:260px;display:flex;justify-content:flex-end;flex-wrap:wrap;gap:4px}#tpCalligraphyLibrary .tp-head-item{max-width:135px;display:flex;align-items:center;gap:4px;min-height:25px;padding:3px 5px 3px 3px;border:1px solid #e4dbcc;border-radius:6px;background:#fffdf8}#tpCalligraphyLibrary .tp-head-item-image{width:18px;height:18px;flex:0 0 18px;display:flex;align-items:center;justify-content:center;overflow:hidden;border:1px solid #eadfce;border-radius:4px;background:#faf7f0;color:#86613b;font-size:10px}#tpCalligraphyLibrary .tp-head-item-image img{width:100%;height:100%;display:block;object-fit:contain}#tpCalligraphyLibrary .tp-head-item-info{min-width:0;display:flex;align-items:center;gap:3px}#tpCalligraphyLibrary .tp-head-item-name{max-width:88px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#49392c;font-size:7.5px;line-height:1.2}#tpCalligraphyLibrary .tp-head-item-qty{flex:none;color:#a54135;font-size:8px;font-weight:700}#tpCalligraphyLibrary .tp-no-item{padding:3px 5px;border:1px solid #e4dbcc;border-radius:5px;color:#665f56;font-size:8px}#tpCalligraphyLibrary .tp-summary{display:grid;grid-template-columns:1fr 1fr;gap:7px;margin-top:11px}#tpCalligraphyLibrary .tp-s-card{padding:9px;border:1px solid #e4dbcc;background:#faf7f0}#tpCalligraphyLibrary .tp-s-card span{display:block;margin-bottom:3px;color:#665f56;font-size:9px}#tpCalligraphyLibrary .tp-w-title{margin:15px 0 8px;color:#604326;font-size:11.5px;font-weight:700}#tpCalligraphyLibrary .tp-gifts{display:grid;grid-template-columns:1fr;gap:7px}#tpCalligraphyLibrary .tp-gift{display:flex;gap:9px;padding:10px;border:1px solid #e4dbcc;background:#faf7f0}#tpCalligraphyLibrary .tp-gift-icon{width:38px;height:38px;flex:none;display:flex;align-items:center;justify-content:center;border:1px solid #d8c9b5;background:#fff;font-size:20px}#tpCalligraphyLibrary .tp-gift strong{display:block;margin-bottom:3px;font-size:11.5px}#tpCalligraphyLibrary .tp-gift p{margin:0;color:#665f56;font-size:10px}#tpCalligraphyLibrary .tp-intro{margin:25px 0;padding:18px;border:1px solid var(--line);background:var(--light)}#tpCalligraphyLibrary .tp-intro h2{margin:0 0 7px}#tpCalligraphyLibrary .tp-intro p{margin:0;color:#665f56;font-size:12px;line-height:1.7}#tpCalligraphyLibrary .tp-sec{display:flex;align-items:center;gap:10px;margin:32px 0 16px}#tpCalligraphyLibrary .tp-sec h2{margin:0;white-space:nowrap;font-size:21px}#tpCalligraphyLibrary .tp-line{height:1px;flex:1;background:#e4dbcc}#tpCalligraphyLibrary .tp-videos{display:grid;grid-template-columns:1fr;gap:14px}#tpCalligraphyLibrary .tp-video{overflow:hidden;border:1px solid #e4dbcc;background:#fffdf8}#tpCalligraphyLibrary .tp-video.low{border-color:#d5b58a}#tpCalligraphyLibrary .tp-thumb{position:relative;aspect-ratio:16/9;overflow:hidden;background:#e5dfd5;cursor:pointer;touch-action:manipulation}#tpCalligraphyLibrary .tp-thumb img{width:100%;height:100%;object-fit:cover;pointer-events:none}#tpCalligraphyLibrary .tp-play{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none}#tpCalligraphyLibrary .tp-play:before{content:\"\";width:56px;height:56px;display:block;border-radius:50%;background:#1f1914d1}#tpCalligraphyLibrary .tp-play:after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-38%,-50%);width:0;height:0;border-top:9px solid transparent;border-bottom:9px solid transparent;border-left:14px solid #fff}#tpCalligraphyLibrary .tp-v-info{padding:14px}#tpCalligraphyLibrary .tp-v-meta{display:flex;justify-content:space-between;gap:7px}#tpCalligraphyLibrary .tp-lesson{color:#86613b;font-size:9px;font-weight:700}#tpCalligraphyLibrary .tp-level-tag{padding:4px 7px;border-radius:99px;background:#f2ebe0;font-size:9px}#tpCalligraphyLibrary .tp-level-tag.high{background:#fff0e4;color:#a6542f}#tpCalligraphyLibrary .tp-v-info h3{margin:6px 0;font-size:17px}#tpCalligraphyLibrary .tp-v-info p{margin:0;color:#665f56;font-size:11px}#tpCalligraphyLibrary .tp-watch{margin-top:10px;border:0;background:none;color:#604326;cursor:pointer;font-weight:700;touch-action:manipulation}#tpCalligraphyLibrary .tp-pages{display:none;align-items:center;justify-content:center;gap:8px;margin-top:18px}#tpCalligraphyLibrary .tp-page{min-height:37px;padding:0 12px;border:1px solid #e4dbcc;background:#fffdf8;cursor:pointer}#tpCalligraphyLibrary .tp-page:disabled{opacity:.35}#tpCalligraphyLibrary .tp-docs{display:grid;grid-template-columns:1fr;gap:10px}#tpCalligraphyLibrary .tp-doc{display:flex;align-items:center;gap:12px;padding:14px;border:1px solid #e4dbcc;background:#fffdf8;color:inherit;text-decoration:none}#tpCalligraphyLibrary .tp-tusach{margin-top:14px;border:1px solid #e4dbcc;background:#fffdf8;padding:8px 6px 4px}#tpCalligraphyLibrary .tp-tusach-bar{display:flex;justify-content:flex-end;padding:0 6px}#tpCalligraphyLibrary .tp-tusach-close{border:1px solid #b39468;background:#fff;color:#604326;padding:8px 14px;cursor:pointer}#tpCalligraphyLibrary .tp-tusach #ly-luan-thu-phap{margin:8px auto 12px}#tpCalligraphyLibrary .tp-doc-icon{flex:0 0 45px;width:45px;height:45px;display:flex;align-items:center;justify-content:center;border:1px solid #b39468;color:#86613b;font-size:20px}#tpCalligraphyLibrary .tp-status{grid-column:1/-1;padding:30px 12px;border:1px solid #e4dbcc;background:#fffdf8;color:#665f56;text-align:center}#tpCalligraphyLibrary .tp-spinner{width:28px;height:28px;margin:0 auto 10px;border:2px solid #e4dbcc;border-top-color:#86613b;border-radius:50%;animation:tpSpin .7s linear infinite}@keyframes tpSpin{to{transform:rotate(360deg)}}#tpCalligraphyLibrary .tp-modal{position:fixed;inset:0;z-index:999999;display:none;align-items:center;justify-content:center;padding:12px;background:#14110ed1}#tpCalligraphyLibrary .tp-modal.open{display:flex}#tpCalligraphyLibrary .tp-warning{width:100%;max-width:440px;padding:22px 18px;border:1px solid #e4dbcc;background:#fffdf8;text-align:center}#tpCalligraphyLibrary .tp-score-box{display:grid;grid-template-columns:1fr 1fr;gap:7px;margin:13px 0}#tpCalligraphyLibrary .tp-score-box div{padding:9px;border:1px solid #e4dbcc;background:#faf7f0}#tpCalligraphyLibrary .tp-warning-actions{display:grid;gap:7px}#tpCalligraphyLibrary .tp-warning-actions button{min-height:41px;border:0;font-weight:700;cursor:pointer;touch-action:manipulation}#tpCalligraphyLibrary .tp-practice{background:#604326;color:#fff}#tpCalligraphyLibrary .tp-anyway{background:#eee4d6}#tpCalligraphyLibrary .tp-cancel{border:1px solid #e4dbcc!important;background:#fff}@media(max-width:649px){#tpCalligraphyLibrary .tp-w-head{gap:8px}#tpCalligraphyLibrary .tp-w-avatar{width:42px;height:42px;flex-basis:42px}#tpCalligraphyLibrary .tp-w-identity{gap:7px}#tpCalligraphyLibrary .tp-head-assets,#tpCalligraphyLibrary .tp-header-items{max-width:150px}#tpCalligraphyLibrary .tp-head-item{max-width:78px}#tpCalligraphyLibrary .tp-head-item-name{max-width:43px}}@media(min-width:650px){#tpCalligraphyLibrary .tp-login{align-items:center}#tpCalligraphyLibrary .tp-login-form{grid-template-columns:1fr auto!important}#tpCalligraphyLibrary .tp-summary{grid-template-columns:repeat(3,1fr)}#tpCalligraphyLibrary .tp-gifts{grid-template-columns:1fr 1fr}#tpCalligraphyLibrary .tp-videos,#tpCalligraphyLibrary .tp-docs{grid-template-columns:repeat(2,1fr)}}@media(min-width:980px){#tpCalligraphyLibrary .tp-videos{grid-template-columns:repeat(3,1fr)}}#tpCalligraphyLibrary .tp-welcome.tp-has-background{background-size:cover;background-position:center;background-repeat:no-repeat}#tpCalligraphyLibrary .tp-welcome.tp-has-background .tp-w-head,#tpCalligraphyLibrary .tp-welcome.tp-has-background .tp-summary,#tpCalligraphyLibrary .tp-welcome.tp-has-background .tp-score-box{background:#fffdf8e6;border-radius:8px;padding:10px}#tpCalligraphyLibrary .tp-w-avatar{position:relative;overflow:visible;border:0;background:transparent;isolation:isolate}#tpCalligraphyLibrary .tp-avatar-face{width:100%;height:100%;display:flex;align-items:center;justify-content:center;border:1px solid #d8c9b5;border-radius:50%;overflow:hidden;background:#faf7f0}#tpCalligraphyLibrary .tp-w-avatar img.tp-avatar-frame{position:absolute;inset:-18%;width:136%;height:136%;max-width:none;object-fit:contain;z-index:2;pointer-events:none;border:0;border-radius:0}#tpCalligraphyLibrary .tp-w-identity{gap:16px}#tpCalligraphyLibrary .tp-name-effect{position:relative;display:inline-flex;max-width:100%}#tpCalligraphyLibrary .tp-name-effect.reward-multitask-wrap{margin:10px 18px}#tpCalligraphyLibrary .reward-multitask-name{animation:tpPotionColor 2.8s linear infinite,tpPotionGlow 1.6s ease-in-out infinite alternate}#tpCalligraphyLibrary .reward-multitask-star{position:absolute;z-index:3;pointer-events:none;line-height:1;color:#fbbf24;font-size:13px;text-shadow:0 0 6px #fff;animation:tpPotionStar 1.6s ease-in-out infinite}#tpCalligraphyLibrary .reward-multitask-star-left{left:-16px;top:-8px}#tpCalligraphyLibrary .reward-multitask-star-right{right:-16px;top:-8px;animation-delay:.35s}#tpCalligraphyLibrary .reward-multitask-star-bottom-left{left:-10px;bottom:-8px;animation-delay:.7s}#tpCalligraphyLibrary .reward-multitask-star-bottom-right{right:-10px;bottom:-8px;animation-delay:1.05s}@keyframes tpPotionColor{0%,to{color:#b7791f}25%{color:#db2777}50%{color:#7c3aed}75%{color:#0284c7}}@keyframes tpPotionGlow{0%{text-shadow:0 0 2px #fbbf24}to{text-shadow:0 0 8px #fbbf24}}@keyframes tpPotionStar{0%,to{opacity:.35;transform:scale(.7)}50%{opacity:1;transform:scale(1.1)}}@media(prefers-reduced-motion:reduce){#tpCalligraphyLibrary .reward-multitask-name,#tpCalligraphyLibrary .reward-multitask-star{animation:none}}#tpCalligraphyLibrary{--paper:#f8f5ef;--light:#fffefa;--line:#e7dfd3;--dark:#514538}#tpCalligraphyLibrary .tp-library{max-width:1180px;padding:24px 16px 48px}#tpCalligraphyLibrary .tp-library-hero{padding:36px 26px;border:1px solid var(--line);border-radius:20px;background:linear-gradient(120deg,#eee7d8,#fffdf7);margin-bottom:18px}#tpCalligraphyLibrary .tp-library-hero .tp-eye{margin-bottom:12px}#tpCalligraphyLibrary .tp-library-hero h1{font-size:clamp(25px,5vw,38px);line-height:1.25;margin:0 0 12px;color:var(--dark)}#tpCalligraphyLibrary .tp-library-hero p{font-size:14px;line-height:1.8;max-width:680px;color:var(--soft);margin:0}#tpCalligraphyLibrary .tp-library-state{display:flex;flex-wrap:wrap;gap:8px;margin-top:20px;font-family:Arial,sans-serif}#tpCalligraphyLibrary .tp-state-pill{padding:7px 12px;border-radius:99px;background:#fffefa;border:1px solid var(--line);font-size:11px}#tpCalligraphyLibrary .tp-profile-panel{display:none;margin:0 0 24px;border:1px solid var(--line);border-radius:12px;background:var(--light)}#tpCalligraphyLibrary .tp-profile-panel summary{cursor:pointer;padding:15px 18px;color:var(--dark);font-family:Arial,sans-serif;font-weight:700;font-size:13px}#tpCalligraphyLibrary .tp-profile-hint{font-size:10px;color:var(--soft);font-weight:400;margin-left:8px}#tpCalligraphyLibrary .tp-profile-panel .tp-welcome{border:0;border-top:1px solid var(--line);margin:0;border-radius:0 0 12px 12px}#tpCalligraphyLibrary .tp-intro{padding:20px 0;background:transparent;border:0}#tpCalligraphyLibrary .tp-sec{margin:28px 0 14px}#tpCalligraphyLibrary .tp-section-note{color:var(--soft);font-size:12px;line-height:1.7;margin:0 0 16px}#tpCalligraphyLibrary .tp-video{border-radius:14px;box-shadow:0 5px 18px #41301d0a}#tpCalligraphyLibrary .tp-v-info{padding:17px}#tpCalligraphyLibrary .tp-v-info h3{line-height:1.45}#tpCalligraphyLibrary .tp-video.locked{background:#f2eee7}#tpCalligraphyLibrary .tp-video.locked .tp-thumb{cursor:default}#tpCalligraphyLibrary .tp-video.locked .tp-thumb img{filter:saturate(.25);opacity:.65}#tpCalligraphyLibrary .tp-video.locked .tp-play:before{background:#7b7265}#tpCalligraphyLibrary .tp-video.locked .tp-watch{background:#e6dfd3;color:#76694f;cursor:not-allowed}#tpCalligraphyLibrary .tp-doc{border-radius:12px}#tpCalligraphyLibrary .tp-pages{margin:18px 0 26px}@media(min-width:720px){#tpCalligraphyLibrary .tp-videos{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:1050px){#tpCalligraphyLibrary .tp-videos{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(max-width:649px){#tpCalligraphyLibrary .tp-library{padding:14px 10px 32px}#tpCalligraphyLibrary .tp-library-hero{padding:26px 20px}#tpCalligraphyLibrary .tp-profile-hint{display:block;margin:5px 0 0 17px}}#tpCalligraphyLibrary .tp-upgrade-video-body{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:265px;padding:30px 22px;text-align:center;background:#f1ece3;height:100%}#tpCalligraphyLibrary .tp-upgrade-video-icon{font-size:30px;margin-bottom:16px}#tpCalligraphyLibrary .tp-upgrade-video-body h3{font-size:19px;line-height:1.55;margin:14px 0;color:var(--dark)}#tpCalligraphyLibrary .tp-upgrade-video-body p{font-size:12px;line-height:1.7;margin:0;color:var(--soft)}#tpCalligraphyLibrary .tp-card-payment{width:100%;margin-top:20px;padding-top:18px;border-top:1px solid #d8c9b5;text-align:left;font-family:Arial,sans-serif;font-size:11px}#tpCalligraphyLibrary .tp-card-payment>strong{display:block;line-height:1.6;color:var(--dark)}#tpCalligraphyLibrary .tp-card-payment-row{display:flex;flex-wrap:wrap;justify-content:space-between;gap:5px;padding:7px 0;border-bottom:1px dashed #e0d7c9}#tpCalligraphyLibrary .tp-card-payment-row strong{overflow-wrap:anywhere}#tpCalligraphyLibrary .tp-card-payment p{margin:12px 0 5px;font-size:11px}#tpCalligraphyLibrary .tp-card-payment .tp-card-transfer-info{color:var(--red);overflow-wrap:anywhere}#tpCalligraphyLibrary .tp-card-upgrade-qr{display:block;width:190px;max-width:100%;height:auto;margin:12px auto;border:1px solid var(--line);border-radius:8px}#tpCalligraphyLibrary .tp-card-payment-note{line-height:1.7}.tdp-page{-webkit-text-size-adjust:100%;text-size-adjust:100%}.tdp-page img,.tdp-page video,.tdp-page canvas{max-width:100%}.tdp-page button,.tdp-page [role=button],.tdp-page a,.tdp-page input,.tdp-page select,.tdp-page textarea,.tdp-page label{touch-action:manipulation;-webkit-tap-highlight-color:rgba(176,107,44,.18)}.tdp-page button:not([hidden]),.tdp-page [role=button],.tdp-page .nut,.tdp-page a[class*=btn],.tdp-page a[class*=button],.tdp-page a[class*=cta],.tdp-page a[class*=Cta]{min-height:44px}.tdp-page input:not([type=checkbox]):not([type=radio]):not([type=hidden]):not([type=range]):not([type=file]),.tdp-page select,.tdp-page textarea{min-height:44px;font-size:max(16px,1em)}.tdp-page input[type=checkbox],.tdp-page input[type=radio]{width:22px;height:22px;min-height:0}.tdp-page button:active,.tdp-page [role=button]:active,.tdp-page .nut:active{transform:scale(.97);filter:brightness(.92)}.tdp-page :is(button,a,input,select,textarea,[role=button],[tabindex]):focus-visible{outline:3px solid #b06b2c;outline-offset:2px}@media(prefers-reduced-motion:reduce){.tdp-page *{animation-duration:.01ms!important;transition-duration:.01ms!important}}","<div class=\"tdp-page\"><div id=\"tpCalligraphyLibrary\">\n<div class=\"tp-login\" id=\"tpLoginScreen\">\n<div class=\"tp-login-box\">\n<div class=\"tp-seal\">書</div>\n<div class=\"tp-eye\">THANH PHONG THƯ MÔN</div>\n<h2>Kho tài liệu học viên</h2>\n<p class=\"tp-desc\">\nNhập Mã học viên hoặc Mã trợ giảng để xem thư viện video và bài giảng theo khóa.\n</p>\n<div class=\"tp-login-form\">\n<input autocomplete=\"off\" class=\"tp-input\" id=\"tpPasswordInput\" onkeydown=\"tpPasswordKey(event)\" placeholder=\"Nhập Mã học viên...\" type=\"text\" />\n<button class=\"tp-main-btn\" id=\"tpLoginButton\" onclick=\"tpLogin()\" type=\"button\">\nĐăng nhập\n</button>\n</div>\n<div class=\"tp-msg\" id=\"tpPasswordMessage\"></div>\n<input class=\"tp-up-check\" id=\"tpUpgradeCheck\" type=\"checkbox\" />\n<label class=\"tp-up-label\" for=\"tpUpgradeCheck\" onclick=\"tpUpdateQR()\">\n<span>\n<small>Muốn xem thêm video trả phí?</small>\n<strong>Nâng cấp tài khoản</strong>\n</span>\n<span class=\"tp-chev\"></span>\n</label>\n<div class=\"tp-upgrade\">\n<p>\nHọc viên trong HocVien và trợ giảng trong TroGiang đều có thể vào thư viện. Trợ giảng được xem video trả phí như học viên có gói nâng cấp.\n</p>\n<div class=\"tp-up-benefits\">\n<div class=\"tp-up-benefits-title\">\nTài khoản nâng cấp được:\n</div>\n<div class=\"tp-up-benefit\">\n<span class=\"tp-up-benefit-icon\">✓</span>\n<span>Quyền ưu tiên nhận xét bài tập</span>\n</div>\n<div class=\"tp-up-benefit\">\n<span class=\"tp-up-benefit-icon\">✓</span>\n<span>Xem lại bài giảng của khóa đang theo học</span>\n</div>\n<div class=\"tp-up-benefit\">\n<span class=\"tp-up-benefit-icon\">✓</span>\n<span>Mở khoá toàn bộ video hướng dẫn các bài</span>\n</div>\n</div>\n<div class=\"tp-price\">\n<span>Phí nâng cấp</span>\n<strong>800.000đ</strong>\n</div>\n<input class=\"tp-input\" id=\"tpUpgradePhone\" oninput=\"tpScheduleQR()\" placeholder=\"Nhập SĐT Zalo\" type=\"tel\" />\n<div class=\"tp-bank\">\n<div>\n<span>Ngân hàng</span>\n<strong>MB Bank</strong>\n</div>\n<div>\n<span>Số tài khoản</span>\n<strong>0530113118888</strong>\n</div>\n<div>\n<span>Chủ tài khoản</span>\n<strong>BUI KHAC SANG</strong>\n</div>\n<div>\n<span>Số tiền</span>\n<strong class=\"tp-red\">800.000đ</strong>\n</div>\n<div>\n<span>Nội dung CK</span>\n<strong class=\"tp-red\" id=\"tpTransferSyntax\">HOCTHUPHAP [SĐT]</strong>\n</div>\n</div>\n<div class=\"tp-qr\">\n<img loading=\"lazy\" decoding=\"async\" alt=\"VietQR\" id=\"tpQrImage\" src=\"https://img.vietqr.io/image/MB-0530113118888-compact2.png?amount=800000&amp;addInfo=HOCTHUPHAP&amp;accountName=BUI%20KHAC%20SANG\" />\n<div id=\"tpQrStatus\">\nNhập SĐT để cập nhật QR.\n</div>\n</div>\n<div class=\"tp-note\">\nSau khi được xét duyệt vào gói nâng cấp, Mã học viên sẽ được mở thêm video trả phí.\n</div>\n</div>\n</div>\n</div>\n<div class=\"tp-library\" id=\"tpLibraryContent\">\n<header class=\"tp-library-hero\">\n<div class=\"tp-eye\">THANH PHONG THƯ MÔN</div>\n<h1>Học từ nét bút, vững từng ngày</h1>\n<p>Không gian bài giảng, hướng dẫn và tài liệu dành cho hành trình luyện chữ của bạn.</p>\n<div class=\"tp-library-state\" id=\"tpLibraryState\"></div>\n</header>\n<details class=\"tp-profile-panel\" id=\"tpProfilePanel\">\n<summary><span>Thông tin học viên</span><span class=\"tp-profile-hint\">Nhấn để mở / thu gọn</span></summary>\n<div class=\"tp-welcome\" id=\"tpStudentWelcome\">\n<div class=\"tp-w-head\">\n<div class=\"tp-w-identity\">\n<div class=\"tp-w-avatar\" id=\"tpStudentAvatar\">\n書\n</div>\n<div class=\"tp-w-user\">\n<div class=\"tp-w-small\">\nCHÀO MỪNG HỌC VIÊN\n</div>\n<h3 class=\"tp-w-name\" id=\"tpWelcomeName\">\nĐang tải...\n</h3>\n<div class=\"tp-w-code\" id=\"tpWelcomeCode\"></div>\n</div>\n</div>\n<div class=\"tp-head-assets\">\n<div class=\"tp-asset-label\">\nLinh thạch\n</div>\n<div class=\"tp-header-gems\" id=\"tpHeaderGems\">\n<span class=\"tp-no-gem\">Đang tải...</span>\n</div>\n<div class=\"tp-asset-label\">\nVật phẩm\n</div>\n<div class=\"tp-header-items\" id=\"tpHeaderItems\">\n<span class=\"tp-no-item\">Đang tải...</span>\n</div>\n</div>\n</div>\n<div class=\"tp-summary\">\n<div class=\"tp-s-card\">\n<span>Rank hiện tại</span>\n<strong id=\"tpWelcomePoints\">...</strong>\n</div>\n<div class=\"tp-s-card\">\n<span>Tổng linh thạch</span>\n<strong id=\"tpWelcomeGemTotal\">...</strong>\n</div>\n<div class=\"tp-s-card\">\n<span>Danh hiệu</span>\n<strong id=\"tpWelcomeTitle\">...</strong>\n</div>\n</div>\n<div class=\"tp-w-title\">\nQuà thành tích\n</div>\n<div class=\"tp-gifts\" id=\"tpGiftGrid\"></div>\n</div>\n</details>\n<div class=\"tp-intro\">\n<h2>Mỗi lần xem, một lần luyện</h2>\n<p>\nHãy học theo từng cấp độ, luyện tập đều đặn và nộp bài để tích lũy điểm kinh nghiệm.\n</p>\n</div>\n<section class=\"tp-replay-section\">\n<div class=\"tp-sec\">\n<small>01</small>\n<h2>Video xem lại</h2>\n<span class=\"tp-line\"></span>\n</div>\n<p class=\"tp-section-note\" id=\"tpReplayNote\">Bài giảng dành cho khóa đang theo học.</p>\n<div class=\"tp-videos\" id=\"tpReplayGrid\"><div class=\"tp-status\">Đang tải bài giảng...</div></div>\n<div class=\"tp-pages\" id=\"tpReplayPages\"></div>\n</section>\n<div class=\"tp-sec\">\n<small>02</small>\n<h2>Video hướng dẫn</h2>\n<span class=\"tp-line\"></span>\n</div>\n<div class=\"tp-videos\" id=\"tpVideoGrid\">\n<div class=\"tp-status\">\n<div class=\"tp-spinner\"></div>\nĐang tải thư viện video...\n</div>\n</div>\n<div class=\"tp-pages\" id=\"tpVideoPages\"></div>\n<div class=\"tp-sec\">\n<small>03</small>\n<h2>Tài liệu tham khảo</h2>\n<span class=\"tp-line\"></span>\n</div>\n<div class=\"tp-docs\">\n<a class=\"tp-doc\" id=\"tpPaidReferenceBook\" hidden style=\"display:none\" rel=\"noopener\" target=\"_blank\">\n<div class=\"tp-doc-icon\">文</div>\n<div>\n<h3>Sách Thư pháp Việt – Quyển 1</h3>\n<p>Kiến thức dành cho người mới bắt đầu.</p>\n</div>\n</a>\n<a class=\"tp-doc\" id=\"tpTuSachCard\" hidden style=\"display:none\" href=\"#tpTuSach\" onclick=\"return tpOpenTuSach(event)\">\n<div class=\"tp-doc-icon\">論</div>\n<div>\n<h3>Tủ sách lý luận thư pháp</h3>\n<p>Bài giảng tiếng Việt theo từng chương các sách lý luận, lịch sử và tư tưởng thư pháp.</p>\n</div>\n</a>\n<a class=\"tp-doc\" href=\"thu-vien-lam-mo.html\">\n<div class=\"tp-doc-icon\">書</div>\n<div>\n<h3>Mẫu chữ tham khảo</h3>\n<p>Tham khảo bố cục, nét chữ và phương pháp lâm mô.</p>\n</div>\n</a>\n</div>\n<div class=\"tp-tusach\" id=\"tpTuSach\" hidden style=\"display:none\">\n<div class=\"tp-tusach-bar\"><button class=\"tp-tusach-close\" type=\"button\" onclick=\"return tpOpenTuSach(event)\">Thu gọn tủ sách</button></div>\n<div id=\"ly-luan-thu-phap\"><div class=\"tp-status\">Đang mở tủ sách…</div></div>\n</div>\n</div>\n<div class=\"tp-modal\" id=\"tpWarningModal\" onclick=\"tpWarningOutside(event)\">\n<div class=\"tp-warning\">\n<h3>Thử thách cao hơn đang chờ bạn</h3>\n<p id=\"tpWarningText\"></p>\n<div class=\"tp-score-box\">\n<div>\n<span>Rank hiện tại</span>\n<strong id=\"tpCurrentPoints\">0</strong>\n</div>\n<div>\n<span>Rank khuyến nghị</span>\n<strong id=\"tpRequiredPoints\">0</strong>\n</div>\n</div>\n<p>\nBạn nên luyện tập thêm trước khi học bài này.\nĐây chỉ là khuyến nghị và không khóa nội dung.\n</p>\n<div class=\"tp-warning-actions\">\n<button class=\"tp-practice\" onclick=\"tpGoPractice()\" type=\"button\">\nLàm bài tập để tăng Rank\n</button>\n<button class=\"tp-anyway\" onclick=\"tpWatchAnyway()\" type=\"button\">\nTôi vẫn muốn xem\n</button>\n<button class=\"tp-cancel\" onclick=\"tpCloseWarning()\" type=\"button\">\nĐể sau\n</button>\n</div>\n</div>\n</div>\n</div></div>",["(function(){var d=document,w=window;w.__tdpFriendly=function(I){var root=d.querySelector(\".tdp-page\");if(!root)return;var n=0,t=0;function floor(){n++;if(n>40)return;try{var els=root.querySelectorAll(\"*\"),i,el,fs;for(i=0;i<els.length;i++){el=els[i];if(el.__tdpF||!el.firstChild||el.firstChild.nodeType!==3||!el.firstChild.nodeValue.trim())continue;if(/^(SCRIPT|STYLE|SVG|CANVAS|OPTION)$/.test(el.tagName))continue;fs=parseFloat(getComputedStyle(el).fontSize);if(fs&&fs<15){el.style.fontSize=\"15px\"}el.__tdpF=1}}catch(e){}}floor();try{new MutationObserver(function(){clearTimeout(t);t=setTimeout(floor,600)}).observe(root,{childList:true,subtree:true})}catch(e){}};if(w.__tdpCsvCache||!w.fetch||!w.sessionStorage)return;w.__tdpCsvCache=1;var F=w.fetch,TTL=9e4,P=\"tdpcsv:\";function key(u){return P+String(u).replace(/[?&](_|cb|t|ts|nocache)=\\d+/g,\"\")}w.fetch=function(u,o){var url=typeof u===\"string\"?u:u&&u.url||\"\";if(!(o&&o.method&&o.method!==\"GET\")&&/^https:\\/\\/docs\\.google\\.com\\/spreadsheets\\/[^?]*(pub\\?|export\\?|gviz\\/)/.test(url)){var k=key(url),hit=null;try{hit=JSON.parse(sessionStorage.getItem(k)||\"null\")}catch(e){}if(hit&&Date.now()-hit.at<TTL)return Promise.resolve(new Response(hit.body,{status:200,headers:{\"Content-Type\":\"text/csv; charset=utf-8\",\"X-Tdp-Cache\":\"hit\"}}));return F.call(w,u,o).then(function(r){if(r.ok){r.clone().text().then(function(b){if(b.length<4e5){try{sessionStorage.setItem(k,JSON.stringify({at:Date.now(),body:b}))}catch(e){}}})}return r})}return F.call(w,u,o)}})();","var __defProp=Object.defineProperty;var __name=(target,value)=>__defProp(target,\"name\",{value,configurable:!0});window.OCDMinhHongPageContext=\"personal\",window.OCDMinhHongContentTab=\"ThuVien\",(function(){\"use strict\";var APP={PASSWORD:\"123456\",SHEET_ID:\"1hLNi_OP6ScSz8OUH-Qj7qc5LTTPAHevZQg9MvFBvVro\",SHEET_GID:\"0\",PRIORITY_SHEET_GID:\"705559221\",ASSISTANT_CSV:\"https://docs.google.com/spreadsheets/d/10EjfikAuPyc1t_aGDDsUlq0eewo0WUl5qOyXjkVG28M/gviz/tq?gid=1767609121&headers=1&tqx=out:csv&range=B:E\",STUDENT_REGISTRY:\"https://docs.google.com/spreadsheets/d/1GJoTRsbq0kZfZrDdh0uCC667PwS3Bgkje2fHQnwnCKs/export?format=csv&gid=1603096683\",STUDENT_REGISTRY_FALLBACK:\"https://docs.google.com/spreadsheets/d/e/2PACX-1vRP5cc8duj1XrCXMrymo6Cj7aqIkWfX6bHxGeW-lXcSewfQXhM8fZ5rzbNIQ9mBeVuB8yYr_o1aBoYA/pub?gid=1603096683&single=true&output=csv\",RANKING:\"https://docs.google.com/spreadsheets/d/e/2PACX-1vRP5cc8duj1XrCXMrymo6Cj7aqIkWfX6bHxGeW-lXcSewfQXhM8fZ5rzbNIQ9mBeVuB8yYr_o1aBoYA/pub?gid=1326884435&single=true&output=csv\",SUBMISSIONS:\"https://docs.google.com/spreadsheets/d/e/2PACX-1vRP5cc8duj1XrCXMrymo6Cj7aqIkWfX6bHxGeW-lXcSewfQXhM8fZ5rzbNIQ9mBeVuB8yYr_o1aBoYA/pub?output=csv\",DELETE_LOG:\"https://docs.google.com/spreadsheets/d/1GJoTRsbq0kZfZrDdh0uCC667PwS3Bgkje2fHQnwnCKs/export?format=csv&gid=521976322\",FORM:\"https://forms.gle/Af3jRUYfUD9try9h8\",PAGE_SIZE:6,DIFFICULTY_STEP:5,loginMode:\"\",pendingCode:\"\",currentCode:\"\",loginCompleted:!1,student:null,profile:null,videos:[],replays:[],page:1,replayPage:1,permissionLoaded:!1,upgradeCode:\"\",pendingVideo:null,currentVideo:null,accessCodes:null,priorityCodes:null,assistantMap:null,assistantPromise:null,assistantLoadedAt:0,registryMap:null,registryPromise:null,registryLoadedAt:0,legacyMap:null,validSubmissionCsv:\"\",profileRefreshing:!1,autoLoginRunning:!1,autoLoginFinished:!1,autoLoginCode:\"\"},LEVELS=[{min:0,name:\"Tân thủ nhập môn\"},{min:100,name:\"Cầm bút chắc chắn\"},{min:300,name:\"Biết cách lấy mực\"},{min:700,name:\"Lộ phong đều đặn\"},{min:1500,name:\"Trung phong sắc nét\"},{min:3e3,name:\"Nhãn lực nâng cao\"},{min:5e3,name:\"Chương pháp ổn định\"},{min:8e3,name:\"Cao thủ\"},{min:12e3,name:\"Thoát tục tự nhiên\"},{min:2e4,name:\"Thư gia tố chất\"}];function id(x){return document.getElementById(x)}__name(id,\"id\");function trim(v){return String(v??\"\").trim()}__name(trim,\"trim\");function norm(v){return trim(v).replace(/[\\uFEFF\\u200B-\\u200D\\u2060]/g,\"\").replace(/\\s+/g,\"\").toUpperCase()}__name(norm,\"norm\");function nt(v){return trim(v).toLowerCase().normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g,\"\").replace(/đ/g,\"d\").replace(/\\s+/g,\" \")}__name(nt,\"nt\");function cleanItemDisplayName(value){return trim(String(value??\"\").replace(/&#0*215;|&#x0*d7;|&times;/gi,\"×\"))}__name(cleanItemDisplayName,\"cleanItemDisplayName\");function csv(t){t=String(t||\"\").replace(/^\\uFEFF/,\"\");for(var a=[],r=[],f=\"\",q=!1,i=0;i<t.length;i++){var c=t[i];c=='\"'?q&&t[i+1]=='\"'?(f+='\"',i++):q=!q:c==\",\"&&!q?(r.push(f),f=\"\"):(c==`\n`||c==\"\\r\")&&!q?(c==\"\\r\"&&t[i+1]==`\n`&&i++,r.push(f),r.some(x=>trim(x)!==\"\")&&a.push(r),r=[],f=\"\"):f+=c}return r.push(f),r.some(x=>trim(x)!==\"\")&&a.push(r),a}__name(csv,\"csv\");function col(h,aliases){var n=h.map(nt);for(var a of aliases){var x=n.indexOf(nt(a));if(x>=0)return x}for(var a2 of aliases)for(var w=nt(a2),i=0;i<n.length;i++)if(w&&n[i].indexOf(w)>=0)return i;return-1}__name(col,\"col\");async function fetchText(url){var controller=typeof AbortController<\"u\"?new AbortController:null,timer=controller?setTimeout(function(){controller.abort()},12e3):null;try{var response=await fetch(url+(url.includes(\"?\")?\"&\":\"?\")+\"_=\"+Date.now(),{cache:\"no-store\",signal:controller?controller.signal:void 0});if(!response.ok)throw new Error(\"HTTP \"+response.status);var text=await response.text();if(/^\\s*(?:<!doctype|<html)/i.test(text))throw new Error(\"Nguồn dữ liệu trả trang HTML thay vì CSV.\");return text}finally{timer!==null&&clearTimeout(timer)}}__name(fetchText,\"fetchText\");function waitCore(){return new Promise((resolve,reject)=>{var n=0,t=setInterval(()=>{var R=window.StudentRewardSystem;R&&R.version&&typeof R.getStudentRewardProfile==\"function\"&&typeof R.fetchCSV==\"function\"&&typeof R.parseCSV==\"function\"?(clearInterval(t),resolve(R)):++n>=200&&(clearInterval(t),reject(Error(\"Không tìm thấy StudentRewardSystem Core canonical.\")))},50)})}__name(waitCore,\"waitCore\");function studentDirectoryFromRows(rows){for(var header=-1,i=0;i<Math.min((rows||[]).length,10);i++)if(col(rows[i],[\"mã học viên\",\"ma hoc vien\"])>=0){header=i;break}if(header<0)throw new Error(\"Không đọc được cột Mã học viên của tab HocVien.\");var h=rows[header],cc=col(h,[\"mã học viên\",\"ma hoc vien\"]),nc=col(h,[\"họ và tên\",\"ho va ten\",\"họ tên\",\"ho ten\"]),gc=col(h,[\"tổ\",\"to\"]),kc=col(h,[\"khóa\",\"khoá\",\"khoa\"]),sc=col(h,[\"trạng thái\",\"trang thai\"]),map=new Map;return rows.slice(header+1).forEach(function(row){var code=norm(row[cc]);code&&map.set(code,{code,name:nc>=0?trim(row[nc]):\"\",group:gc>=0?trim(row[gc]):\"\",course:kc>=0?trim(row[kc]):\"\",status:sc>=0?norm(row[sc]):\"\",identitySource:\"HocVien\"})}),map}__name(studentDirectoryFromRows,\"studentDirectoryFromRows\");async function loadDirectory(url,forceRefresh){var R=window.StudentRewardSystem,errors=[];if(R&&typeof R.loadStudentRegistry==\"function\")try{var registry=await R.loadStudentRegistry(!!forceRefresh);if(registry&&registry.studentMap&&registry.studentMap.size){var mapped=new Map;return registry.studentMap.forEach(function(student,code){var key=norm(code);key&&mapped.set(key,Object.assign({},student,{code:key,identitySource:\"HocVien\"}))}),mapped}}catch(error){errors.push(error)}for(var urls=[url,APP.STUDENT_REGISTRY_FALLBACK].filter(Boolean),i=0;i<urls.length;i++)try{var rows;R&&typeof R.fetchRows==\"function\"?rows=await R.fetchRows(urls[i]):rows=csv(await fetchText(urls[i]));var result=studentDirectoryFromRows(rows);if(!result.size)throw new Error(\"Tab HocVien chưa trả về mã học viên.\");return result}catch(error){errors.push(error)}throw new Error(\"Chưa tải được danh sách HocVien. \"+(errors.length?errors[errors.length-1].message:\"\"))}__name(loadDirectory,\"loadDirectory\");async function ensureStudentDirectory(forceRefresh){if(APP.registryPromise)return APP.registryPromise;if(!forceRefresh&&APP.registryMap&&APP.registryMap.size&&Date.now()-APP.registryLoadedAt<15e3)return APP.registryMap;var task=loadDirectory(APP.STUDENT_REGISTRY,forceRefresh).then(function(map){return APP.registryMap=map,APP.registryLoadedAt=Date.now(),map});APP.registryPromise=task;try{return await task}finally{APP.registryPromise===task&&(APP.registryPromise=null)}}__name(ensureStudentDirectory,\"ensureStudentDirectory\");function assistantDirectoryFromRows(rows){for(var header=-1,i=0;i<Math.min((rows||[]).length,10);i++)if(col(rows[i],[\"mã học viên\",\"ma hoc vien\"])>=0){header=i;break}if(header<0)throw new Error(\"Không đọc được cột Mã học viên của tab TroGiang.\");var h=rows[header],cc=col(h,[\"mã học viên\",\"ma hoc vien\"]),nc=col(h,[\"họ và tên\",\"ho va ten\",\"họ tên\",\"ho ten\"]),kc=col(h,[\"bạn tốt nghiệp khoá mấy?\",\"ban tot nghiep khoa may\"]),gc=col(h,[\"tổ bạn muốn phụ trách\",\"to ban muon phu trach\"]),map=new Map;return rows.slice(header+1).forEach(function(row){var code=norm(row[cc]);code&&map.set(code,{code,name:nc>=0?trim(row[nc]):\"\",course:kc>=0?trim(row[kc]):\"\",group:gc>=0?trim(row[gc]):\"\",identitySource:\"TroGiang\",isAssistant:!0})}),map}__name(assistantDirectoryFromRows,\"assistantDirectoryFromRows\");async function ensureAssistantDirectory(forceRefresh){if(APP.assistantPromise)return APP.assistantPromise;if(!forceRefresh&&APP.assistantMap&&Date.now()-APP.assistantLoadedAt<15e3)return APP.assistantMap;var task=fetchText(APP.ASSISTANT_CSV).then(function(text){var map=assistantDirectoryFromRows(csv(text));return APP.assistantMap=map,APP.assistantLoadedAt=Date.now(),map}).catch(function(error){throw APP.assistantMap=null,error});APP.assistantPromise=task;try{return await task}finally{APP.assistantPromise===task&&(APP.assistantPromise=null)}}__name(ensureAssistantDirectory,\"ensureAssistantDirectory\");function isAssistantCode(code){return!!(APP.assistantMap&&APP.assistantMap.has(norm(code)))}__name(isAssistantCode,\"isAssistantCode\");async function findStudent(code){code=norm(code);var results=await Promise.allSettled([ensureStudentDirectory(!1),ensureAssistantDirectory(!1)]);function matched(){var student=APP.registryMap&&APP.registryMap.get(code);return student?Object.assign({},student,{isAssistant:isAssistantCode(code)}):APP.assistantMap&&APP.assistantMap.get(code)||null}__name(matched,\"matched\");var found=matched();if(found||(results=await Promise.allSettled([ensureStudentDirectory(!0),ensureAssistantDirectory(!0)]),found=matched(),found))return found;var failed=results.find(function(result){return result.status===\"rejected\"});if(failed)throw new Error(\"Chưa xác minh được mã từ HocVien / TroGiang. \"+failed.reason.message);return null}__name(findStudent,\"findStudent\");function statusError(student){return student&&(student.identitySource===\"HocVien\"||student.identitySource===\"TroGiang\")?\"\":\"Không tìm thấy mã trong danh sách HocVien hoặc TroGiang.\"}__name(statusError,\"statusError\");async function loadPermission(gid,column){var u=\"https://docs.google.com/spreadsheets/d/\"+APP.SHEET_ID+\"/gviz/tq?gid=\"+gid+\"&headers=0&tqx=out:csv&range=\"+encodeURIComponent(column),rows=csv(await fetchText(u)),o={};return rows.forEach(r=>r.forEach(v=>{var c=norm(v);c&&(o[c]=!0)})),o}__name(loadPermission,\"loadPermission\");async function loadAccessPermissions(){APP.priorityCodes={},APP.permissionLoaded=!1;var results=await Promise.allSettled([loadPermission(APP.PRIORITY_SHEET_GID,\"A:A\"),ensureAssistantDirectory(!1)]);return results[0].status===\"fulfilled\"?(APP.priorityCodes=results[0].value,APP.permissionLoaded=!0):console.warn(\"[ThuVien] Chưa tải được MaHocVien:\",results[0].reason),results[1].status===\"rejected\"&&console.warn(\"[ThuVien] Chưa tải được TroGiang:\",results[1].reason),syncUpgradeState(),{priorityCodes:APP.priorityCodes,assistantMap:APP.assistantMap}}__name(loadAccessPermissions,\"loadAccessPermissions\");function hasLibraryAccess(code){return code=norm(code),!!(APP.registryMap&&APP.registryMap.has(code)||isAssistantCode(code))}__name(hasLibraryAccess,\"hasLibraryAccess\");function hasPaidAccess(){var code=norm(APP.currentCode);return!APP.loginCompleted||!code||!hasLibraryAccess(code)?!1:isAssistantCode(code)?!0:!!(APP.permissionLoaded&&APP.priorityCodes&&Object.prototype.hasOwnProperty.call(APP.priorityCodes,code)&&APP.priorityCodes[code]===!0)}__name(hasPaidAccess,\"hasPaidAccess\");function courseKey(value){var text=nt(value).replace(/\\s+/g,\"\");if(/^(all|tatca)$/.test(text))return\"all\";var match=text.match(/^(?:ocd|d|khoa|k)?0*(\\d+)$/);return match?String(Number(match[1])):text}__name(courseKey,\"courseKey\");function matchesStudentCourse(value){var courses=String(value||\"\").split(/[,;|\\/]+/).map(courseKey);if(courses.indexOf(\"all\")>=0)return!0;var current=courseKey(APP.student&&APP.student.course);return!!(current&&courses.indexOf(current)>=0)}__name(matchesStudentCourse,\"matchesStudentCourse\");function canWatchVideo(video){return!video||!APP.loginCompleted||!hasLibraryAccess(APP.currentCode)||video.kind===\"replay\"&&!matchesStudentCourse(video.course)?!1:!video.paid||hasPaidAccess()}__name(canWatchVideo,\"canWatchVideo\");function renderLibraryHeader(){var box=id(\"tpLibraryState\");box&&(box.innerHTML=\"\",[trim(APP.student&&APP.student.name)||APP.currentCode,\"Khóa \"+(trim(APP.student&&APP.student.course)||\"chưa cập nhật\"),hasPaidAccess()?isAssistantCode(APP.currentCode)?\"Trợ giảng · đã mở video trả phí\":\"Đã mở video trả phí\":APP.permissionLoaded?\"Thư viện cơ bản\":\"Đang dùng thư viện cơ bản · chưa xác minh gói nâng cấp\"].forEach(function(text){var pill=document.createElement(\"span\");pill.className=\"tp-state-pill\",pill.textContent=text,box.appendChild(pill)}))}__name(renderLibraryHeader,\"renderLibraryHeader\");async function login(){if(!APP.loginCompleted){var inp=id(\"tpPasswordInput\"),msg=id(\"tpPasswordMessage\"),v=trim(inp.value);if(!v){msg.textContent=\"Vui lòng nhập Mã học viên.\";return}var code=norm(v);APP.upgradeCode=code,msg.textContent=\"Đang xác minh Mã học viên...\";try{var s=await findStudent(code);if(!s){openUpgradePanel(),msg.textContent=\"Không tìm thấy mã trong HocVien hoặc TroGiang.\";return}var er=statusError(s);if(er){msg.textContent=er;return}APP.student=s,APP.pendingCode=code,msg.textContent=\"Đang kiểm tra quyền truy cập thư viện...\",hasLibraryAccess(code)?(APP.priorityCodes={},APP.permissionLoaded=!1,grantAccess(),await loadAccessPermissions(),renderLibraryHeader(),renderVideoPage(),syncContext()):(APP.pendingCode=\"\",msg.textContent=\"Mã học viên chưa có trong HocVien hoặc TroGiang.\")}catch(e){console.error(\"[ThuVien TV4] Login:\",e),msg.textContent=\"Không thể kết nối dữ liệu học viên. Vui lòng thử lại.\"}}}__name(login,\"login\");function getVerifiedMinhHongCode(){try{var session=window.OCDStudentSession;if(!session||typeof session.getState!=\"function\")return\"\";var state=session.getState();return!state||state.verified!==!0?\"\":norm(state.code)}catch{return\"\"}}__name(getVerifiedMinhHongCode,\"getVerifiedMinhHongCode\");async function tryAutoLoginFromMinhHong(){if(APP.loginCompleted||APP.autoLoginRunning)return!1;var code=getVerifiedMinhHongCode();if(!code||APP.autoLoginFinished&&APP.autoLoginCode===code)return!1;APP.autoLoginRunning=!0,APP.autoLoginCode=code,APP.upgradeCode=code;var msg=id(\"tpPasswordMessage\"),inp=id(\"tpPasswordInput\"),button=id(\"tpLoginButton\");try{inp&&(inp.value=code),button&&(button.disabled=!0),msg&&(msg.textContent=\"Đã nhận diện học viên. Đang kiểm tra quyền thư viện...\");var student=await findStudent(code);if(!student)return openUpgradePanel(),msg&&(msg.textContent=\"\"),inp&&(inp.value=\"\"),APP.autoLoginFinished=!0,!1;var er=statusError(student);return er?(msg&&(msg.textContent=er),APP.autoLoginFinished=!0,!1):hasLibraryAccess(code)?(APP.student=student,APP.pendingCode=code,APP.priorityCodes={},APP.permissionLoaded=!1,grantAccess(),APP.autoLoginFinished=!0,await loadAccessPermissions(),renderLibraryHeader(),renderVideoPage(),syncContext(),!0):(APP.autoLoginFinished=!0,msg&&(msg.textContent=\"Mã học viên đã được nhận diện nhưng chưa có trong HocVien hoặc TroGiang.\"),!1)}catch(e){return console.error(\"[ThuVien TV4] Auto Login:\",e),msg&&(msg.textContent=\"\"),!1}finally{APP.autoLoginRunning=!1,button&&(button.disabled=!1)}}__name(tryAutoLoginFromMinhHong,\"tryAutoLoginFromMinhHong\");function passwordKey(e){(e.key===\"Enter\"||e.keyCode===13)&&(e.preventDefault(),login())}__name(passwordKey,\"passwordKey\");function openLibrary(){id(\"tpLoginScreen\").style.display=\"none\",id(\"tpLibraryContent\").style.display=\"block\",renderReferenceAccess()}__name(openLibrary,\"openLibrary\");function grantAccess(){APP.loginMode=\"student\",APP.currentCode=APP.pendingCode,APP.pendingCode=\"\",APP.loginCompleted=!0,id(\"tpPasswordMessage\").textContent=\"\",openLibrary(),prepareWelcome(),connectMinhHong(),loadVideos(),loadProfile(!1)}__name(grantAccess,\"grantAccess\");function connectMinhHong(){var s=window.OCDStudentSession;if(s&&typeof s.confirmStudent==\"function\")try{s.confirmStudent(APP.currentCode,\"thu-vien\")}catch{}syncContext()}__name(connectMinhHong,\"connectMinhHong\");function levelName(p){var out=LEVELS[0].name;return LEVELS.forEach(x=>{p>=x.min&&(out=x.name)}),out}__name(levelName,\"levelName\");function driveId(u){var m=String(u||\"\").match(/\\/file\\/d\\/([^/?&#]+)|\\/d\\/([^/?&#]+)|[?&]id=([^&#]+)/i);return m?m[1]||m[2]||m[3]:\"\"}__name(driveId,\"driveId\");function compact(v){var m=String(v||\"\").match(/^(\\d{1,2})[\\/-](\\d{1,2})[\\/-](\\d{4})[\\s,]+(\\d{1,2}):(\\d{2})(?::(\\d{2}))?/);if(!m)return\"\";var p=__name(n=>String(n).padStart(2,\"0\"),\"p\");return m[3]+p(m[2])+p(m[1])+p(m[4])+p(m[5])+p(m[6]||0)}__name(compact,\"compact\");function submissionId(ts,c,f){return compact(ts)+\"|\"+trim(c)+\"|\"+(driveId(f)||trim(f))}__name(submissionId,\"submissionId\");function deletedSet(R,text){var rows=R.parseCSV(text||\"\"),set=new Set;if(rows.length<2)return set;var h=rows[0],ic=R.findColumn(h,[\"mã bài nộp\",\"ma bai nop\",\"submission id\"]),ac=R.findColumn(h,[\"hành động\",\"hanh dong\",\"action\"]),state=new Map;return rows.slice(1).forEach(r=>{var x=trim(r[ic]);if(x){var a=ac>=0?nt(r[ac]):\"xoa\";state.set(x,!(a.includes(\"khoi phuc\")||a===\"restore\"))}}),state.forEach((v,k)=>{v&&set.add(k)}),set}__name(deletedSet,\"deletedSet\");function validSubmissionCsv(R,text,deleted){var rows=R.parseCSV(text||\"\");if(!rows.length)return\"\";var h=rows[0],cc=R.findColumn(h,[\"mã học viên\",\"ma hoc vien\"]),tc=R.findColumn(h,[\"dấu thời gian\",\"timestamp\"]),fc=R.findColumn(h,[\"tải bài tập lên\",\"tai bai tap len\",\"bài tập\"]),ic=R.findColumn(h,[\"mã bài nộp\",\"submission id\"]);if(cc<0)return rowsToCsv([h]);var keep=[h];return rows.slice(1).forEach(r=>{if(R.normalizeCode(r[cc])===R.normalizeCode(APP.currentCode)){var sid=ic>=0?trim(r[ic]):\"\";sid||(sid=submissionId(tc>=0?r[tc]:\"\",r[cc],fc>=0?r[fc]:\"\")),deleted.has(sid)||keep.push(r)}}),rowsToCsv(keep)}__name(validSubmissionCsv,\"validSubmissionCsv\");function rowsToCsv(rows){return rows.map(r=>r.map(v=>(v=String(v??\"\"),/[\",\\r\\n]/.test(v)?'\"'+v.replace(/\"/g,'\"\"')+'\"':v)).join(\",\")).join(`\\r\n`)}__name(rowsToCsv,\"rowsToCsv\");function rankFromCsv(R,text){var rows=R.parseCSV(text||\"\");if(rows.length<2)return 0;var sc=R.findColumn(rows[0],[\"điểm\",\"diem\",\"điểm số\",\"diem so\",\"điểm giáo viên\"]),total=0,count=rows.length-1;return sc>=0&&rows.slice(1).forEach(r=>{var x=typeof R.parseScore==\"function\"?R.parseScore(r[sc]):parseFloat(String(r[sc]).replace(\",\",\".\"));x!==null&&!isNaN(x)&&(total+=x)}),count+total}__name(rankFromCsv,\"rankFromCsv\");function resolveCanonicalAvatar(R,canonical,ownedItems){var avatar=\"\";if(R&&typeof R.getProfileAvatar==\"function\")try{var a=R.getProfileAvatar(ownedItems);typeof a==\"string\"?avatar=trim(a):a&&typeof a==\"object\"&&(avatar=trim(a.image||a.url||a.avatar||a.gift&&a.gift.image))}catch{}return!avatar&&canonical&&(typeof canonical.avatar==\"string\"?avatar=trim(canonical.avatar):canonical.avatar&&typeof canonical.avatar==\"object\"&&(avatar=trim(canonical.avatar.image||canonical.avatar.url||canonical.avatar.avatar))),!avatar&&canonical&&(avatar=trim(canonical.avatarImage||canonical.profileAvatar||canonical.profileImage)),avatar}__name(resolveCanonicalAvatar,\"resolveCanonicalAvatar\");async function loadProfile(force){if(!APP.profileRefreshing){APP.profileRefreshing=!0;try{var R=await waitCore(),subUrl=R.CONFIG&&R.CONFIG.studentCsv?R.CONFIG.studentCsv:APP.SUBMISSIONS,res=await Promise.all([R.fetchCSV(subUrl),R.fetchCSV(APP.DELETE_LOG)]),filtered=validSubmissionCsv(R,res[0],deletedSet(R,res[1]));APP.validSubmissionCsv=filtered;var rank=rankFromCsv(R,filtered);typeof R.loadSharedRewardData==\"function\"&&await R.loadSharedRewardData(!!force);var canonical=await R.getStudentRewardProfile(R.normalizeCode(APP.currentCode),filtered,!!force,{adminBypass:!0}),gems=canonical&&canonical.gems&&typeof canonical.gems==\"object\"?canonical.gems:canonical&&canonical.rewardData&&canonical.rewardData.gems||{},ownedItems=canonical&&Array.isArray(canonical.ownedItems)?canonical.ownedItems:[],avatar=resolveCanonicalAvatar(R,canonical,ownedItems),reward=resolveAchievementReward(R,canonical,filtered),total=0;(R.GEM_ORDER||Object.keys(gems)).forEach(k=>{total+=Number(gems[k]||0)}),APP.profile={name:trim(canonical&&canonical.name)||trim(APP.student&&APP.student.name)||\"Học viên \"+APP.currentCode,avatar,points:rank,title:levelName(rank),gems,totalGems:total,ownedItems,reward,canonical,RS:R},renderWelcome(),renderVideoPage(),syncContext()}catch(e){console.error(\"[ThuVien TV4]\",e),APP.profile={name:trim(APP.student&&APP.student.name)||APP.currentCode,avatar:\"\",points:0,title:\"Chưa đồng bộ\",gems:null,totalGems:0,ownedItems:[],reward:null,RS:null},renderWelcome(),syncContext()}finally{APP.profileRefreshing=!1}}}__name(loadProfile,\"loadProfile\");function prepareWelcome(){id(\"tpProfilePanel\").style.display=\"block\",id(\"tpProfilePanel\").open=!1,renderLibraryHeader(),id(\"tpStudentWelcome\").style.display=\"block\",id(\"tpWelcomeName\").textContent=trim(APP.student&&APP.student.name)||\"Đang đồng bộ hồ sơ...\",id(\"tpWelcomeCode\").textContent=\"Mã học viên: \"+APP.currentCode}__name(prepareWelcome,\"prepareWelcome\");function ownedItemQuantity(item){if(!item)return 0;var raw=item.quantity;(raw==null||raw===\"\")&&(raw=1);var value=Number(raw);return isFinite(value)&&value>0?value:0}__name(ownedItemQuantity,\"ownedItemQuantity\");function currentProfileItems(p){return(p&&Array.isArray(p.ownedItems)?p.ownedItems:[]).filter(function(item){return ownedItemQuantity(item)>0})}__name(currentProfileItems,\"currentProfileItems\");function renderStudentAvatar(){var box=id(\"tpStudentAvatar\");if(box){box.innerHTML=\"\";var p=APP.profile,R=p&&p.RS,items=currentProfileItems(p),avatar=resolveCanonicalAvatar(R,p&&p.canonical,items),face=document.createElement(\"span\");if(face.className=\"tp-avatar-face\",face.textContent=\"書\",box.appendChild(face),avatar){var img=document.createElement(\"img\");img.alt=p.name||\"Avatar học viên\",img.decoding=\"async\",img.src=R&&typeof R.convertDriveImageUrl==\"function\"?R.convertDriveImageUrl(avatar,160):avatar,img.onerror=function(){face.textContent=\"書\"},face.textContent=\"\",face.appendChild(img)}var frame=R&&typeof R.getProfileAvatarFrame==\"function\"?R.getProfileAvatarFrame(items):\"\";if(frame){var overlay=document.createElement(\"img\");overlay.className=\"tp-avatar-frame\",overlay.alt=\"\",overlay.setAttribute(\"aria-hidden\",\"true\"),overlay.decoding=\"async\",overlay.src=frame,overlay.onerror=function(){overlay.remove()},box.appendChild(overlay)}}}__name(renderStudentAvatar,\"renderStudentAvatar\");function renderStudentEffects(){var p=APP.profile,R=p&&p.RS,items=currentProfileItems(p),card=id(\"tpStudentWelcome\"),background=R&&typeof R.getProfileBackground==\"function\"?R.getProfileBackground(items):\"\";card&&(card.classList.toggle(\"tp-has-background\",!!background),card.style.backgroundImage=background?\"url(\"+JSON.stringify(background)+\")\":\"\");var name=id(\"tpWelcomeName\");if(name){var wrap=id(\"tpWelcomeNameEffect\");wrap||(wrap=document.createElement(\"div\"),wrap.id=\"tpWelcomeNameEffect\",wrap.className=\"tp-name-effect\",name.parentNode.insertBefore(wrap,name),wrap.appendChild(name)),wrap.classList.remove(\"reward-multitask-wrap\",\"reward-multitask-size-medium\"),name.classList.remove(\"reward-multitask-name\"),wrap.querySelectorAll(\".reward-multitask-star\").forEach(function(star){star.remove()});var enabled=R&&typeof R.hasMultitaskPotion==\"function\"&&R.hasMultitaskPotion(items);enabled&&typeof R.applyMultitaskEffect==\"function\"&&R.applyMultitaskEffect(wrap,name,{size:\"medium\"})}}__name(renderStudentEffects,\"renderStudentEffects\");function renderWelcome(){var p=APP.profile;p&&(id(\"tpWelcomeName\").textContent=p.name,id(\"tpWelcomePoints\").textContent=Number(p.points||0).toLocaleString(\"vi-VN\"),id(\"tpWelcomeGemTotal\").textContent=p.gems?Number(p.totalGems||0).toLocaleString(\"vi-VN\"):\"—\",id(\"tpWelcomeTitle\").textContent=p.title||\"—\",renderStudentAvatar(),renderStudentEffects(),renderLibraryHeader(),renderGems(),renderItems(),renderGifts())}__name(renderWelcome,\"renderWelcome\");function renderGems(){var b=id(\"tpHeaderGems\");b.innerHTML=\"\";var p=APP.profile,R=p&&p.RS;if(!p||!p.gems||!R){b.innerHTML='<span class=\"tp-no-gem\">Chưa có linh thạch</span>';return}var any=!1;(R.GEM_ORDER||Object.keys(p.gems)).forEach(k=>{var n=Number(p.gems[k]||0),g=R.GEM_TYPES&&R.GEM_TYPES[k];if(!(n<=0||!g)){any=!0;var s=document.createElement(\"span\");s.className=\"tp-head-gem\";var im=document.createElement(\"img\");im.src=typeof R.convertDriveImageUrl==\"function\"?R.convertDriveImageUrl(g.image,48):g.image,im.alt=g.displayName||k,im.onerror=function(){this.style.display=\"none\"};var st=document.createElement(\"strong\");st.textContent=n,s.append(im,st),b.appendChild(s)}}),any||(b.innerHTML='<span class=\"tp-no-gem\">Chưa có linh thạch</span>')}__name(renderGems,\"renderGems\");function groupOwnedItemsForDisplay(items){var map=new Map;return(Array.isArray(items)?items:[]).forEach(function(item){if(item){var name=cleanItemDisplayName(item.giftName||item.name||item.gift&&item.gift.name);if(name){var key=nt(name);if(key){var quantity=ownedItemQuantity(item);if(!(!isFinite(quantity)||quantity<=0)){var image=trim(item.image||item.gift&&item.gift.image);map.has(key)||map.set(key,{name,quantity:0,image});var current=map.get(key);current.quantity+=quantity,!current.image&&image&&(current.image=image)}}}}}),Array.from(map.values())}__name(groupOwnedItemsForDisplay,\"groupOwnedItemsForDisplay\");function renderItems(){var b=id(\"tpHeaderItems\");if(b){b.innerHTML=\"\";var p=APP.profile,R=p&&p.RS,items=groupOwnedItemsForDisplay(p&&p.ownedItems);if(!items.length){b.innerHTML='<span class=\"tp-no-item\">Chưa có vật phẩm</span>';return}items.forEach(function(item){var card=document.createElement(\"div\");card.className=\"tp-head-item\",card.title=item.name+\" ×\"+item.quantity;var imageBox=document.createElement(\"div\");if(imageBox.className=\"tp-head-item-image\",item.image){var img=document.createElement(\"img\");img.alt=item.name,img.loading=\"lazy\",img.decoding=\"async\",img.src=R&&typeof R.convertDriveImageUrl==\"function\"?R.convertDriveImageUrl(item.image,96):item.image,img.onerror=function(){imageBox.innerHTML=\"\",imageBox.textContent=\"物\"},imageBox.appendChild(img)}else imageBox.textContent=\"物\";var info=document.createElement(\"div\");info.className=\"tp-head-item-info\";var name=document.createElement(\"span\");name.className=\"tp-head-item-name\",name.textContent=item.name;var qty=document.createElement(\"strong\");qty.className=\"tp-head-item-qty\",qty.textContent=\"×\"+Number(item.quantity||1).toLocaleString(\"vi-VN\"),info.append(name,qty),card.append(imageBox,info),b.appendChild(card)})}}__name(renderItems,\"renderItems\");function resolveAchievementReward(R,canonical,submissionCsv){var root=canonical&&canonical.profile||canonical||{},source=root.rewardData||root.reward||{},computed={longestStreak:0,bestHighRun:0,streakGift:null,highScoreGift:null};if(R&&typeof R.calculateStudentRewardData==\"function\"){var rows=R.parseCSV(submissionCsv||\"\");if(rows.length){var headers=rows[0],code=R.findColumn(headers,[\"mã học viên\",\"ma hoc vien\"]),time=R.findColumn(headers,[\"dấu thời gian\",\"dau thoi gian\",\"timestamp\"]),score=R.findColumn(headers,[\"điểm\",\"diem\",\"điểm số\",\"diem so\"]),target=R.normalizeCode(APP.currentCode),submissions=rows.slice(1).map(function(row,index){return{code:code>=0?R.normalizeCode(row[code]):\"\",timestamp:time>=0&&row[time]||\"\",score:score>=0&&row[score]||\"\",originalIndex:index+1}}).filter(function(item){return item.code===target});computed=R.calculateStudentRewardData(submissions)}}var reward=Object.assign({},computed);return Object.keys(source).forEach(function(key){source[key]!==void 0&&(reward[key]=source[key])}),[\"streakGift\",\"highScoreGift\"].forEach(function(key){var achieved=reward[key],fallback=computed[key];achieved&&!achieved.icon&&fallback&&achieved.name===fallback.name&&(reward[key]=Object.assign({},fallback,achieved,{icon:fallback.icon}))}),reward}__name(resolveAchievementReward,\"resolveAchievementReward\");function renderGifts(){var b=id(\"tpGiftGrid\");if(b){b.innerHTML=\"\";var r=APP.profile&&APP.profile.reward||{};b.appendChild(gift(r.streakGift,\"Quà luyện tập liên tục\",\"Chuỗi luyện tập dài nhất: \"+Number(r.longestStreak||0)+\" ngày.\")),b.appendChild(gift(r.highScoreGift,\"Quà chuỗi điểm cao\",\"Chuỗi điểm cao dài nhất: \"+Number(r.bestHighRun||0)+\" bài.\"))}}__name(renderGifts,\"renderGifts\");function achievementIconText(value){return String(value||String.fromCodePoint(127873)).replace(/&#(x[0-9a-f]+|[0-9]+);/gi,function(entity,code){var number=code.charAt(0).toLowerCase()===\"x\"?parseInt(code.slice(1),16):parseInt(code,10);return number>=0&&number<=1114111?String.fromCodePoint(number):entity})}__name(achievementIconText,\"achievementIconText\");function gift(g,t,d){var c=document.createElement(\"div\");c.className=\"tp-gift\";var i=document.createElement(\"div\");i.className=\"tp-gift-icon\",i.textContent=g?achievementIconText(g.icon):String.fromCodePoint(127873),i.setAttribute(\"aria-hidden\",\"true\");var x=document.createElement(\"div\"),title=document.createElement(\"strong\"),description=document.createElement(\"p\");return title.textContent=g&&g.name?g.name:t,description.textContent=d+(g?\"\":\" Chưa đạt thành tích.\"),c.title=title.textContent+\" — \"+description.textContent,x.append(title,description),c.append(i,x),c}__name(gift,\"gift\");async function loadVideos(){try{var url=\"https://docs.google.com/spreadsheets/d/\"+APP.SHEET_ID+\"/gviz/tq?gid=\"+APP.SHEET_GID+\"&headers=1&tqx=out:csv&range=A:G\",groups=partitionLibraryVideos(csv(await fetchText(url)));APP.videos=groups.guides,APP.replays=groups.replays,APP.page=1,APP.replayPage=1,renderVideoPage(),syncContext()}catch(error){console.error(\"[ThuVien] Video:\",error),[\"tpVideoGrid\",\"tpReplayGrid\"].forEach(function(key){id(key).innerHTML='<div class=\"tp-status\">Không thể tải dữ liệu video. Vui lòng tải lại trang.</div>'})}}__name(loadVideos,\"loadVideos\");function partitionLibraryVideos(rows){var result={guides:[],replays:[]};return(rows||[]).slice(1).forEach(function(row,index){var youtube=youtubeId(row[2]);if(!(!trim(row[1])||!youtube)){var replay=nt(row[6])===\"video xem lai\",section=nt(row[6]);if(!(section&&!replay&&section!==\"video huong dan\")){var course=trim(row[5]);if(!(replay&&!matchesStudentCourse(course))&&!(!replay&&course&&!matchesStudentCourse(course))){var ordinal=Number(row[0]),video={lesson:trim(row[0])||index+1,title:trim(row[1]),id:youtube,description:trim(row[3]),paid:nt(row[4])===\"tra phi\",course,kind:replay?\"replay\":\"guide\",difficulty:replay?0:(ordinal>0?ordinal:index+1)*APP.DIFFICULTY_STEP};(replay?result.replays:result.guides).push(video)}}}}),result}__name(partitionLibraryVideos,\"partitionLibraryVideos\");function youtubeId(v){v=trim(v).replace(/&amp;/g,\"&\");var m=v.match(/(?:youtu\\.be\\/|[?&]v=|\\/(?:shorts|embed|live)\\/)([A-Za-z0-9_-]{11})/);return/^[A-Za-z0-9_-]{11}$/.test(v)?v:m?m[1]:\"\"}__name(youtubeId,\"youtubeId\");function studentPoints(){return APP.loginMode!==\"student\"||!APP.profile?null:Number(APP.profile.points||0)}__name(studentPoints,\"studentPoints\");var TUSACH={BASE:\"https://ocd4-assets.vnthudao.workers.dev/ly-luan-thu-phap/\",V:\"46a1d4ee8efca0f1b3d83183f7ef59d5c414b90e\",loaded:!1};function loadTuSach(){if(!TUSACH.loaded){TUSACH.loaded=!0,window.LL_BASE=TUSACH.BASE;var s=document.createElement(\"script\");window.__khoRun(\"ly-luan-thu-phap/ly-luan-thu-phap.kho.js\").catch(function(){TUSACH.loaded=!1;var r=id(\"ly-luan-thu-phap\");r&&(r.innerHTML='<div class=\"tp-status\">Không tải được tủ sách. Hãy kiểm tra mạng rồi bấm mở lại.</div>')})}}__name(loadTuSach,\"loadTuSach\");function showTuSach(open){var wrap=id(\"tpTuSach\");wrap&&(open=!!(open&&hasPaidAccess()),wrap.hidden=!open,wrap.style.display=open?\"\":\"none\",open&&loadTuSach())}__name(showTuSach,\"showTuSach\");function openTuSach(e){if(e&&e.preventDefault&&e.preventDefault(),!hasPaidAccess())return!1;var wrap=id(\"tpTuSach\"),open=!!(wrap&&wrap.hidden);if(showTuSach(open),wrap&&open)try{wrap.scrollIntoView({behavior:\"smooth\",block:\"start\"})}catch{wrap.scrollIntoView()}else{var card=id(\"tpTuSachCard\");if(card)try{card.scrollIntoView({block:\"center\"})}catch{}}return!1}__name(openTuSach,\"openTuSach\");function renderTuSachAccess(allowed){var card=id(\"tpTuSachCard\");if(card){if(card.hidden=!allowed,card.style.display=allowed?\"\":\"none\",!allowed){showTuSach(!1);return}/(^#|&)sach=/.test(location.hash)&&showTuSach(!0)}}__name(renderTuSachAccess,\"renderTuSachAccess\");function renderReferenceAccess(){var book=id(\"tpPaidReferenceBook\");if(book){var allowed=hasPaidAccess();renderTuSachAccess(allowed),book.hidden=!allowed,book.style.display=allowed?\"\":\"none\",allowed?book.href=\"https://drive.google.com/file/d/1fnc2DUZewco11OoNc89hm4x1-jAT90Lu/view?usp=sharing\":book.removeAttribute(\"href\")}}__name(renderReferenceAccess,\"renderReferenceAccess\");function renderVideoPage(){renderReferenceAccess(),renderVideoList(\"guide\"),renderVideoList(\"replay\")}__name(renderVideoPage,\"renderVideoPage\");function renderVideoList(kind){var replay=kind===\"replay\",grid=id(replay?\"tpReplayGrid\":\"tpVideoGrid\"),videos=replay?APP.replays:APP.videos,pageKey=replay?\"replayPage\":\"page\";if(grid){if(grid.innerHTML=\"\",replay&&(id(\"tpReplayNote\").textContent=\"Bài giảng của khóa \"+(trim(APP.student&&APP.student.course)||\"chưa cập nhật\")+\" đang theo học.\"),APP[pageKey]=Math.max(1,Math.min(APP[pageKey],Math.ceil(videos.length/APP.PAGE_SIZE)||1)),!videos.length)grid.innerHTML='<div class=\"tp-status\">'+(replay?\"Chưa có video xem lại cho khóa đang theo học.\":\"Chưa có video hướng dẫn.\")+\"</div>\";else{var start=(APP[pageKey]-1)*APP.PAGE_SIZE;videos.slice(start,start+APP.PAGE_SIZE).forEach(function(video){grid.appendChild(videoCard(video))})}renderPages(kind)}}__name(renderVideoList,\"renderVideoList\");function lockedPaidVideoCard(video){var card=document.createElement(\"article\");card.className=\"tp-video locked tp-upgrade-video\";var body=document.createElement(\"div\");body.className=\"tp-upgrade-video-body\";var icon=document.createElement(\"div\");icon.className=\"tp-upgrade-video-icon\",icon.textContent=String.fromCodePoint(128274),icon.setAttribute(\"aria-hidden\",\"true\");var label=document.createElement(\"span\");label.className=\"tp-lesson\",label.textContent=(video.kind===\"replay\"?\"VIDEO XEM LẠI\":\"VIDEO HƯỚNG DẪN\")+\" · TRẢ PHÍ\";var title=document.createElement(\"h3\");title.textContent=\"Nâng cấp gói học viên để xem Video trả phí\";var note=document.createElement(\"p\");return note.textContent=\"Mã học viên của bạn chưa được mở quyền xem video này.\",body.append(icon,label,title,note,upgradePaymentCard()),card.appendChild(body),card}__name(lockedPaidVideoCard,\"lockedPaidVideoCard\");function videoCard(video){if(video.paid&&!hasPaidAccess())return lockedPaidVideoCard(video);var points=studentPoints(),allowed=canWatchVideo(video),card=document.createElement(\"article\");card.className=\"tp-video\"+(allowed?points!==null&&points<video.difficulty?\" low\":\"\":\" locked\");var thumb=document.createElement(\"div\");thumb.className=\"tp-thumb\",thumb.tabIndex=allowed?0:-1,thumb.setAttribute(\"role\",\"button\"),thumb.setAttribute(\"aria-disabled\",String(!allowed)),thumb.setAttribute(\"aria-label\",allowed?\"Xem \"+video.title:\"Video trả phí: \"+video.title);var image=document.createElement(\"img\");image.loading=\"lazy\",image.alt=\"\",image.src=\"https://img.youtube.com/vi/\"+video.id+\"/hqdefault.jpg\";var play=document.createElement(\"span\");play.className=\"tp-play\",thumb.append(image,play),thumb.addEventListener(\"click\",function(){requestVideo(video)}),thumb.addEventListener(\"keydown\",function(event){(event.key===\"Enter\"||event.key===\" \")&&(event.preventDefault(),requestVideo(video))});var info=document.createElement(\"div\");info.className=\"tp-v-info\";var meta=document.createElement(\"div\");meta.className=\"tp-v-meta\";var label=document.createElement(\"span\");label.className=\"tp-lesson\",label.textContent=(video.kind===\"replay\"?\"BUỔI \":\"BÀI \")+video.lesson;var badge=document.createElement(\"span\");badge.className=\"tp-level-tag\",badge.textContent=video.paid?\"Trả phí ·\"+(allowed?\" đã mở\":\" chưa mở\"):\"Miễn phí\",meta.append(label,badge);var title=document.createElement(\"h3\");title.textContent=video.title;var description=document.createElement(\"p\");description.textContent=video.description;var button=document.createElement(\"button\");if(button.className=\"tp-watch\",button.type=\"button\",button.disabled=!allowed,button.textContent=allowed?\"Xem video →\":\"Cần gói nâng cấp\",button.addEventListener(\"click\",function(){requestVideo(video)}),info.append(meta,title,description),video.kind!==\"replay\"){var level=document.createElement(\"p\");level.className=\"tp-section-note\",level.textContent=\"Rank khuyến nghị: \"+video.difficulty,info.appendChild(level)}return info.appendChild(button),card.append(thumb,info),card}__name(videoCard,\"videoCard\");function renderPages(kind){var replay=kind===\"replay\",box=id(replay?\"tpReplayPages\":\"tpVideoPages\"),videos=replay?APP.replays:APP.videos,pageKey=replay?\"replayPage\":\"page\",count=Math.ceil(videos.length/APP.PAGE_SIZE);if(box.innerHTML=\"\",box.style.display=count>1?\"flex\":\"none\",!(count<=1)){var previous=document.createElement(\"button\"),next=document.createElement(\"button\"),label=document.createElement(\"span\");previous.type=next.type=\"button\",previous.className=next.className=\"tp-page\",previous.textContent=\"Trang trước\",next.textContent=\"Trang sau\",previous.disabled=APP[pageKey]===1,next.disabled=APP[pageKey]===count,label.textContent=\"Trang \"+APP[pageKey]+\" / \"+count,previous.onclick=function(){APP[pageKey]--,renderVideoList(kind)},next.onclick=function(){APP[pageKey]++,renderVideoList(kind)},box.append(previous,label,next)}}__name(renderPages,\"renderPages\");function requestVideo(x){if(canWatchVideo(x)&&!(!x||!x.id)){APP.currentVideo=x,syncContext();var p=studentPoints();if(APP.loginMode!==\"student\"||p===null||p>=x.difficulty){openYouTube(x);return}APP.pendingVideo=x,id(\"tpCurrentPoints\").textContent=p,id(\"tpRequiredPoints\").textContent=x.difficulty,id(\"tpWarningText\").textContent=\"Bạn đang có \"+p+\" Rank, bài học này được khuyến nghị từ \"+x.difficulty+\" Rank.\",id(\"tpWarningModal\").classList.add(\"open\")}}__name(requestVideo,\"requestVideo\");function openYouTube(x){if(canWatchVideo(x)&&!(!x||!x.id)){APP.currentVideo=x,syncContext(),document.body.style.overflow=\"\";var url=\"https://www.youtube.com/watch?v=\"+encodeURIComponent(x.id);window.location.assign(url)}}__name(openYouTube,\"openYouTube\");function watchAnyway(){var x=APP.pendingVideo;id(\"tpWarningModal\").classList.remove(\"open\"),APP.pendingVideo=null,document.body.style.overflow=\"\",x&&openYouTube(x)}__name(watchAnyway,\"watchAnyway\");function goPractice(){closeWarning(),window.open(APP.FORM,\"_blank\",\"noopener\")}__name(goPractice,\"goPractice\");function closeWarning(){var modal=id(\"tpWarningModal\");modal&&modal.classList.remove(\"open\"),APP.pendingVideo=null,APP.currentVideo=null,document.body.style.overflow=\"\",syncContext()}__name(closeWarning,\"closeWarning\");function warningOutside(e){e.target===id(\"tpWarningModal\")&&closeWarning()}__name(warningOutside,\"warningOutside\");function upgradeTransferInfo(){var code=norm(APP.currentCode||APP.upgradeCode),input=id(\"tpUpgradePhone\"),phone=input?String(input.value||\"\").replace(/\\D/g,\"\").substring(0,15):\"\";return input&&(input.value=phone),\"HOCTHUPHAP\"+(code?\" \"+code:\"\")+(phone?\" \"+phone:\"\")}__name(upgradeTransferInfo,\"upgradeTransferInfo\");function upgradeQrUrl(info){return\"https://img.vietqr.io/image/MB-0530113118888-compact2.png?amount=800000&addInfo=\"+encodeURIComponent(info)+\"&accountName=\"+encodeURIComponent(\"BUI KHAC SANG\")}__name(upgradeQrUrl,\"upgradeQrUrl\");function updateQR(){var info=upgradeTransferInfo(),syntax=id(\"tpTransferSyntax\"),image=id(\"tpQrImage\"),status=id(\"tpQrStatus\");syntax&&(syntax.textContent=info),image&&(image.src=upgradeQrUrl(info)),status&&(status.textContent=\"QR đã sẵn sàng\"+(APP.currentCode||APP.upgradeCode?\" cho mã \"+norm(APP.currentCode||APP.upgradeCode):\"\")+\".\"),document.querySelectorAll(\".tp-card-transfer-info\").forEach(function(node){node.textContent=info}),document.querySelectorAll(\".tp-card-upgrade-qr\").forEach(function(node){node.src=upgradeQrUrl(info)})}__name(updateQR,\"updateQR\");function openUpgradePanel(){var checkbox=id(\"tpUpgradeCheck\");checkbox&&(checkbox.checked=!0),updateQR()}__name(openUpgradePanel,\"openUpgradePanel\");function syncUpgradeState(){var checkbox=id(\"tpUpgradeCheck\");checkbox&&(checkbox.checked=!hasPaidAccess()),updateQR()}__name(syncUpgradeState,\"syncUpgradeState\");function upgradePaymentCard(){var panel=document.createElement(\"div\");panel.className=\"tp-card-payment\";var title=document.createElement(\"strong\");title.textContent=\"Chuyển khoản nâng cấp tài khoản\",panel.appendChild(title),[[\"Ngân hàng\",\"MB Bank\"],[\"Số tài khoản\",\"0530113118888\"],[\"Chủ tài khoản\",\"BUI KHAC SANG\"],[\"Số tiền\",\"800.000đ\"]].forEach(function(pair){var row=document.createElement(\"div\");row.className=\"tp-card-payment-row\";var label=document.createElement(\"span\"),value=document.createElement(\"strong\");label.textContent=pair[0],value.textContent=pair[1],row.append(label,value),panel.appendChild(row)});var transferLabel=document.createElement(\"p\");transferLabel.textContent=\"Nội dung chuyển khoản:\";var transferInfo=document.createElement(\"strong\");transferInfo.className=\"tp-card-transfer-info\",transferInfo.textContent=upgradeTransferInfo();var image=document.createElement(\"img\");image.className=\"tp-card-upgrade-qr\",image.alt=\"Mã QR chuyển khoản nâng cấp tài khoản học viên\",image.loading=\"lazy\",image.decoding=\"async\",image.src=upgradeQrUrl(transferInfo.textContent);var status=document.createElement(\"p\");return status.className=\"tp-card-payment-note\",status.textContent=\"Quét QR để chuyển khoản. Sau khi được xác nhận vào gói nâng cấp, mã học viên sẽ được mở video trả phí.\",image.onerror=function(){image.style.display=\"none\",status.textContent=\"Chưa tải được QR. Bạn có thể chuyển khoản theo thông tin tài khoản và nội dung bên trên.\"},panel.append(transferLabel,transferInfo,image,status),panel}__name(upgradePaymentCard,\"upgradePaymentCard\");var qrT;function scheduleQR(){clearTimeout(qrT),qrT=setTimeout(updateQR,250)}__name(scheduleQR,\"scheduleQR\");function context(){if(APP.loginMode!==\"student\"||!APP.loginCompleted||!APP.currentCode)return null;var p=APP.profile||{},r=p.reward||{},v=APP.currentVideo||APP.pendingVideo,owned=Array.isArray(p.ownedItems)?p.ownedItems:[];return{page:\"ThuVien\",studentCode:APP.currentCode,data:{studentName:trim(p.name||APP.student&&APP.student.name),group:trim(APP.student&&APP.student.group),course:trim(APP.student&&APP.student.course),rank:Number(p.points||0),rankingPoints:Number(p.points||0),title:trim(p.title),totalGems:Number(p.totalGems||0),ownedItemTypes:groupOwnedItemsForDisplay(owned).length,longestStreak:Number(r.longestStreak||0),bestHighRun:Number(r.bestHighRun||0),videoCount:APP.videos.length+APP.replays.length,replayVideoCount:APP.replays.length,paidVideoAccess:hasPaidAccess(),currentVideoTitle:v?trim(v.title):\"\",currentVideoLesson:v?trim(v.lesson):\"\",currentVideoDifficulty:v?Number(v.difficulty||0):0},conditions:{library_access:!0,profile_ready:!!APP.profile,has_rank:Number(p.points||0)>0,no_rank:Number(p.points||0)<=0,has_gems:Number(p.totalGems||0)>0,no_gems:Number(p.totalGems||0)<=0,has_items:owned.length>0,no_items:owned.length===0,viewing_video:!!v,video_above_rank:!!(v&&Number(p.points||0)<Number(v.difficulty||0)),video_suitable_rank:!!(v&&Number(p.points||0)>=Number(v.difficulty||0))}}}__name(context,\"context\");function syncContext(){var a=window.OCDMinhHongContext,p=context();if(a&&p&&typeof a.set==\"function\")try{return a.set(p,\"thu-vien\"),!0}catch{}return!1}__name(syncContext,\"syncContext\"),window.addEventListener(\"ocdRewardProfileChanged\",function(e){var c=norm(e&&e.detail&&e.detail.code);APP.loginMode===\"student\"&&APP.loginCompleted&&c===norm(APP.currentCode)&&loadProfile(!0)}),window.addEventListener(\"ocdStudentSessionChanged\",function(){if(APP.loginCompleted)syncContext();else{var code=getVerifiedMinhHongCode();code&&code!==APP.autoLoginCode&&(APP.autoLoginFinished=!1),tryAutoLoginFromMinhHong()}}),document.addEventListener(\"keydown\",function(e){e.key===\"Escape\"&&closeWarning()}),document.body.style.overflow=\"\",setTimeout(()=>{ensureStudentDirectory(!1).catch(()=>{})},120);function startAutoLoginWatcher(){var tries=0,maxTries=80;function check(){if(!APP.loginCompleted){tries++;var code=getVerifiedMinhHongCode();if(code){tryAutoLoginFromMinhHong();return}tries<maxTries&&setTimeout(check,100)}}__name(check,\"check\"),check()}__name(startAutoLoginWatcher,\"startAutoLoginWatcher\"),setTimeout(startAutoLoginWatcher,0),window.OCDThuVienLibrary={version:\"TV4-4.0-canonical-items-avatar-auto-session\",getCode:__name(()=>APP.currentCode||\"\",\"getCode\"),getStudent:__name(()=>APP.student?Object.assign({},APP.student):null,\"getStudent\"),getRank:__name(()=>APP.profile?Number(APP.profile.points||0):null,\"getRank\"),getAvatar:__name(()=>APP.profile?trim(APP.profile.avatar):\"\",\"getAvatar\"),getOwnedItems:__name(()=>APP.profile&&Array.isArray(APP.profile.ownedItems)?APP.profile.ownedItems.slice():[],\"getOwnedItems\"),getCurrentVideo:__name(()=>APP.currentVideo?Object.assign({},APP.currentVideo):null,\"getCurrentVideo\"),getMinhHongContext:context,syncMinhHongContext:syncContext,refreshProfile:__name(()=>loadProfile(!0),\"refreshProfile\"),tryAutoLogin:tryAutoLoginFromMinhHong},window.tpLogin=login,window.tpPasswordKey=passwordKey,window.tpUpdateQR=updateQR,window.tpScheduleQR=scheduleQR,window.tpWatchAnyway=watchAnyway,window.tpGoPractice=goPractice,window.tpCloseWarning=closeWarning,window.tpWarningOutside=warningOutside,window.tpOpenTuSach=openTuSach,console.log(\"KHO TAI LIEU TV4 - CANONICAL ITEMS + AVATAR + MINH HONG AUTO LOGIN READY\")})();"]);

Nhận xét

Bài đăng phổ biến từ blog này

trang/thudao/dang-ky-hoc.html · Bản trước khi chuyển sang kho (tải từ GitHub/jsDelivr)

trang/thudao/bai-viet/benh-cua-thu-dan-duong-dai-the-trien-lam-xu-thu-va-nguy-menh-de-vuot-co-nhan.html · Bản trước khi chuyển sang kho (có video, tải từ GitHub/jsDelivr)

trang/thudao/tai-lieu.html · Bản đang chạy 11/11/2026 (khối tải nhanh từ kho)