{"id":13611,"date":"2026-07-16T04:47:19","date_gmt":"2026-07-16T04:47:19","guid":{"rendered":"https:\/\/promotionexams.com\/?page_id=13611"},"modified":"2026-07-16T13:46:06","modified_gmt":"2026-07-16T13:46:06","slug":"sample-mcqs-test-series-page","status":"publish","type":"page","link":"https:\/\/promotionexams.com\/?page_id=13611","title":{"rendered":"Sample MCQS TEST SERIES PAGE"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"13611\" class=\"elementor elementor-13611\">\n\t\t\t\t<div class=\"elementor-element elementor-element-db56ece e-con-full e-flex e-con e-parent\" data-id=\"db56ece\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-87fd728 elementor-widget elementor-widget-html\" data-id=\"87fd728\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!--\n============================================================\nCSS ADDA \u00b7 PromotionExams.com\nREUSABLE PYQ QUIZ TEMPLATE \u2014 PRACTICE + ANALYTICS + AI COACH\n------------------------------------------------------------\nHOW TO REUSE FOR A NEW QUIZ (3 steps):\n  1. In quizConfig below, change:\n       quizId   -> a UNIQUE id per quiz (e.g. 'pension-pyq-quiz').\n                   This keys localStorage; two quizzes sharing an id\n                   will share\/overwrite each other's progress!\n       topic    -> heading shown in the header\n       subtitle -> small line under the heading\n  2. Paste your MCQ objects inside  const allQuestions = [ ... ]\n     (format documented at the array).\n  3. Nothing else needs editing.\n\nTABS:\n  1. Practice Quiz   \u2014 quiz with progress, weak areas, filters\n  2. Exam Analytics  \u2014 distribution analysis AUTO-COMPUTED from data\n  3. My Performance  \u2014 AI coach: readiness score, focus areas,\n                       study plan, spaced-repetition revision queue\n\nRESET BEHAVIOUR:\n  \u2022 \"Reset Session\" (Practice tab)   -> clears ONLY the current\n    session's answers\/score. Lifetime mastery, weak areas and the\n    My Performance data are KEPT.\n  \u2022 \"Reset My Performance\" (My Performance tab) -> wipes lifetime\n    stats, mastery, weak areas and attempt history (with confirm).\n\nAll progress persists in localStorage (per quizId).\n============================================================\n-->\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, viewport-fit=cover\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Crimson+Pro:wght@500;600;700&family=DM+Sans:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n\n<style>\n\/* =====================================================\n   CSS ADDA \u2014 INTEGRATED PORTAL DESIGN SYSTEM\n   NOTE ON FONT STABILITY: all font sizes are in px (not\n   rem) so the widget looks identical on every WordPress\n   page\/theme, regardless of the site's root font size.\n   Key exam-paper typography carries !important to defeat\n   theme overrides.\n===================================================== *\/\n.gfr-portal{\n  --navy:#2563EB; --navy-d:#1D4ED8; --navy-l:#3B82F6; --navy-ink:#12275c;\n  --gold:#c9992a; --gold-l:#e6c14e; --gold-d:#a37b1c;\n  --green:#10B981; --green-d:#059669; --green-bg:#ecfdf5;\n  --red:#EF4444; --red-d:#dc2626; --red-bg:#fef2f2;\n  --amber:#f59e0b; --amber-d:#d97706;\n  --bg:#F6F8FC; --card:#FFFFFF;\n  --ink:#1E293B; --mut:#5b6472; --faint:#94A3B8; --line:#E2E8F0;\n  --sh-sm:0 1px 2px rgba(16,41,66,.06);\n  --sh-md:0 4px 10px -2px rgba(16,41,66,.10);\n  --sh-lg:0 12px 26px -8px rgba(16,41,66,.16);\n  --r-sm:8px; --r-md:12px; --r-lg:16px;\n  --serif:'Crimson Pro',Georgia,'Times New Roman',serif;\n  --sans:'DM Sans',-apple-system,BlinkMacSystemFont,sans-serif;\n  font-family:var(--sans) !important;\n  font-size:16px;\n  color:var(--ink); line-height:1.55;\n  background:linear-gradient(160deg,#EFF4FF 0%,#F6F8FC 45%,#FDF9EE 100%);\n  border-radius:var(--r-lg); overflow:hidden; box-shadow:var(--sh-lg);\n  -webkit-user-select:none; user-select:none;\n}\n.gfr-portal *{margin:0;padding:0;box-sizing:border-box;min-width:0}\n\/* Font-stability shield: inherit our stack everywhere unless a rule below overrides *\/\n.gfr-portal *:not(i):not(.ic){font-family:inherit}\n.gfr-portal img,.gfr-portal svg,.gfr-portal table{max-width:100%}\n.gfr-portal table{max-width:none}\n@media print{.gfr-portal{display:none!important}}\n\n.ic{font-style:normal;display:inline-block;line-height:1}\n\/* ---------- HEADER ---------- *\/\n.gp-header{background:linear-gradient(135deg,#173db3 0%,var(--navy) 62%,#3b6cf0 100%);border-bottom:4px solid var(--gold);padding:26px 28px 0}\n.gp-head-top{display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:18px}\n.gp-brand .eyebrow{font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--gold-l);font-weight:700;margin-bottom:6px}\n.gp-brand h1{font-family:var(--serif) !important;font-weight:600;font-size:clamp(20px,3.5vw,28px);line-height:1.15;color:#fff;letter-spacing:-.01em}\n.gp-brand p{font-size:13.6px;color:#cfe0ff;margin-top:5px}\n.gp-stats{display:flex;gap:10px;flex-wrap:wrap}\n.gp-stat{background:rgba(255,255,255,.09);border:1px solid rgba(255,255,255,.16);border-radius:var(--r-md);padding:9px 16px;min-width:96px;text-align:center}\n.gp-stat .n{font-family:var(--serif);font-size:23px;font-weight:600;color:var(--gold-l);line-height:1.1}\n.gp-stat .l{font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:#bfdbfe;margin-top:2px}\n.gp-stat.clickable{cursor:pointer;transition:transform .25s}\n.gp-stat.clickable:hover{transform:translateY(-2px);background:rgba(255,255,255,.16)}\n\n\/* Tab navigation *\/\n.gp-tabs{display:flex;gap:6px;margin-top:22px;flex-wrap:wrap}\n.gp-tab{padding:11px 22px;border:none;border-radius:var(--r-md) var(--r-md) 0 0;background:rgba(255,255,255,.10);color:#dbeafe;font-family:var(--sans);font-size:13.6px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:8px;transition:all .25s}\n.gp-tab i{color:var(--gold-l);font-size:12.8px}\n.gp-tab:hover{background:rgba(255,255,255,.2);color:#fff}\n.gp-tab.active{background:var(--bg);color:var(--navy-d)}\n.gp-tab.active i{color:var(--gold)}\n.gp-tab .pill{background:var(--red);color:#fff;font-size:10.4px;font-weight:700;padding:1px 7px;border-radius:20px}\n\n.gp-view{display:none;animation:gpFade .35s ease}\n.gp-view.active{display:block}\n@keyframes gpFade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}\n\n\/* ---------- SHARED CARDS ---------- *\/\n.quiz-card,.an-card{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--sh-sm);overflow:hidden;display:flex;flex-direction:column}\n.quiz-card-header{background:linear-gradient(135deg,var(--navy) 0%,var(--navy-d) 100%);padding:13px 16px;color:#fff}\n.quiz-card-header h3{font-size:13.4px;font-weight:700;display:flex;align-items:center;gap:8px;color:#fff}\n.quiz-card-header h3 i{color:var(--gold-l)}\n.quiz-card-header.light{background:linear-gradient(135deg,#F1F5FB 0%,#E4ECFB 100%);border-bottom:1px solid var(--line)}\n.quiz-card-header.light h3{color:var(--navy-d)}\n.quiz-card-header.light h3 i{color:var(--gold)}\n.quiz-card-body{padding:16px;flex:1;display:flex;flex-direction:column}\n\n.sec-head{display:flex;align-items:baseline;gap:12px;margin:34px 0 16px;border-bottom:1px solid var(--line);padding-bottom:10px}\n.sec-head .num{font-family:var(--serif);color:var(--gold);font-size:16.8px;font-weight:600}\n.sec-head h2{font-size:18.4px;font-weight:700;letter-spacing:-.01em;color:var(--navy-ink)}\n.sec-head .hint{margin-left:auto;color:var(--mut);font-size:12.8px;font-style:italic;font-family:var(--serif)}\n\n\/* ---------- MODE SELECTOR ---------- *\/\n.mode-selector{background:var(--card);padding:13px 20px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px}\n.mode-tabs{display:flex;gap:8px;flex-wrap:wrap}\n.mode-tab{padding:9px 16px;min-height:40px;border:2px solid var(--line);border-radius:var(--r-md);background:#F8FAFC;font-size:12.8px;font-weight:600;color:var(--mut);cursor:pointer;transition:all .3s;display:flex;align-items:center;gap:6px;font-family:var(--sans)}\n.mode-tab:hover{border-color:var(--navy-l);color:var(--navy)}\n.mode-tab.active{background:linear-gradient(135deg,var(--navy) 0%,var(--navy-d) 100%);border-color:var(--navy);color:#fff}\n.mode-tab.weak-mode{border-color:#f3c1c1}\n.mode-tab.weak-mode.active{background:linear-gradient(135deg,var(--red) 0%,var(--red-d) 100%);border-color:var(--red)}\n.mode-tab .badge{background:rgba(255,255,255,.3);padding:2px 8px;border-radius:20px;font-size:11.2px}\n.mode-tab:not(.active) .badge{background:var(--navy);color:#fff}\n.mode-tab.weak-mode:not(.active) .badge{background:var(--red)}\n.session-info{display:flex;align-items:center;gap:12px;font-size:12.8px;color:var(--mut)}\n.session-info i{color:var(--gold)}\n.resume-btn{padding:7px 14px;background:linear-gradient(135deg,var(--gold) 0%,var(--gold-d) 100%);border:none;border-radius:var(--r-md);color:#fff;font-size:12.2px;font-weight:700;cursor:pointer;display:flex;align-items:center;gap:5px;transition:all .3s;font-family:var(--sans)}\n.resume-btn:hover{transform:translateY(-2px);box-shadow:var(--sh-md)}\n\n\/* ---------- QUIZ GRID LAYOUT (filters | question | dashboard) ---------- *\/\n.quiz-container{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:18px;padding:0 18px 18px;align-items:start}\n\/* Full-width horizontal FILTER BAR shown before the MCQ content *\/\n.filter-bar{display:block;padding:14px 18px 0}\n.filter-bar .quiz-card{margin-bottom:12px}\n.filter-bar-row{display:grid;grid-template-columns:1fr;gap:12px}\n.filter-list{display:flex;flex-direction:row;flex-wrap:wrap;gap:7px;padding:2px 0;max-height:none;overflow:visible}\n.filter-item{padding:7px 12px;border-radius:20px;cursor:pointer;display:inline-flex;align-items:center;gap:8px;transition:all .25s;border:1.5px solid var(--line);background:#F8FAFC;font-size:12.8px;flex:0 0 auto}\n.filter-item:hover{background:#EFF6FF;border-color:var(--navy-l)}\n.filter-item.active{background:linear-gradient(135deg,var(--navy) 0%,var(--navy-d) 100%);color:#fff}\n.filter-item .filter-text{font-weight:600;display:flex;align-items:center;gap:6px;font-size:12.6px}\n.filter-item .filter-count{background:rgba(255,255,255,.2);padding:2px 8px;border-radius:20px;font-size:11.2px;font-weight:600}\n.filter-item:not(.active) .filter-count{background:var(--navy);color:#fff}\n\n.weak-areas-card .quiz-card-header{background:linear-gradient(135deg,var(--red) 0%,var(--red-d) 100%)}\n.weak-question-list{flex:1;overflow-y:auto;margin-bottom:10px;max-height:180px}\n.weak-question-item{background:#F8FAFC;padding:10px 12px;border-radius:var(--r-sm);margin-bottom:8px;font-size:12.5px;display:flex;align-items:center;gap:10px;cursor:pointer;transition:all .3s;border-left:3px solid var(--red)}\n.weak-question-item:hover{background:var(--red-bg);transform:translateX(3px)}\n.weak-question-item .q-num{font-weight:700;color:var(--red);flex-shrink:0}\n.weak-question-item .q-text{flex:1;color:var(--mut);font-size:11.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.weak-question-item .wrong-count{background:var(--red);color:#fff;padding:2px 6px;border-radius:20px;font-size:10.4px;font-weight:600}\n.practice-weak-btn{width:100%;padding:10px;background:linear-gradient(135deg,var(--red) 0%,var(--red-d) 100%);border:none;border-radius:var(--r-md);color:#fff;font-size:12.8px;font-weight:700;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:6px;margin-top:10px;transition:all .3s;font-family:var(--sans)}\n.practice-weak-btn:hover{transform:translateY(-2px);box-shadow:var(--sh-md)}\n\n\/* ---------- QUESTION PANEL ---------- *\/\n.question-panel{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--sh-sm);overflow:hidden;align-self:start}\n.question-header{background:linear-gradient(135deg,#F1F5FB 0%,#E4ECFB 100%);padding:13px 20px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--line);flex-wrap:wrap;gap:10px}\n.question-number{font-family:var(--serif);font-size:16.3px;font-weight:600;color:var(--navy-d)}\n.question-meta{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\n.meta-badge{padding:5px 10px;border-radius:20px;font-size:11.7px;font-weight:600;display:flex;align-items:center;gap:4px}\n.meta-badge.year{background:linear-gradient(135deg,var(--navy) 0%,var(--navy-d) 100%);color:#fff}\n.meta-badge.chapter{background:linear-gradient(135deg,var(--gold) 0%,var(--gold-d) 100%);color:#fff;white-space:normal;max-width:100%;line-height:1.3;text-align:left}\n.meta-badge.weak{background:linear-gradient(135deg,var(--red) 0%,var(--red-d) 100%);color:#fff}\n.meta-badge i{font-size:10.1px}\n.question-body{padding:22px}\n\/* ---- EXAM-PAPER TYPOGRAPHY (UPSC QP style) ----\n   font-family + font-size are !important so the WordPress theme can\n   never change how the MCQs look from page to page. *\/\n.question-text{font-family:var(--serif) !important;font-size:18.5px !important;line-height:1.7;color:#161b26;padding:20px 22px;background:#fffef9;border:1px solid #e9e3d2;border-left:4px solid var(--gold);border-radius:var(--r-md);margin-bottom:18px;box-shadow:inset 0 1px 0 #fff;text-align:justify;text-justify:inter-word;hyphens:auto;-webkit-hyphens:auto}\n.question-text b{font-weight:700}\n.question-text .q-stem{display:block}\n.q-stmt{display:grid;grid-template-columns:30px 1fr;gap:4px;margin:12px 0 0 14px;line-height:1.65}\n.q-stmt .sn{font-weight:600;text-align:left}\n.q-lead{display:block;margin-top:16px}\n.options-list{display:flex;flex-direction:column;gap:9px}\n.option-item{font-family:var(--serif) !important;padding:12px 16px;border:1.5px solid var(--line);border-radius:var(--r-md);cursor:pointer;display:flex;align-items:flex-start;gap:12px;transition:all .25s;background:#fff}\n.option-item:hover:not(.disabled){border-color:var(--navy-l);background:#F6F9FF;transform:translateX(4px)}\n.option-item.selected{border-color:var(--navy);background:#EFF5FF;box-shadow:0 0 0 1px var(--navy)}\n.option-item.correct{border-color:var(--green);background:#F0FDF6;box-shadow:0 0 0 1px var(--green)}\n.option-item.incorrect{border-color:var(--red);background:#FEF4F4;box-shadow:0 0 0 1px var(--red)}\n.option-item.disabled{cursor:default}\n.option-letter{min-width:34px;font-family:inherit;font-weight:600;font-size:17.3px !important;color:#161b26;flex-shrink:0;line-height:1.6;transition:color .25s}\n.option-item.selected .option-letter{color:var(--navy-d)}\n.option-item.correct .option-letter{color:var(--green-d)}\n.option-item.incorrect .option-letter{color:var(--red-d)}\n.option-text{font-size:17.3px !important;line-height:1.6;color:#161b26;flex:1;text-align:justify;text-justify:inter-word;hyphens:auto;-webkit-hyphens:auto}\n.option-icon{font-size:16px;display:none}\n.option-item.correct .option-icon,.option-item.incorrect .option-icon{display:block}\n.option-item.correct .option-icon{color:var(--green)}\n.option-item.incorrect .option-icon{color:var(--red)}\n.explanation-box{margin-top:18px;padding:16px;background:linear-gradient(135deg,#FFFBEB 0%,#FEF3C7 100%);border-radius:var(--r-md);border-left:4px solid var(--gold);display:none;animation:gpSlide .4s ease}\n.explanation-box.show{display:block}\n@keyframes gpSlide{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:none}}\n.explanation-title{font-size:13.4px;font-weight:700;color:var(--gold-d);margin-bottom:8px;display:flex;align-items:center;gap:6px}\n.explanation-text{font-family:var(--serif) !important;font-size:16.3px !important;line-height:1.68;color:#1c2330;text-align:justify;text-justify:inter-word;hyphens:auto;-webkit-hyphens:auto}\n.mastery-indicator{margin-top:14px;padding:10px 14px;background:#F8FAFC;border-radius:var(--r-md);display:none}\n.mastery-indicator.show{display:flex;align-items:center;justify-content:space-between}\n.mastery-label{font-size:12.5px;color:var(--mut);display:flex;align-items:center;gap:5px}\n.mastery-stars{display:flex;gap:2px}\n.mastery-stars i{color:var(--line);font-size:13.6px}\n.mastery-stars i.filled{color:#fbbf24}\n.question-nav{margin-top:20px;padding:16px 20px;background:#F8FAFC;display:flex;justify-content:space-between;align-items:center;gap:12px;border-radius:var(--r-md);border:1px solid var(--line)}\n.nav-btn{padding:11px 22px;min-height:44px;border:none;border-radius:var(--r-md);font-size:13.6px;font-weight:700;cursor:pointer;display:flex;align-items:center;gap:7px;transition:all .3s;font-family:var(--sans);touch-action:manipulation}\n.nav-btn.prev{background:#fff;color:var(--mut);border:2px solid var(--line)}\n.nav-btn.prev:hover:not(:disabled){border-color:var(--navy);color:var(--navy);transform:translateX(-3px)}\n.nav-btn.check{background:linear-gradient(135deg,var(--gold) 0%,var(--gold-d) 100%);color:#fff;flex:1;justify-content:center;max-width:220px;box-shadow:var(--sh-md)}\n.nav-btn.check:hover:not(:disabled){transform:translateY(-2px);box-shadow:var(--sh-lg)}\n.nav-btn.next{background:linear-gradient(135deg,var(--navy) 0%,var(--navy-d) 100%);color:#fff;box-shadow:var(--sh-md)}\n.nav-btn.next:hover:not(:disabled){transform:translateX(3px);box-shadow:var(--sh-lg)}\n.nav-btn:disabled{opacity:.5;cursor:not-allowed}\n\n\/* ---------- RIGHT SIDEBAR ---------- *\/\n.dashboard-sidebar{display:flex;flex-direction:column;gap:16px;align-self:start;min-width:0}\n\/* Combined Progress + Session card *\/\n.progress-combo{display:grid;grid-template-columns:auto 1fr;gap:14px;align-items:center}\n.progress-combo .stat-col{display:flex;flex-direction:column;gap:2px}\n.progress-combo .stat-row{padding:5px 0}\n.progress-ring-container{display:flex;justify-content:center}\n.progress-ring{position:relative;width:100px;height:100px}\n.progress-ring svg{transform:rotate(-90deg)}\n.progress-ring-bg{fill:none;stroke:var(--line);stroke-width:8}\n.progress-ring-fill{fill:none;stroke:var(--green);stroke-width:8;stroke-linecap:round;transition:stroke-dashoffset .5s}\n.progress-ring-text{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center}\n.progress-ring-percentage{font-family:var(--serif);font-size:24px;font-weight:600;color:var(--ink)}\n.progress-ring-label{font-size:10.1px;color:var(--mut)}\n.progress-stats-mini{display:grid;grid-template-columns:1fr 1fr;gap:8px}\n.progress-stat-mini{background:#F8FAFC;padding:10px;border-radius:var(--r-sm);text-align:center}\n.progress-stat-mini .value{font-family:var(--serif);font-size:19.2px;font-weight:600}\n.progress-stat-mini .value.correct{color:var(--green)}\n.progress-stat-mini .value.incorrect{color:var(--red)}\n.progress-stat-mini .label{font-size:10.1px;color:var(--mut);margin-top:2px}\n.question-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;max-height:200px;overflow-y:auto;padding:2px}\n.grid-item{width:100%;aspect-ratio:1;border-radius:var(--r-sm);display:flex;align-items:center;justify-content:center;font-weight:600;font-size:11.7px;cursor:pointer;transition:all .3s;border:2px solid transparent;position:relative}\n.grid-item.unattempted{background:var(--navy);color:#fff}\n.grid-item.current{background:var(--gold);color:#fff;transform:scale(1.1);box-shadow:var(--sh-md);z-index:1}\n.grid-item.attempted{background:#f7ce6b;color:var(--ink)}\n.grid-item.correct-answered{background:var(--green);color:#fff}\n.grid-item.incorrect-answered{background:var(--red);color:#fff}\n.grid-item.weak-marked::after{content:'!';position:absolute;top:-3px;right:-3px;width:12px;height:12px;background:var(--red);border-radius:50%;font-size:8.8px;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700}\n.grid-item:hover:not(.current){transform:scale(1.05)}\n.legend{padding-top:12px;border-top:1px solid var(--line);margin-top:4px}\n.legend-title{font-weight:700;font-size:11.7px;color:var(--ink);margin-bottom:8px}\n.legend-items{display:flex;flex-wrap:wrap;gap:10px}\n.legend-item{display:flex;align-items:center;gap:5px;font-size:10.9px;color:var(--mut)}\n.legend-color{width:14px;height:14px;border-radius:3px}\n.legend-color.unattempted{background:var(--navy)}\n.legend-color.attempted{background:#f7ce6b}\n.legend-color.correct{background:var(--green)}\n.legend-color.incorrect{background:var(--red)}\n.stat-row{display:flex;justify-content:space-between;align-items:center;padding:8px 0;border-bottom:1px dashed var(--line)}\n.stat-row:last-child{border-bottom:none}\n.stat-label{color:var(--mut);font-size:13.1px}\n.stat-value{font-weight:700;font-size:15.2px;color:var(--ink)}\n.stat-value.correct{color:var(--green)}\n.stat-value.incorrect{color:var(--red)}\n.action-buttons{display:flex;flex-direction:column;gap:10px}\n.action-btn{width:100%;padding:12px;min-height:46px;border:none;border-radius:var(--r-md);font-size:13.6px;font-weight:700;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:7px;transition:all .3s;font-family:var(--sans)}\n.action-btn.submit{background:linear-gradient(135deg,var(--green) 0%,var(--green-d) 100%);color:#fff;box-shadow:var(--sh-md)}\n.action-btn.submit:hover{transform:translateY(-2px);box-shadow:var(--sh-lg)}\n.action-btn.reset{background:#F8FAFC;color:var(--mut);border:2px solid var(--line)}\n.action-btn.reset:hover{border-color:var(--red);color:var(--red)}\n.action-btn.danger{background:#fff;color:var(--red-d);border:2px solid #f3c1c1}\n.action-btn.danger:hover{background:var(--red);border-color:var(--red);color:#fff}\n.reset-note{font-size:11.5px;color:var(--faint);text-align:center;margin-top:6px;line-height:1.45}\n\n\/* ---------- TOAST & MODAL ---------- *\/\n.warning-toast{position:fixed;bottom:30px;left:50%;transform:translateX(-50%);background:var(--red);color:#fff;padding:12px 24px;border-radius:var(--r-md);font-weight:600;box-shadow:var(--sh-lg);z-index:10000;display:none;animation:gpUp .3s ease;font-size:14.1px}\n.warning-toast.show{display:flex;align-items:center;gap:8px}\n.warning-toast.success{background:var(--green)}\n@keyframes gpUp{from{opacity:0;transform:translateX(-50%) translateY(20px)}to{opacity:1;transform:translateX(-50%) translateY(0)}}\n.result-modal{position:fixed;inset:0;background:rgba(9,20,45,.72);display:none;justify-content:center;align-items:center;z-index:10000;padding:20px}\n.result-modal.show{display:flex}\n.result-content{background:#fff;padding:32px;border-radius:var(--r-lg);text-align:center;max-width:440px;width:100%;box-shadow:var(--sh-lg);animation:gpModal .3s ease;max-height:90vh;overflow-y:auto}\n@keyframes gpModal{from{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}\n.result-icon{font-size:50px;margin-bottom:16px}\n.result-title{font-family:var(--serif);font-size:24px;font-weight:600;color:var(--ink);margin-bottom:8px}\n.result-message{color:var(--mut);margin-bottom:20px;font-size:14.4px}\n.result-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:20px}\n.result-stat{background:#F8FAFC;padding:12px;border-radius:var(--r-md)}\n.result-stat-value{font-family:var(--serif);font-size:22.4px;font-weight:600;color:var(--navy)}\n.result-stat-label{font-size:11.5px;color:var(--mut)}\n.result-buttons{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}\n.result-btn{padding:10px 20px;border:none;border-radius:var(--r-md);font-weight:700;cursor:pointer;transition:all .3s;display:flex;align-items:center;gap:6px;font-size:13.1px;font-family:var(--sans)}\n.result-btn.primary{background:linear-gradient(135deg,var(--navy) 0%,var(--navy-d) 100%);color:#fff}\n.result-btn.secondary{background:#F8FAFC;color:var(--mut)}\n.result-btn.weak{background:linear-gradient(135deg,var(--red) 0%,var(--red-d) 100%);color:#fff}\n.result-btn:hover{transform:translateY(-2px)}\n\n\/* =====================================================\n   TAB 2 \u2014 EXAM ANALYTICS\n===================================================== *\/\n.an-wrap{padding:6px 28px 40px;max-width:1080px;margin:0 auto}\n.an-card{padding:22px 22px}\n.bar-row{display:grid;grid-template-columns:34px minmax(190px,1.5fr) 2.3fr auto;align-items:center;gap:12px;padding:6px 0}\n.bar-row+.bar-row{border-top:1px dashed #eef1f6}\n.bar-rank{font-family:var(--serif);color:var(--mut);font-size:14.4px;text-align:right}\n\/* WRAP FIX: long chapter names wrap onto multiple lines instead of overflowing *\/\n.bar-name{font-size:13.8px;font-weight:500;line-height:1.35;overflow-wrap:break-word;word-break:break-word}\n.bar-track{background:#eef1f6;border-radius:8px;height:20px;overflow:hidden}\n.bar-fill{height:100%;border-radius:8px;transition:width .8s ease}\n.bar-val{font-weight:700;font-size:14.7px;min-width:64px;text-align:right}\n.bar-val .pct{display:inline-block;font-weight:500;color:var(--mut);font-size:11.5px;margin-left:6px}\n.tbl-scroll{overflow-x:auto;border:1px solid var(--line);border-radius:14px;background:#fff}\ntable.matrix{border-collapse:collapse;width:100%;font-size:12.6px;min-width:900px}\ntable.matrix th,table.matrix td{text-align:center;padding:8px 5px;border-bottom:1px solid #eef1f6}\ntable.matrix thead th{background:var(--navy);color:#fff;font-weight:600;font-size:11.7px}\ntable.matrix thead th:first-child{text-align:left;padding-left:14px}\n\/* WRAP FIX: heatmap row-header wraps; bounded so year columns stay visible *\/\n.rn{text-align:left!important;padding-left:14px!important;font-weight:500;white-space:normal;overflow-wrap:break-word;word-break:break-word;min-width:160px;max-width:300px;line-height:1.4;background:#fbfcfe}\n.rt{font-weight:700;background:#f2f4f8;border-left:2px solid var(--gold)}\ntable.matrix tbody tr:hover td{outline:1px solid rgba(201,153,42,.25)}\ntable.matrix tfoot td{background:var(--navy-d);color:#fff;font-weight:700;border-bottom:none}\ntable.matrix tfoot td:first-child{text-align:left;padding-left:14px}\n.hm-legend{display:flex;align-items:center;gap:8px;margin-top:14px;font-size:12.8px;color:var(--mut)}\n.hm-legend .sw{width:22px;height:14px;border-radius:3px;display:inline-block}\n.year-chart{display:flex;align-items:flex-end;gap:8px;height:180px;padding-top:14px}\n.yb{flex:1;display:flex;flex-direction:column;align-items:center;height:100%;justify-content:flex-end}\n.yb-bar{width:100%;max-width:52px;background:linear-gradient(180deg,var(--gold-l),var(--gold));border-radius:6px 6px 0 0;position:relative;min-height:14px;transition:height .8s ease}\n.yb-bar span{position:absolute;top:-20px;left:0;right:0;text-align:center;font-weight:700;font-size:12.8px;color:var(--navy)}\n.yb-lab{margin-top:8px;font-size:10.6px;color:var(--mut);text-align:center}\n.insight{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px}\n.ins{background:var(--card);border:1px solid var(--line);border-left:3px solid var(--gold);border-radius:10px;padding:15px 17px}\n.ins h4{font-size:13.1px;color:var(--navy-d);margin-bottom:6px}\n.ins p{font-size:13.9px;color:#3a4453}\n.ins b{color:var(--gold-d)}\n\n\/* =====================================================\n   TAB 3 \u2014 MY PERFORMANCE (AI COACH)\n===================================================== *\/\n.ai-wrap{padding:6px 28px 40px;max-width:1080px;margin:0 auto}\n.ai-hero{display:grid;grid-template-columns:280px 1fr;gap:18px;align-items:stretch}\n.ai-ring-card{background:linear-gradient(150deg,var(--navy-ink) 0%,var(--navy-d) 70%,#2f5fe0 100%);border-radius:var(--r-lg);padding:26px 20px;color:#fff;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center;box-shadow:var(--sh-md)}\n.ai-ring{position:relative;width:150px;height:150px}\n.ai-ring svg{transform:rotate(-90deg)}\n.ai-ring .bg{fill:none;stroke:rgba(255,255,255,.14);stroke-width:11}\n.ai-ring .fg{fill:none;stroke:var(--gold-l);stroke-width:11;stroke-linecap:round;transition:stroke-dashoffset 1s ease}\n.ai-ring-txt{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center}\n.ai-ring-txt .n{font-family:var(--serif);font-size:40px;font-weight:600;color:var(--gold-l);line-height:1}\n.ai-ring-txt .l{font-size:9.9px;letter-spacing:.12em;text-transform:uppercase;color:#bfdbfe;margin-top:4px}\n.ai-verdict{margin-top:14px;font-size:13.8px;color:#dbeafe;line-height:1.5}\n.ai-verdict b{color:#fff}\n.ai-coach-card{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);padding:22px;box-shadow:var(--sh-sm)}\n.ai-coach-card h3{font-size:15.2px;color:var(--navy-ink);display:flex;align-items:center;gap:8px;margin-bottom:12px}\n.ai-coach-card h3 i{color:var(--gold)}\n.ai-reco{display:flex;gap:12px;padding:11px 0;border-bottom:1px dashed var(--line);align-items:flex-start}\n.ai-reco:last-child{border-bottom:none}\n.ai-reco .ic{width:30px;height:30px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:12.8px;flex-shrink:0;margin-top:2px}\n.ai-reco .ic.hot{background:var(--red-bg);color:var(--red-d)}\n.ai-reco .ic.warm{background:#fef7e6;color:var(--amber-d)}\n.ai-reco .ic.cool{background:#eff6ff;color:var(--navy)}\n.ai-reco .ic.good{background:var(--green-bg);color:var(--green-d)}\n.ai-reco p{font-size:13.9px;color:#37414f}\n.ai-reco p b{color:var(--navy-ink)}\n.ai-reco .go{margin-left:auto;flex-shrink:0;background:#EFF6FF;color:var(--navy-d);border:1px solid #d4e2fb;border-radius:8px;padding:6px 12px;font-size:11.5px;font-weight:700;cursor:pointer;transition:all .25s;font-family:var(--sans);white-space:nowrap}\n.ai-reco .go:hover{background:var(--navy);color:#fff}\n\n.ai-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-top:18px}\n.ai-kpi{background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);padding:14px 16px;box-shadow:var(--sh-sm)}\n.ai-kpi .n{font-family:var(--serif);font-size:25.6px;font-weight:600;color:var(--navy-d)}\n.ai-kpi .n.g{color:var(--green-d)} .ai-kpi .n.r{color:var(--red-d)} .ai-kpi .n.a{color:var(--amber-d)}\n.ai-kpi .l{font-size:10.9px;letter-spacing:.05em;text-transform:uppercase;color:var(--mut);margin-top:2px}\n\ntable.perf{border-collapse:collapse;width:100%;font-size:13.1px;min-width:760px}\ntable.perf th,table.perf td{padding:10px 10px;border-bottom:1px solid #eef1f6;text-align:center}\ntable.perf thead th{background:var(--navy);color:#fff;font-weight:600;font-size:11.5px}\ntable.perf th:first-child,table.perf td:first-child{text-align:left;padding-left:14px}\n\/* WRAP FIX: chapter column wraps; bounded so metric columns stay visible *\/\ntable.perf td:first-child{font-weight:500;background:#fbfcfe;white-space:normal;overflow-wrap:break-word;word-break:break-word;min-width:150px;max-width:260px;line-height:1.4}\n.mini-track{background:#eef1f6;border-radius:6px;height:9px;overflow:hidden;min-width:80px}\n.mini-fill{height:100%;border-radius:6px}\n.tag{display:inline-block;font-size:10.6px;font-weight:700;padding:3px 9px;border-radius:20px;text-transform:uppercase;letter-spacing:.03em}\n.tag.hot{background:var(--red-bg);color:var(--red-d)}\n.tag.warm{background:#fef7e6;color:var(--amber-d)}\n.tag.ok{background:#eff6ff;color:var(--navy-d)}\n.tag.good{background:var(--green-bg);color:var(--green-d)}\n.tag.na{background:#f1f5f9;color:var(--faint)}\n.mini-go{background:none;border:1px solid var(--line);border-radius:8px;padding:5px 10px;font-size:11.2px;font-weight:700;color:var(--navy-d);cursor:pointer;transition:all .25s;font-family:var(--sans)}\n.mini-go:hover{background:var(--navy);color:#fff;border-color:var(--navy)}\n\n.rev-item{display:flex;align-items:center;gap:10px;background:#F8FAFC;border-left:3px solid var(--amber);border-radius:var(--r-sm);padding:10px 12px;margin-bottom:8px;font-size:12.6px;cursor:pointer;transition:all .25s}\n.rev-item:hover{background:#fef7e6;transform:translateX(3px)}\n.rev-item .q-num{font-weight:700;color:var(--amber-d);flex-shrink:0}\n.rev-item .q-text{flex:1;color:var(--mut);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.rev-item .days{background:var(--amber);color:#fff;padding:2px 8px;border-radius:20px;font-size:10.2px;font-weight:700;white-space:nowrap}\n.ai-empty{text-align:center;padding:34px 20px;color:var(--mut)}\n.ai-empty i{font-size:32px;color:var(--gold);margin-bottom:12px;display:block}\n.ai-empty .big{font-family:var(--serif);font-size:19.2px;color:var(--navy-ink);margin-bottom:6px}\n.ai-empty p{font-size:13.9px;max-width:52ch;margin:0 auto}\n.ai-two{display:grid;grid-template-columns:1fr 1fr;gap:18px}\n.perf-reset-wrap{margin-top:34px;padding:18px;border:1px dashed #f3c1c1;border-radius:var(--r-lg);background:#fffafa;display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap}\n.perf-reset-wrap p{font-size:13.1px;color:var(--mut);flex:1;min-width:220px}\n.perf-reset-wrap p b{color:var(--red-d)}\n.perf-reset-btn{padding:11px 20px;background:#fff;border:2px solid #f3c1c1;border-radius:var(--r-md);color:var(--red-d);font-size:13.1px;font-weight:700;cursor:pointer;transition:all .25s;font-family:var(--sans);display:flex;align-items:center;gap:7px;white-space:nowrap}\n.perf-reset-btn:hover{background:var(--red);border-color:var(--red);color:#fff}\n\n\/* ---------- RESPONSIVE ---------- *\/\n@media(max-width:1024px){.quiz-container{grid-template-columns:minmax(0,1fr) 270px;gap:14px}}\n@media(max-width:900px){\n  \/* MOBILE: question first, everything else stacks below *\/\n  .quiz-container{grid-template-columns:1fr;padding:0 12px 12px;gap:14px}\n  .filter-bar{padding:12px 12px 0}\n  .filter-list{flex-wrap:nowrap;overflow-x:auto;padding-bottom:6px;-webkit-overflow-scrolling:touch}\n  .question-panel{order:1}\n  .dashboard-sidebar{order:2}\n  .gp-head-top{flex-direction:column;gap:12px}\n  .gp-stats{width:100%;flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;-webkit-overflow-scrolling:touch}\n  .gp-stat{min-width:84px;padding:7px 12px;flex:0 0 auto}\n  .gp-stat .n{font-size:19.2px}\n  .gp-tabs{overflow-x:auto;flex-wrap:nowrap;-webkit-overflow-scrolling:touch}\n  .gp-tab{flex:0 0 auto;white-space:nowrap}\n  .mode-selector{flex-direction:column;align-items:stretch;padding:10px 12px}\n  .mode-tabs{overflow-x:auto;flex-wrap:nowrap;padding-bottom:4px;-webkit-overflow-scrolling:touch}\n  .mode-tab{flex:0 0 auto;white-space:nowrap}\n  .session-info{justify-content:center}\n  \/* navigator becomes a horizontal strip *\/\n  .question-grid{display:flex;flex-wrap:nowrap;overflow-x:auto;max-height:none;padding-bottom:6px;gap:7px;-webkit-overflow-scrolling:touch}\n  .grid-item{flex:0 0 40px;height:40px;aspect-ratio:auto}\n  .weak-question-list{max-height:150px}\n  .ai-hero{grid-template-columns:1fr}\n  .ai-two{grid-template-columns:1fr}\n}\n@media(max-width:600px){\n  .gp-header{padding:18px 14px 0}\n  .gp-brand h1{font-size:20.5px}\n  .gp-brand p{font-size:12.5px}\n  .gp-tabs{overflow-x:auto;flex-wrap:nowrap;-webkit-overflow-scrolling:touch}\n  .gp-tab{padding:9px 13px;font-size:12px;flex:0 0 auto;white-space:nowrap}\n  .an-wrap,.ai-wrap{padding:6px 12px 30px}\n  .question-header{padding:11px 14px}\n  .question-number{font-size:15px}\n  .question-body{padding:14px}\n  .question-text{font-size:17px !important;padding:15px 16px;line-height:1.68}\n  .q-stmt{margin-left:6px;grid-template-columns:26px 1fr}\n  .option-item{padding:11px 12px;gap:9px}\n  .option-letter{min-width:30px;font-size:16.3px !important}\n  .option-text{font-size:16.3px !important}\n  .option-item:hover:not(.disabled){transform:none}\n  .question-nav{flex-wrap:wrap;padding:12px;gap:9px}\n  .nav-btn{padding:11px 16px;font-size:12.8px;flex:1;justify-content:center}\n  .nav-btn.check{order:-1;width:100%;max-width:none;flex-basis:100%}\n  .progress-combo{grid-template-columns:auto 1fr}\n  .result-stats{grid-template-columns:repeat(3,1fr);gap:7px}\n  .result-content{padding:22px}\n  .result-buttons{flex-direction:column}\n  .bar-row{grid-template-columns:28px 1fr;row-gap:4px}\n  .bar-track{grid-column:1\/-1}\n  .bar-name,.bar-val{grid-column:2;text-align:left}\n  .sec-head{flex-wrap:wrap;gap:6px}\n  .sec-head .hint{margin-left:0;flex-basis:100%}\n  .sec-head h2{font-size:16px}\n  .year-chart{height:140px;gap:5px}\n  .yb-bar span{font-size:10.9px;top:-17px}\n  .yb-lab{font-size:9.3px}\n  .ai-ring{transform:scale(.85);margin:-8px}\n  .ai-ring-txt .n{font-size:33.6px}\n  .ai-kpis{grid-template-columns:repeat(2,1fr)}\n  .ai-kpi .n{font-size:20.8px}\n  .ai-reco{flex-wrap:wrap}\n  .ai-reco .go{margin-left:42px}\n  .insight{grid-template-columns:1fr}\n  .progress-combo{gap:10px}\n  .warning-toast{width:calc(100% - 32px);justify-content:center;font-size:12.8px}\n  .gp-stat{min-width:76px}\n  .perf-reset-wrap{flex-direction:column;align-items:stretch}\n  .perf-reset-btn{justify-content:center}\n}\n\/* very small phones *\/\n@media(max-width:380px){\n  .gp-header{padding:14px 10px 0}\n  .gp-tab{padding:8px 10px;font-size:11.2px}\n  .mode-tab{padding:8px 11px;font-size:11.7px}\n  .question-text{font-size:16px !important;padding:12px}\n  .option-text,.option-letter{font-size:15.5px !important}\n  .an-wrap,.ai-wrap{padding:6px 8px 24px}\n  .quiz-container{padding:0 8px 8px}\n  .filter-bar{padding:10px 8px 0}\n}\n<\/style>\n\n<div class=\"gfr-portal\" id=\"quizWrapper\">\n    <!-- Warning Toast -->\n    <div class=\"warning-toast\" id=\"warningToast\">\n        <span class=\"ic\">\u26a0\ufe0f<\/span>\n        <span id=\"toastMessage\">Message<\/span>\n    <\/div>\n\n    <!-- Result Modal -->\n    <div class=\"result-modal\" id=\"resultModal\">\n        <div class=\"result-content\">\n            <div class=\"result-icon\" id=\"resultIcon\">\ud83c\udf89<\/div>\n            <h2 class=\"result-title\" id=\"resultTitle\">Great Job!<\/h2>\n            <p class=\"result-message\" id=\"resultMessage\">You have completed the quiz.<\/p>\n            <div class=\"result-stats\">\n                <div class=\"result-stat\">\n                    <div class=\"result-stat-value\" id=\"resultCorrect\">0<\/div>\n                    <div class=\"result-stat-label\">Correct<\/div>\n                <\/div>\n                <div class=\"result-stat\">\n                    <div class=\"result-stat-value\" id=\"resultIncorrect\">0<\/div>\n                    <div class=\"result-stat-label\">Incorrect<\/div>\n                <\/div>\n                <div class=\"result-stat\">\n                    <div class=\"result-stat-value\" id=\"resultScore\">0%<\/div>\n                    <div class=\"result-stat-label\">Score<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"result-buttons\">\n                <button class=\"result-btn secondary\" id=\"reviewBtn\"><span class=\"ic\">\ud83d\udc41<\/span> Review<\/button>\n                <button class=\"result-btn weak\" id=\"practiceWeakBtn\" style=\"display:none;\"><span class=\"ic\">\u26a0\ufe0f<\/span> Practice Weak<\/button>\n                <button class=\"result-btn primary\" id=\"retryBtn\"><span class=\"ic\">\u21bb<\/span> Try Again<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- ================= HEADER ================= -->\n    <header class=\"gp-header\">\n        <div class=\"gp-head-top\">\n            <div class=\"gp-brand\">\n                <div class=\"eyebrow\">CSS ADDA \u00b7 PromotionExams.com \u00b7 Paper 1<\/div>\n                <h1 id=\"topicName\">Right to Information (RTI) Act, 2005 -PYQs<\/h1>\n                <p id=\"topicSubtitle\"><\/p>\n            <\/div>\n            <div class=\"gp-stats\">\n                <div class=\"gp-stat\"><div class=\"n\" id=\"hdrTotalQ\">0<\/div><div class=\"l\">PYQs<\/div><\/div>\n                <div class=\"gp-stat\"><div class=\"n\" id=\"hdrCycles\">0<\/div><div class=\"l\">Exam Cycles<\/div><\/div>\n                <div class=\"gp-stat\"><div class=\"n\" id=\"hdrMastered\">0%<\/div><div class=\"l\">Mastered<\/div><\/div>\n                <div class=\"gp-stat clickable\" id=\"weakBadgeHeader\" style=\"display:none;\"><div class=\"n\" id=\"weakCountHeader\">0<\/div><div class=\"l\">Weak Areas<\/div><\/div>\n                <div class=\"gp-stat\"><div class=\"n\" id=\"hdrReadiness\">\u2014<\/div><div class=\"l\">Readiness<\/div><\/div>\n            <\/div>\n        <\/div>\n        <nav class=\"gp-tabs\">\n            <button class=\"gp-tab active\" data-view=\"practice\"><span class=\"ic\">\u270d\ufe0f<\/span> Practice Quiz<\/button>\n            <button class=\"gp-tab\" data-view=\"analytics\"><span class=\"ic\">\ud83d\udcca<\/span> Exam Analytics<\/button>\n            <button class=\"gp-tab\" data-view=\"performance\"><span class=\"ic\">\ud83e\udde0<\/span> My Performance <span class=\"pill\" id=\"perfPill\" style=\"display:none;\">!<\/span><\/button>\n        <\/nav>\n    <\/header>\n\n    <!-- ================= VIEW 1 : PRACTICE QUIZ ================= -->\n    <div class=\"gp-view active\" id=\"view-practice\">\n\n    <!-- Mode Selector -->\n    <div class=\"mode-selector\">\n        <div class=\"mode-tabs\">\n            <button class=\"mode-tab active\" data-mode=\"all\" id=\"modeAll\">\n                <span class=\"ic\">\ud83d\udccb<\/span> All Questions <span class=\"badge\" id=\"allCount\">0<\/span>\n            <\/button>\n            <button class=\"mode-tab\" data-mode=\"year\" id=\"modeYear\">\n                <span class=\"ic\">\ud83d\udcc5<\/span> By Year\n            <\/button>\n            <button class=\"mode-tab\" data-mode=\"chapter\" id=\"modeChapter\">\n                <span class=\"ic\">\ud83d\udcda<\/span> By Chapter\n            <\/button>\n            <button class=\"mode-tab weak-mode\" data-mode=\"weak\" id=\"modeWeak\">\n                <span class=\"ic\">\u26a0\ufe0f<\/span> Weak Areas <span class=\"badge\" id=\"weakModeCount\">0<\/span>\n            <\/button>\n        <\/div>\n        <div class=\"session-info\" id=\"sessionInfo\" style=\"display:none;\">\n            <span class=\"ic\">\ud83d\udd58<\/span>\n            <span id=\"sessionText\">Last session: Q5<\/span>\n            <button class=\"resume-btn\" id=\"resumeBtn\"><span class=\"ic\">\u25b6<\/span> Resume<\/button>\n        <\/div>\n    <\/div>\n\n    <!-- FILTER BAR (before the MCQ content) -->\n    <div class=\"filter-bar\">\n        <div class=\"filter-bar-row\">\n            <div class=\"quiz-card\" id=\"yearFilterCard\">\n                <div class=\"quiz-card-header light\"><h3><span class=\"ic\">\ud83d\udcc5<\/span> Filter by Year<\/h3><\/div>\n                <div class=\"quiz-card-body\" style=\"padding:10px 14px\"><div class=\"filter-list\" id=\"yearList\"><\/div><\/div>\n            <\/div>\n            <div class=\"quiz-card\" id=\"chapterFilterCard\">\n                <div class=\"quiz-card-header light\"><h3><span class=\"ic\">\ud83d\udcda<\/span> Filter by Chapter<\/h3><\/div>\n                <div class=\"quiz-card-body\" style=\"padding:10px 14px\"><div class=\"filter-list\" id=\"chapterList\"><\/div><\/div>\n            <\/div>\n            <div class=\"quiz-card weak-areas-card\" id=\"weakAreasCard\" style=\"display:none;\">\n                <div class=\"quiz-card-header\"><h3><span class=\"ic\">\u26a0\ufe0f<\/span> Weak Areas<\/h3><\/div>\n                <div class=\"quiz-card-body\" style=\"padding:10px 14px\">\n                    <div class=\"weak-question-list\" id=\"weakQuestionList\"><\/div>\n                    <button class=\"practice-weak-btn\" id=\"practiceWeakAreasBtn\"><span class=\"ic\">\u21bb<\/span> Practice All Weak Areas<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- Main Container -->\n    <div class=\"quiz-container\">\n        <!-- Question Panel (primary) -->\n        <main class=\"question-panel\">\n            <div class=\"question-header\">\n                <span class=\"question-number\" id=\"questionNumber\">Question 1 of 20<\/span>\n                <div class=\"question-meta\">\n                    <div class=\"meta-badge year\"><span class=\"ic\">\ud83d\udcc5<\/span> <span id=\"currentQuestionYear\">\u2014<\/span><\/div>\n                    <div class=\"meta-badge chapter\"><span class=\"ic\">\ud83d\udcd6<\/span> <span id=\"currentQuestionChapter\">\u2014<\/span><\/div>\n                    <div class=\"meta-badge weak\" id=\"weakBadge\" style=\"display:none;\"><span class=\"ic\">\u26a0\ufe0f<\/span> <span>Weak<\/span><\/div>\n                <\/div>\n            <\/div>\n            <div class=\"question-body\">\n                <div class=\"question-text\" id=\"questionText\">Loading question...<\/div>\n                <div class=\"options-list\" id=\"optionsList\"><\/div>\n                <div class=\"explanation-box\" id=\"explanationBox\">\n                    <div class=\"explanation-title\"><span class=\"ic\">\ud83d\udca1<\/span> Explanation<\/div>\n                    <p class=\"explanation-text\" id=\"explanationText\"><\/p>\n                <\/div>\n                <div class=\"mastery-indicator\" id=\"masteryIndicator\">\n                    <span class=\"mastery-label\"><span class=\"ic\">\u2b50<\/span> Mastery:<\/span>\n                    <div class=\"mastery-stars\" id=\"masteryStars\">\n                        <i>\u2605<\/i><i>\u2605<\/i><i>\u2605<\/i><i>\u2605<\/i><i>\u2605<\/i>\n                    <\/div>\n                <\/div>\n                <div class=\"question-nav\">\n                    <button class=\"nav-btn prev\" id=\"prevBtn\"><span class=\"ic\">\u2190<\/span> Previous<\/button>\n                    <button class=\"nav-btn check\" id=\"checkBtn\"><span class=\"ic\">\u2713<\/span> Check Answer<\/button>\n                    <button class=\"nav-btn next\" id=\"nextBtn\">Next <span class=\"ic\">\u2192<\/span><\/button>\n                <\/div>\n            <\/div>\n        <\/main>\n\n        <!-- Right Rail: navigator \u2192 progress \u2192 actions -->\n        <aside class=\"dashboard-sidebar\">\n            <div class=\"quiz-card\">\n                <div class=\"quiz-card-header light\"><h3><span class=\"ic\">\ud83d\uddc2\ufe0f<\/span> Question Navigator<\/h3><\/div>\n                <div class=\"quiz-card-body\">\n                    <div class=\"question-grid\" id=\"questionGrid\"><\/div>\n                    <div class=\"legend\">\n                        <div class=\"legend-items\">\n                            <div class=\"legend-item\"><div class=\"legend-color unattempted\"><\/div><span>New<\/span><\/div>\n                            <div class=\"legend-item\"><div class=\"legend-color attempted\"><\/div><span>Seen<\/span><\/div>\n                            <div class=\"legend-item\"><div class=\"legend-color correct\"><\/div><span>Correct<\/span><\/div>\n                            <div class=\"legend-item\"><div class=\"legend-color incorrect\"><\/div><span>Incorrect<\/span><\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n            <div class=\"quiz-card\">\n                <div class=\"quiz-card-header\"><h3><span class=\"ic\">\ud83c\udfc6<\/span> Progress &amp; Session<\/h3><\/div>\n                <div class=\"quiz-card-body\">\n                    <div class=\"progress-combo\">\n                        <div class=\"progress-ring-container\">\n                            <div class=\"progress-ring\">\n                                <svg width=\"100\" height=\"100\">\n                                    <circle class=\"progress-ring-bg\" cx=\"50\" cy=\"50\" r=\"42\"><\/circle>\n                                    <circle class=\"progress-ring-fill\" cx=\"50\" cy=\"50\" r=\"42\" stroke-dasharray=\"264\" stroke-dashoffset=\"264\" id=\"progressRingFill\"><\/circle>\n                                <\/svg>\n                                <div class=\"progress-ring-text\">\n                                    <span class=\"progress-ring-percentage\" id=\"progressPercentage\">0%<\/span>\n                                    <span class=\"progress-ring-label\">Mastered<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                        <div class=\"stat-col\">\n                            <div class=\"stat-row\"><span class=\"stat-label\">Questions<\/span><span class=\"stat-value\" id=\"totalQuestions\">0<\/span><\/div>\n                            <div class=\"stat-row\"><span class=\"stat-label\">Attempted<\/span><span class=\"stat-value\" id=\"attemptedCount\">0<\/span><\/div>\n                            <div class=\"stat-row\"><span class=\"stat-label\">Correct<\/span><span class=\"stat-value correct\" id=\"correctCount\">0<\/span><\/div>\n                            <div class=\"stat-row\"><span class=\"stat-label\">Incorrect<\/span><span class=\"stat-value incorrect\" id=\"incorrectCount\">0<\/span><\/div>\n                        <\/div>\n                    <\/div>\n                    <div class=\"progress-stats-mini\" style=\"margin-top:10px\">\n                        <div class=\"progress-stat-mini\"><div class=\"value correct\" id=\"totalCorrectProgress\">0<\/div><div class=\"label\">Lifetime Correct<\/div><\/div>\n                        <div class=\"progress-stat-mini\"><div class=\"value incorrect\" id=\"totalWeakProgress\">0<\/div><div class=\"label\">Weak Areas<\/div><\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n            <div class=\"action-buttons\">\n                <button class=\"action-btn submit\" id=\"submitBtn\"><span class=\"ic\">\ud83d\udce4<\/span> Submit &amp; View Results<\/button>\n                <button class=\"action-btn reset\" id=\"resetBtn\"><span class=\"ic\">\u21ba<\/span> Reset Session<\/button>\n                <p class=\"reset-note\">Resets only this session's answers.<br>Lifetime performance &amp; mastery are kept.<\/p>\n            <\/div>\n        <\/aside>\n    <\/div>\n    <\/div><!-- \/view-practice -->\n\n    <!-- ================= VIEW 2 : EXAM ANALYTICS ================= -->\n    <div class=\"gp-view\" id=\"view-analytics\">\n        <div class=\"an-wrap\">\n            <div class=\"sec-head\"><span class=\"num\">01<\/span><h2>Ranked \u2014 Total MCQs per Chapter<\/h2><span class=\"hint\">gold = high-yield (15+ Qs)<\/span><\/div>\n            <div class=\"an-card\" id=\"rankedBars\"><\/div>\n\n            <div class=\"sec-head\"><span class=\"num\">02<\/span><h2>Heatmap Matrix \u2014 Chapter \u00d7 Exam Year<\/h2><span class=\"hint\">darker gold = more questions<\/span><\/div>\n            <div class=\"tbl-scroll\" id=\"heatmapContainer\"><\/div>\n            <div class=\"hm-legend\"><span>Low<\/span><span class=\"sw\" style=\"background:#fdf6e3\"><\/span><span class=\"sw\" style=\"background:#f6e7b8\"><\/span><span class=\"sw\" style=\"background:#e9cf7f\"><\/span><span class=\"sw\" style=\"background:#d8b23f\"><\/span><span class=\"sw\" style=\"background:#c9992a\"><\/span><span>High<\/span><\/div>\n\n            <div class=\"sec-head\"><span class=\"num\">03<\/span><h2>Questions per Exam Cycle<\/h2><\/div>\n            <div class=\"an-card\"><div class=\"year-chart\" id=\"cycleChart\"><\/div><\/div>\n\n            <div class=\"sec-head\"><span class=\"num\">04<\/span><h2>Takeaways for Preparation<\/h2><\/div>\n            <div class=\"insight\" id=\"takeaways\"><\/div>\n        <\/div>\n    <\/div><!-- \/view-analytics -->\n\n    <!-- ================= VIEW 3 : MY PERFORMANCE (AI COACH) ================= -->\n    <div class=\"gp-view\" id=\"view-performance\">\n        <div class=\"ai-wrap\">\n            <div id=\"aiEmptyState\" class=\"an-card ai-empty\" style=\"display:none;margin-top:24px;\">\n                <span class=\"ic\" style=\"font-size:32px\">\ud83e\udde0<\/span>\n                <div class=\"big\">Your AI coach is waiting for data<\/div>\n                <p>Attempt a few questions in the Practice tab. The coach will then compute your exam-readiness score, detect weak chapters weighted by their real exam frequency, and build a personalised study plan.<\/p>\n            <\/div>\n\n            <div id=\"aiContent\">\n                <div class=\"sec-head\" style=\"margin-top:24px;\"><span class=\"num\">01<\/span><h2>Exam Readiness \u2014 AI Assessment<\/h2><span class=\"hint\">weighted by real PYQ frequency<\/span><\/div>\n                <div class=\"ai-hero\">\n                    <div class=\"ai-ring-card\">\n                        <div class=\"ai-ring\">\n                            <svg width=\"150\" height=\"150\">\n                                <circle class=\"bg\" cx=\"75\" cy=\"75\" r=\"64\"><\/circle>\n                                <circle class=\"fg\" cx=\"75\" cy=\"75\" r=\"64\" stroke-dasharray=\"402\" stroke-dashoffset=\"402\" id=\"aiRingFill\"><\/circle>\n                            <\/svg>\n                            <div class=\"ai-ring-txt\"><span class=\"n\" id=\"aiScore\">0<\/span><span class=\"l\">Readiness \/ 100<\/span><\/div>\n                        <\/div>\n                        <div class=\"ai-verdict\" id=\"aiVerdict\"><\/div>\n                    <\/div>\n                    <div class=\"ai-coach-card\">\n                        <h3><span class=\"ic\">\ud83e\ude84<\/span> Smart Study Plan \u2014 What to do next<\/h3>\n                        <div id=\"aiRecoList\"><\/div>\n                    <\/div>\n                <\/div>\n                <div class=\"ai-kpis\" id=\"aiKpis\"><\/div>\n\n                <div class=\"sec-head\"><span class=\"num\">02<\/span><h2>Chapter Performance vs Exam Weight<\/h2><span class=\"hint\">priority = high weight \u00d7 low accuracy<\/span><\/div>\n                <div class=\"tbl-scroll\"><table class=\"perf\">\n                    <thead><tr><th>Chapter<\/th><th>Exam Weight<\/th><th>Coverage<\/th><th>Accuracy<\/th><th>Status<\/th><th>Action<\/th><\/tr><\/thead>\n                    <tbody id=\"perfTableBody\"><\/tbody>\n                <\/table><\/div>\n\n                <div class=\"ai-two\" style=\"margin-top:34px;\">\n                    <div>\n                        <div class=\"sec-head\" style=\"margin-top:0;\"><span class=\"num\">03<\/span><h2>Revision Queue<\/h2><span class=\"hint\">spaced repetition<\/span><\/div>\n                        <div class=\"an-card\" id=\"revisionQueue\"><\/div>\n                    <\/div>\n                    <div>\n                        <div class=\"sec-head\" style=\"margin-top:0;\"><span class=\"num\">04<\/span><h2>Mastery Distribution<\/h2><\/div>\n                        <div class=\"an-card\" id=\"masteryDist\"><\/div>\n                    <\/div>\n                <\/div>\n\n                <!-- Performance reset (lifetime data) -->\n                <div class=\"perf-reset-wrap\">\n                    <p><b>Danger zone:<\/b> this permanently erases your lifetime performance for this quiz \u2014 mastery stars, weak areas, accuracy history and the readiness score. Session reset on the Practice tab does <b>not<\/b> touch this data.<\/p>\n                    <button class=\"perf-reset-btn\" id=\"resetPerfBtn\"><span class=\"ic\">\ud83d\uddd1\ufe0f<\/span> Reset My Performance<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div><!-- \/view-performance -->\n<\/div>\n<script>\n\/\/ ==========================================\n\/\/ QUIZ CONFIGURATION  \u2190 EDIT PER QUIZ\n\/\/ ==========================================\nconst quizConfig = {\n    \/\/ UNIQUE id per quiz. Progress is stored in localStorage under this key,\n    \/\/ so two quizzes MUST NOT share the same quizId.\n    quizId: 'CHANGE-ME-unique-quiz-id',\n    topic: 'Right to Information (RTI) Act, 2005 -PYQs',                       \/\/ header H1\n    subtitle: 'Combined SO\/Steno LDCE Previous Year Questions \u00b7 Smart Practice & Analytics',\n    paper: 'Paper 2',\n    wpAjaxUrl: '\/wp-admin\/admin-ajax.php',\n    useWordPressSync: true,\n    masteryThreshold: 3,   \/\/ consecutive\/total correct needed for \"mastered\"\n    weakThreshold: 1,      \/\/ wrong attempts before a question is flagged weak\n    revisionGapDays: 7     \/\/ days after which a mastered Q re-enters revision\n};\n\n\/\/ ==========================================\n\/\/ QUESTIONS DATA  \u2190 PASTE YOUR MCQs HERE\n\/\/ ------------------------------------------\n\/\/ Each question object looks like this:\n\/\/ {\n\/\/   id: 1,                          \/\/ unique number WITHIN a year group\n\/\/   year: '2023',                   \/\/ exam year\/cycle label (string)\n\/\/   chapter: 'CH 1: Chapter Name',  \/\/ chapter\/topic label (used by filters,\n\/\/                                   \/\/ analytics and the AI coach)\n\/\/   question: \"Question text...\\n1. Statement one\\n2. Statement two\\nSelect the correct answer using the code given below:\",\n\/\/   options: [\"Option A\", \"Option B\", \"Option C\", \"Option D\"],\n\/\/   correct: 2,                     \/\/ 0-based index of the right option\n\/\/   explanation: `Explanation text shown after checking the answer.`\n\/\/ },\n\/\/ Numbered statements: start a line with \"1.\" \/ \"2.\" etc (use \\n or <br>).\n\/\/ Lines starting with \"Select the correct answer\u2026\" \/ \"Which of the above\u2026\"\n\/\/ are auto-styled as the lead line, UPSC question-paper style.\n\/\/ ==========================================\n\n\n const allQuestions = [\n{\n    id: 1,\n    year: '2009-11',\n    chapter: 'CH 2: RIGHT TO INFORMATION AND OBLIGATIONS OF PUBLIC AUTHORITIES',\n    question: \"Under the provisions of the Right to Information Act 2005, the obligation of a public authority does not include\",\n    options: [\n      \"supply of information immediately on receiving application.\",\n      \"publish the procedure to be followed in the decision making process.\",\n      \"publish a directory of its officers and employees.\",\n      \"publish the particulars of recipients of concessions and permits.\"\n    ],\n    correct: 0,\n    explanation: \"<b>Section 7(1) \u2013 30 Days, Not Immediate Supply<\/b><br>Section 7(1) requires information to be supplied 'as expeditiously as possible, and in any case within thirty days' of receipt of the request \u2014 there is no obligation of 'immediate' supply upon receiving the application. By contrast, publishing the decision-making procedure (Section 4(1)(b)(iii)), a directory of officers\/employees (Section 4(1)(b)(ix)), and particulars of recipients of concessions, permits, or authorisations (Section 4(1)(b)(xii)) are all genuine, express obligations.\"\n  },\n  {\n    id: 9,\n    year: '2009-11',\n    chapter: 'CH 5: POWERS AND FUNCTIONS OF THE INFORMATION COMMISSIONS, APPEAL AND PENALTIES',\n    question: \"Which one among the following statements about the powers of the Central and State Information Commission is not correct?\",\n    options: [\n      \"The Central and State Information Commission can enquire into complaint pertaining to excessive amount of fee charged for supplying any information.\",\n      \"The Central and State Information Commission have the powers of a civil court as provided under the Code of Civil Procedure, 1908 in respect of specified matters.\",\n      \"The Central and State Information Commission have power to punish a guilty person with imprisonment not exceeding three months.\",\n      \"The Central and State Information Commission have power to secure publication of certain information required under the Right to Information Act, 2005.\"\n    ],\n    correct: 2,\n    explanation: \"<b>Sections 18(1)(d), 18(3), 19(8) \u2013 No Imprisonment Power<\/b><br>The Commission may inquire into complaints about unreasonable fees (Section 18(1)(d)) \u2705, has civil-court powers under Section 18(3) for specified purposes \u2705, and can require publication of certain information under Section 19(8)(a)(iii) \u2705. However, neither the Central nor a State Information Commission has any power to impose imprisonment on a guilty person \u2014 its only sanction under the Act against a defaulting PIO is the monetary penalty under Section 20.\"\n  },\n  {\n    id: 14,\n    year: '2012-13',\n    chapter: 'CH 6: MISCELLANEOUS',\n    question: \"Which one of the following statements is incorrect?\",\n    options: [\n      \"No order passed under the RTI Act, 2005 shall be called in question before any High Court\",\n      \"Information regarding corruption in Research and Analysis Wing of the Cabinet Secretariat can be made available under the RTI Act, 2005\",\n      \"Any information regarding allegations of violation of human rights by any security organization of the Central Government can be provided under the RTI Act, 2005 in a limited manner\",\n      \"The Central Government has power to include or exclude any intelligence organization from the application of the RTI Act, 2005\"\n    ],\n    correct: 0,\n    explanation: \"<b>Section 23 \u2013 Bar Is Not Absolute Against Writ Jurisdiction<\/b><br>Section 23 bars the jurisdiction of ordinary CIVIL courts from entertaining suits or proceedings regarding orders made under the Act, and bars such orders from being questioned 'otherwise than by way of an appeal under this Act.' However, this statutory bar cannot oust the constitutional writ jurisdiction of the High Courts (Article 226) or the Supreme Court (Article 32) \u2014 such orders remain amenable to judicial review by writ. The blanket assertion that no order 'shall be called in question before any High Court' therefore overstates Section 23 and is incorrect. The remaining statements \u2014 regarding disclosure of corruption information in RAW and limited disclosure of human-rights-violation information in security organisations (both under the proviso to Section 24), and the Central Government's power to amend the Second Schedule (Section 24(2)) \u2014 are correct.\"\n  },\n  {\n    id: 15,\n    year: '2012-13',\n    chapter: 'CH 2: RIGHT TO INFORMATION AND OBLIGATIONS OF PUBLIC AUTHORITIES',\n    question: \"According to the provisions of the RTI Act, 2005, which one among the following pairs is correctly matched?\",\n    options: [\n      \"Physically challenged persons - No fee is required to be paid for supplying information\",\n      \"Persons below poverty line - No fee is required to be paid for supplying information\",\n      \"An application seeking information which is available with another public authority - Must be transferred within 15 days to that other public authority\",\n      \"An appeal before the Central Information Commission - Must be decided within 30 days\"\n    ],\n    correct: 1,\n    explanation: \"<b>Section 7(5) proviso \u2013 BPL Fee Exemption<\/b><br>The proviso to Section 7(5) exempts persons belonging to the Below Poverty Line category from paying any fee for obtaining information \u2014 this is the correctly matched pair. The RTI Act does not provide a general fee waiver specifically for 'physically challenged persons' as a category (though Section 7(4) does provide assistance for sensorily disabled persons in accessing records); transfer of an application under Section 6(3) must occur within five days, not fifteen; and the Act does not prescribe a rigid 30-day deadline for the Information Commission to decide a second appeal.\"\n  },\n  {\n    id: 18,\n    year: '2014',\n    chapter: 'CH 5: POWERS AND FUNCTIONS OF THE INFORMATION COMMISSIONS, APPEAL AND PENALTIES',\n    question: \"Under the RTI Act, 2005, fine cannot be imposed in which one of the following cases?\",\n    options: [\n      \"Refusal to receive an application for information\",\n      \"Giving incorrect information\",\n      \"Destroying information\",\n      \"Refusing information on the ground that the same was exempt under Section 8(1)(j)\"\n    ],\n    correct: 3,\n    explanation: \"<b>Section 20(1) \u2013 'Without Reasonable Cause'<\/b><br>Section 20(1) imposes a penalty only where the PIO acts 'without any reasonable cause' \u2014 such as refusing to receive an application, giving incorrect information, or destroying information without justification. Where a PIO correctly refuses information on a genuinely applicable exemption ground such as Section 8(1)(j) (personal information\/privacy), this constitutes a reasonable cause for refusal and does not attract penalty under Section 20.\"\n  },\n  {\n    id: 23,\n    year: '2014',\n    chapter: 'CH 2: RIGHT TO INFORMATION AND OBLIGATIONS OF PUBLIC AUTHORITIES',\n    question: \"If an applicant is not supplied information by a Public Information Officer within prescribed time, which of the following consequences follow(s)?\\n1. The concerned Public Information Officer may face disciplinary action.\\n2. An appeal may be filed before the Appellate Authority at any time.\\n3. The Central or State Information Commission, as the case may be, may receive and enquire into the complaint of the applicant.\\n4. It shall be presumed that the information has been refused.\\n\\nSelect the correct answer using the code given below.\",\n    options: [\n      \"1, 3 and 4\",\n      \"3 and 4 only\",\n      \"2\",\n      \"1 and 4 only\"\n    ],\n    correct: 0,\n    explanation: \"<b>Sections 7(2), 18 and 20<\/b><br>If information is not supplied within the prescribed time, the PIO may face penalty\/disciplinary action under Section 20 (Statement 1) \u2705; under Section 7(2), it is deemed that the request has been refused (Statement 4) \u2705; and the applicant may lodge a complaint with the Information Commission under Section 18 (Statement 3) \u2705. However, an appeal is NOT open 'at any time' \u2014 Section 19(1) prescribes a specific 30-day limitation period from the expiry of the prescribed time, making Statement 2 incorrect. Hence, Statements 1, 3 and 4 are correct.\"\n  },\n  {\n    id: 26,\n    year: '2015',\n    chapter: 'CH 1: PRELIMINARY',\n    question: \"The 'information' which cannot be supplied under the Right to Information Act, 2005 includes\",\n    options: [\n      \"information relating to any private body which can be accessed by a public authority under any law\",\n      \"opinions\",\n      \"information relating to Border Roads Development Board\",\n      \"samples\"\n    ],\n    correct: 2,\n    explanation: \"<b>Second Schedule (via Section 24) \u2013 Border Roads Development Board<\/b><br>The Border Roads Development Board is among the organisations listed in the Second Schedule as an intelligence\/security organisation established by the Central Government, and is therefore excluded from the Act's application under Section 24 (subject to the corruption\/human-rights proviso). The other options \u2014 private-body information accessible under other law, opinions, and samples \u2014 are all expressly included within 'information' under Section 2(f).\"\n  },\n  {\n    id: 37,\n    year: '2015',\n    chapter: 'CH 3: CENTRAL INFORMATION COMMISSION',\n    question: \"Which of the following statements are correct?\\n1. An Information Commissioner can be removed from office by the President on the ground of physical or mental infirmity.\\n2. The salary and allowances payable and other terms and conditions of service of the Chief Information Commissioner and Information Commissioners shall be the same as that of the Chief Election Commissioner.\\n3. The Chief Information Commissioner and other Information Commissioners may resign from their office by sending in their resignation to the President.\\n\\nSelect the correct answer using the code given below:\",\n    options: [\n      \"1, 2 and 3\",\n      \"1 and 3 only\",\n      \"2 and 3 only\",\n      \"1 and 2 only\"\n    ],\n    correct: 1,\n    explanation: \"<b>Section 13(5) \u2013 Differentiated Salary Structure (as originally enacted)<\/b><br>As originally enacted, Section 13(5) provided that the salary, allowances and conditions of service of the Chief Information Commissioner shall be similar to that of the CHIEF Election Commissioner, while those of an Information Commissioner shall be similar to that of an (ordinary) Election Commissioner \u2014 a different, lower rank. Statement 2, which claims BOTH the CIC and Information Commissioners draw salary equal to the Chief Election Commissioner, therefore misstates the position and is incorrect. Statement 1 (removal by the President on grounds of physical or mental infirmity, per Section 14) and Statement 3 (resignation by writing to the President, per Section 13(5)) are both correct. <i>[Note: the RTI (Amendment) Act, 2019 later removed this direct linkage to Election Commission status and empowered the Central Government to prescribe these terms by rules instead.]<\/i>\"\n  },\n  {\n    id: 46,\n    year: '2016-17',\n    chapter: 'CH 1: PRELIMINARY',\n    question: \"The term \\\"public authority\\\" under the Right to Information Act, 2005 does not include which one of the following?\",\n    options: [\n      \"National Human Rights Commission\",\n      \"Lokayukta of Delhi\",\n      \"A non-Government Organization receiving substantial grant from the Government\",\n      \"Trustees of PM CARES Fund\"\n    ],\n    correct: 3,\n    explanation: \"<b>Section 2(h) \u2013 'Public Authority' and the PM CARES Fund<\/b><br>The National Human Rights Commission (created under the Protection of Human Rights Act) and the Lokayukta of Delhi (a statutory body) both squarely fall within 'public authority' under Section 2(h), and an NGO substantially financed by Government funds is also covered via the explanation to Section 2(h). The Prime Minister's Citizen Assistance and Relief in Emergency Situations (PM CARES) Fund, however, has been described by the Government (including in litigation) as a charitable public trust not established by or under the Constitution, by Parliamentary\/State legislation, or by Government notification, and therefore does not fall within the definition of 'public authority' under the Act.\"\n  },\n  {\n    id: 56,\n    year: '2016-17',\n    chapter: 'CH 3: CENTRAL INFORMATION COMMISSION',\n    question: \"Which one of following statements is not correct under the Right to Information Act, 2005?\",\n    options: [\n      \"No specific qualifications have been prescribed for appointment as Information Commissioner.\",\n      \"An Information Commissioner holds office at the pleasure of the President.\",\n      \"No person can be appointed as Information Commissioner unless he is a person of eminence in public life.\",\n      \"An Information Commissioner must have wide knowledge and experience in law, science, and technology, social service, management, journalism, mass media or administration and governance.\"\n    ],\n    correct: 1,\n    explanation: \"<b>Section 13 \u2013 Fixed Tenure, Not 'At Pleasure'<\/b><br>Unlike posts held 'during the pleasure of the President,' an Information Commissioner enjoys a fixed term of office under Section 13 and can be removed only through the specific procedure laid down in Section 14 (proven misbehaviour\/incapacity via Supreme Court reference, or other specified grounds) \u2014 not at the President's discretion. This security of tenure safeguards the Commission's independence, making the claim that an IC 'holds office at the pleasure of the President' incorrect. The remaining statements about eminence in public life and the specified fields of expertise (Section 12(5)) are correct, and no formal educational qualification is prescribed.\"\n  },\n  {\n    id: 70,\n    year: '2018',\n    chapter: 'CH 6: MISCELLANEOUS',\n    question: \"Consider the following statements regarding the functions of RTI cell:\\n1. The cell will be a single reference point to receive applications, appeals, complaints and decisions of Central Information Commission.\\n2. The cell will ensure uploading of all applications and appeals received by it on the RTI-MIS.\\n3. The cell will ensure uploading of all complaints and decisions of CIC on the DMIS (computerised diary system).\\n\\nWhich of the above statements are correct?\",\n    options: [\n      \"1 and 2 only\",\n      \"2 and 3 only\",\n      \"1 and 3 only\",\n      \"1, 2 and 3\"\n    ],\n    correct: 3,\n    explanation: \"<b>Functions of the RTI Cell (per DoPT administrative guidelines)<\/b><br>The RTI Cell in a Ministry\/Department serves as the single reference point for receiving RTI applications, appeals, complaints, and CIC decisions (Statement 1) \u2705; ensures all applications and appeals are uploaded on the RTI Management Information System, RTI-MIS (Statement 2) \u2705; and ensures complaints and CIC decisions are recorded on the computerised diary\/monitoring system, DMIS (Statement 3) \u2705. All three statements correctly describe the RTI Cell's functions.\"\n  },\n  {\n    id: 74,\n    year: '2018',\n    chapter: 'CH 1: PRELIMINARY',\n    question: \"According to which one of the following sections of RTI Act, 2005, 'information' means 'any material in any form'?\",\n    options: [\n      \"Section 2(a)\",\n      \"Section 2(c)\",\n      \"Section 2(d)\",\n      \"Section 2(f)\"\n    ],\n    correct: 3,\n    explanation: \"<b>Section 2(f) \u2013 Definition of Information<\/b><br>Section 2(f) opens with the words 'information means any material in any form,' before listing illustrative examples such as records, documents, memos, e-mails, opinions, advices, press releases, circulars, orders, logbooks, contracts, reports, papers, samples, models, and electronic data.\"\n  },\n  {\n    id: 82,\n    year: '2019-20',\n    chapter: 'CH 3: CENTRAL INFORMATION COMMISSION',\n    question: \"Who among the following is not in the committee to recommend the appointment of the Chief Information Commissioner and Information Commissioner by the President of India?\",\n    options: [\n      \"The Prime Minister, who shall be the Chairperson of the committee\",\n      \"The Leader of Opposition in the Lok Sabha\",\n      \"A Union Cabinet Minister to be nominated by the Prime Minister\",\n      \"The Chief Justice of India\"\n    ],\n    correct: 3,\n    explanation: \"<b>Section 12(3) \u2013 Selection Committee for CIC\/IC<\/b><br>Under Section 12(3), the Chief Information Commissioner and Information Commissioners are appointed by the President on the recommendation of a three-member committee consisting of the Prime Minister (Chairperson), the Leader of Opposition in the Lok Sabha, and a Union Cabinet Minister nominated by the Prime Minister. The Chief Justice of India has no role in this committee, unlike in the appointment process for certain other constitutional\/statutory authorities.\"\n  },\n  {\n    id: 85,\n    year: '2019-20',\n    chapter: 'CH 1: PRELIMINARY',\n    question: \"Which among the following institutions is not considered a 'Public Authority' under the RTI Act, 2005?\",\n    options: [\n      \"Established or constituted by or under the Constitution of India\",\n      \"Established by a private entity not financed and controlled by the Government\",\n      \"Established or constituted by any law made by the Parliament\",\n      \"Established or constituted by any law made by a State Government\"\n    ],\n    correct: 1,\n    explanation: \"<b>Section 2(h) \u2013 Definition of Public Authority<\/b><br>Section 2(h) confines 'public authority' to bodies established by\/under the Constitution, by Parliamentary or State legislation, by government notification, or bodies owned, controlled, or substantially financed by the appropriate Government (including certain NGOs). A body established by a private entity that is NOT financed or controlled by the Government falls entirely outside this definition and is therefore not a 'public authority' under the Act.\"\n  },\n  {\n    id: 94,\n    year: '2021-22',\n    chapter: 'Misc.',\n    question: \"RTI Act, 2005 is based on which fundamental right of the Constitution of India?\",\n    options: [\n      \"Right to Equality (Article 14)\",\n      \"Right to Freedom of Speech and Expression (Article 19)\",\n      \"Right to Life and Personal Liberty (Article 21)\",\n      \"Right against Exploitation (Article 23)\"\n    ],\n    correct: 1,\n    explanation: \"<b>Constitutional Basis \u2013 Article 19(1)(a)<\/b><br>The Supreme Court has held in several judgments (e.g., State of U.P. v. Raj Narain, and later cases) that the right to information is implicit in the fundamental right to freedom of speech and expression under Article 19(1)(a), since meaningful exercise of free speech requires citizens to be well-informed. The RTI Act, 2005 operationalises this constitutionally-rooted right through a statutory framework.\"\n  },\n  {\n    id: 108,\n    year: '2021-22',\n    chapter: 'CH 6: MISCELLANEOUS',\n    question: \"Which Section of the RTI Act, 2005 deals with the protection for work done in good faith?\",\n    options: [\n      \"Section 21\",\n      \"Section 22\",\n      \"Section 23\",\n      \"Section 24\"\n    ],\n    correct: 0,\n    explanation: \"<b>Section 21 \u2013 Protection of Action Taken in Good Faith<\/b><br>Section 21 bars any suit, prosecution, or other legal proceeding against any person for anything done, or intended to be done, in good faith under the Act or any rule made thereunder. This protects officials (like PIOs) as well as citizens\/informants who furnish information in good faith while implementing or availing the Act.\"\n  },\n  {\n    id: 122,\n    year: '2023',\n    chapter: 'CH 1: PRELIMINARY',\n    question: \"Consider the following statements: As per Section 2(h) of RTI Act, 2005 \\\"public authority\\\" means any authority or body or institution of self-Government established or constituted\\n1. by or under the Constitution.\\n2. by any other law made by Parliament.\\n3. by any other law made by State Legislature.\\n4. by notification issued or order made by the appropriate Government.\\n\\nWhich of the above statements are correct?\",\n    options: [\n      \"1, 2 and 3 only\",\n      \"1, 2 and 4 only\",\n      \"2, 3 and 4 only\",\n      \"1, 2, 3 and 4\"\n    ],\n    correct: 3,\n    explanation: \"<b>Section 2(h) \u2013 Definition of Public Authority<\/b><br>Section 2(h) defines 'public authority' as any authority, body, or institution of self-government established or constituted (i) by or under the Constitution; (ii) by any other law made by Parliament; (iii) by any other law made by a State Legislature; or (iv) by notification issued or order made by the appropriate Government, and further extends to bodies owned, controlled or substantially financed by the Government. All four statements correctly reflect this definition.\"\n  },\n  {\n    id: 124,\n    year: '2023',\n    chapter: 'CH 5: POWERS AND FUNCTIONS OF THE INFORMATION COMMISSIONS, APPEAL AND PENALTIES',\n    question: \"Which of the following are correct about an inquiry carried out by an Information Commission?\\n1. It may examine any record to which the RTI Act, 2005 applies.\\n2. No such record can be withheld from it (irrespective of any provision of any Act passed by the Parliament or the State Legislature).\\n3. IC has the powers of a Civil Court trying a suit under the Code of Civil Procedure.\\n\\nSelect the correct answer using the code given below:\",\n    options: [\n      \"1 and 2 only\",\n      \"1 and 3 only\",\n      \"2 and 3 only\",\n      \"1, 2 and 3\"\n    ],\n    correct: 3,\n    explanation: \"<b>Section 18(3) \u2013 Powers of Inquiry<\/b><br>While inquiring into any matter, the Information Commission may examine any record to which the Act applies and which is under the control of the public authority \u2705; no such record may be withheld from it on any ground, notwithstanding any other law in force \u2705; and it has the same powers as vested in a civil court trying a suit under the Code of Civil Procedure, 1908 \u2014 such as summoning and enforcing attendance of persons, requiring discovery\/inspection of documents, and receiving evidence on affidavit \u2705. All three statements are correct.\"\n  },\n  {\n    id: 144,\n    year: '2024',\n    chapter: 'Misc.',\n    question: \"How many schedules does the RTI Act, 2005 have?\",\n    options: [\n      \"1\",\n      \"2\",\n      \"8\",\n      \"10\"\n    ],\n    correct: 1,\n    explanation: \"<b>THE FIRST SCHEDULE:<\/b> Form of oath or affirmation to be made by the Chief Information Commissioner\/the Information Commissioner\/the State Chief Information Commissioner\/the State Information Commissioner<br><b>THE SECOND SCHEDULE:<\/b> Intelligence and security organisation established by the Central Government.\"\n  },\n  {\n    id: 146,\n    year: '2024',\n    chapter: 'CH 6: MISCELLANEOUS',\n    question: \"Consider the following statements:\\nThe Second Schedule of the RTI Act, 2005 lists\\n1. the intelligence and security organizations established by the Central Government that are exempted from the purview of the RTI Act, 2005.\\n2. all Government organizations come under the purview of the RTI Act, 2005.\\n3. all departmental information of the Central and State Governments.\\n\\nWhich of the above statements is\/are correct?\",\n    options: [\n      \"1 only\",\n      \"2 only\",\n      \"3 only\",\n      \"1, 2, and 3\"\n    ],\n    correct: 0,\n    explanation: \"<b>Second Schedule \u2013 Exempted Organizations<\/b><br>The Second Schedule lists intelligence and security organizations exempt from RTI (Section 24) \u2013 \u2705<br>It does NOT list all Government organizations or general departmental information \u2013 \u274c<br>Thus, only statement 1 is correct.\"\n  },\n  {\n    id: 150,\n    year: '2025',\n    chapter: 'Ch 2: Right to Information and Obligations of Public Authorities',\n    question: \"Which one the following sections of the RTI Act, 2005 deals with third party information ?\",\n    options: [\n      \"Section 8\",\n      \"Section 10\",\n      \"Section 11\",\n      \"Section 12\"\n    ],\n    correct: 2,\n    explanation: \"<b>Correct Answer: C - Section 11<\/b><br><br><b>Analysis of Statement:<\/b><br>Section 11 of the RTI Act, 2005 titled 'Third party information' lays down the procedure to be followed where a CPIO\/SPIO intends to disclose information relating to or supplied by a third party which has been treated as confidential, including the requirement to give written notice to the third party and invite representation before deciding on disclosure.\"\n  },\n  {\n    id: 155,\n    year: '2025',\n    chapter: 'Ch 4: The State Information Commission',\n    question: \"Which one of the following Sections of the RTI Act, 2005 contains provisions regarding the constitution of State Information Commission ?\",\n    options: [\n      \"Section 14\",\n      \"Section 15\",\n      \"Section 16\",\n      \"Section 17\"\n    ],\n    correct: 1,\n    explanation: \"<b>Correct Answer: B - Section 15<\/b><br><br><b>Analysis of Statement:<\/b><br>Section 15 ('Constitution of State Information Commission') empowers the State Government, by notification in the Official Gazette, to constitute a body known as the State Information Commission consisting of a State Chief Information Commissioner and not more than ten State Information Commissioners.\"\n  }\n];\n\n\n\n\/\/ ==========================================\n\/\/ STATE\n\/\/ ==========================================\nlet initDone = false;\nlet currentMode = 'all';\nlet currentFilter = null;\nlet filteredQuestions = [...allQuestions];\nlet currentQuestionIndex = 0;\nlet selectedOption = null;\nlet answerChecked = false;\nlet sessionStats = { attempted: 0, correct: 0, incorrect: 0 };\nlet sessionStartTs = Date.now();\nlet sessionAnswers = {};\nlet progress = { questionStats: {}, weakAreas: [], lastQuestionId: null, lastMode: 'all', lastFilter: null, attemptLog: [] };\n\nconst $id = (x) => document.getElementById(x);\nconst CHAPTERS = [...new Set(allQuestions.map(q => q.chapter))];\nconst YEARS = [...new Set(allQuestions.map(q => q.year))];\n\/\/ Case-insensitive helpers: work for \"Ch 1:\", \"CH 1:\", \"ch 1:\" alike.\nconst chShort = (c) => c.replace(\/^CH\\s*(\\d+):.*$\/i, 'CH $1').replace('ANNEXURE\/Appendices', 'Annexures').replace('Manual of Procurement', 'Manual of Proc.');\nconst chFull = (c) => { const m = c.match(\/^CH\\s*\\d+:\\s*(.+)$\/i); return m ? m[1] : c; };\n\/\/ One label, printed once (fixes the earlier \"name: name\" doubling).\nconst chLabel = (c) => \/^CH\\s*\\d+:\/i.test(c) ? (chShort(c) + ': ' + chFull(c)) : c;\n\n\/\/ ==========================================\n\/\/ PERSISTENCE (localStorage)\n\/\/ ==========================================\nfunction loadProgress() {\n    try {\n        const saved = localStorage.getItem('quiz_progress_' + quizConfig.quizId);\n        if (saved) {\n            const p = JSON.parse(saved);\n            progress = Object.assign(progress, p);\n            if (!progress.questionStats) progress.questionStats = {};\n            if (!Array.isArray(progress.weakAreas)) progress.weakAreas = [];\n            if (!Array.isArray(progress.attemptLog)) progress.attemptLog = [];\n        }\n    } catch (e) { console.warn('Progress load failed', e); }\n}\nfunction saveProgress() {\n    try {\n        if (progress.attemptLog.length > 500) progress.attemptLog = progress.attemptLog.slice(-500);\n        localStorage.setItem('quiz_progress_' + quizConfig.quizId, JSON.stringify(progress));\n    } catch (e) { console.warn('Progress save failed', e); }\n}\nfunction getQStat(qid) {\n    if (!progress.questionStats[qid]) progress.questionStats[qid] = { correct: 0, incorrect: 0, lastAttempt: null, lastCorrect: null };\n    return progress.questionStats[qid];\n}\n\n\/\/ ==========================================\n\/\/ TOAST\n\/\/ ==========================================\nlet toastTimer = null;\nfunction showToast(msg, type) {\n    const t = $id('warningToast');\n    $id('toastMessage').textContent = msg;\n    t.classList.toggle('success', type === 'success');\n    t.classList.add('show');\n    clearTimeout(toastTimer);\n    toastTimer = setTimeout(() => t.classList.remove('show'), 2600);\n}\n\n\/\/ ==========================================\n\/\/ TAB NAVIGATION\n\/\/ ==========================================\nfunction switchView(view) {\n    document.querySelectorAll('.gfr-portal .gp-tab').forEach(b => b.classList.toggle('active', b.dataset.view === view));\n    document.querySelectorAll('.gfr-portal .gp-view').forEach(v => v.classList.toggle('active', v.id === 'view-' + view));\n    if (view === 'analytics') renderAnalytics();\n    if (view === 'performance') renderAI();\n}\n\n\/\/ ==========================================\n\/\/ MODE \/ FILTERS\n\/\/ ==========================================\nfunction setMode(mode, filter) {\n    currentMode = mode;\n    currentFilter = filter || null;\n    document.querySelectorAll('.gfr-portal .mode-tab').forEach(t => t.classList.toggle('active', t.dataset.mode === mode));\n    $id('yearFilterCard').style.display = (mode === 'year') ? '' : 'none';\n    $id('chapterFilterCard').style.display = (mode === 'chapter') ? '' : 'none';\n    $id('weakAreasCard').style.display = (mode === 'weak') ? '' : 'none';\n    applyFilters();\n    progress.lastMode = mode; progress.lastFilter = currentFilter; saveProgress();\n}\nfunction applyFilters() {\n    if (currentMode === 'all') filteredQuestions = [...allQuestions];\n    else if (currentMode === 'year') filteredQuestions = currentFilter ? allQuestions.filter(q => q.year === currentFilter) : [...allQuestions];\n    else if (currentMode === 'chapter') filteredQuestions = currentFilter ? allQuestions.filter(q => q.chapter === currentFilter) : [...allQuestions];\n    else if (currentMode === 'weak') {\n        filteredQuestions = allQuestions.filter(q => progress.weakAreas.includes(q.id));\n        if (!filteredQuestions.length) { showToast('No weak areas yet \u2014 great going!', 'success'); filteredQuestions = [...allQuestions]; setMode('all'); return; }\n    }\n    currentQuestionIndex = 0;\n    sessionStats = { attempted: 0, correct: 0, incorrect: 0 };\n    sessionStartTs = Date.now();\n    sessionAnswers = {};\n    renderFilters(); renderGrid(); loadQuestion(); updateStats();\n}\nfunction renderFilters() {\n    $id('yearList').innerHTML = YEARS.map(y => {\n        const n = allQuestions.filter(q => q.year === y).length;\n        return '<div class=\"filter-item' + (currentMode === 'year' && currentFilter === y ? ' active' : '') + '\" data-year=\"' + y + '\"><span class=\"filter-text\">' + y + '<\/span><span class=\"filter-count\">' + n + '<\/span><\/div>';\n    }).join('');\n    $id('chapterList').innerHTML = CHAPTERS.map(c => {\n        const n = allQuestions.filter(q => q.chapter === c).length;\n        return '<div class=\"filter-item' + (currentMode === 'chapter' && currentFilter === c ? ' active' : '') + '\" data-chapter=\"' + encodeURIComponent(c) + '\" title=\"' + c + '\"><span class=\"filter-text\">' + chLabel(c) + '<\/span><span class=\"filter-count\">' + n + '<\/span><\/div>';\n    }).join('');\n    renderWeakList();\n}\nfunction renderWeakList() {\n    const list = $id('weakQuestionList');\n    const weak = allQuestions.filter(q => progress.weakAreas.includes(q.id));\n    list.innerHTML = weak.length ? weak.map(q => {\n        const s = getQStat(q.id);\n        return '<div class=\"weak-question-item\" data-goto=\"' + q.id + '\"><span class=\"q-num\">Q' + q.id + '<\/span><span class=\"q-text\">' + q.question.replace(\/<br\\s*\\\/?>|\\n\/gi, ' ').substring(0, 60) + '\u2026<\/span><span class=\"wrong-count\">' + s.incorrect + '\u2717<\/span><\/div>';\n    }).join('') : '<p style=\"font-size:12.5px;color:var(--mut);text-align:center;padding:14px 4px;\">No weak areas. Keep practising!<\/p>';\n}\n\n\/\/ ==========================================\n\/\/ QUESTION RENDERING\n\/\/ ==========================================\nfunction loadQuestion() {\n    const q = filteredQuestions[currentQuestionIndex];\n    if (!q) {\n        $id('questionText').innerHTML = '<b>No questions loaded yet.<\/b> Paste your MCQ objects into the <code>allQuestions<\/code> array in this file (format documented at the array) and reload.';\n        $id('optionsList').innerHTML = '';\n        $id('questionNumber').textContent = 'Question 0 of 0';\n        return;\n    }\n    selectedOption = null; answerChecked = false;\n    $id('questionNumber').textContent = 'Question ' + (currentQuestionIndex + 1) + ' of ' + filteredQuestions.length;\n    $id('currentQuestionYear').textContent = q.year;\n    $id('currentQuestionChapter').textContent = chLabel(q.chapter);\n    $id('weakBadge').style.display = progress.weakAreas.includes(q.id) ? '' : 'none';\n    $id('questionText').innerHTML = formatQuestion(q);\n    $id('explanationBox').classList.remove('show');\n    renderOptions(q);\n    renderMastery(q);\n    const prior = sessionAnswers[q.id];\n    if (prior !== undefined) revealAnswer(q, prior, true);\n    $id('prevBtn').disabled = currentQuestionIndex === 0;\n    $id('nextBtn').disabled = currentQuestionIndex === filteredQuestions.length - 1;\n    $id('checkBtn').disabled = prior !== undefined;\n    renderGrid();\n    progress.lastQuestionId = q.id; saveProgress();\n    if (initDone && window.innerWidth <= 900) {\n        const p = document.querySelector('.gfr-portal .question-panel');\n        if (p) p.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    }\n}\n\/\/ UPSC exam-paper formatting: numbered statements get their own spaced rows,\n\/\/ the \"Select the correct answer \/ Which of the above\" lead sits on its own line.\n\/\/ Splits on BOTH \"\\n\" and \"<br>\" so either style works in pasted data.\nfunction formatQuestion(q) {\n    const parts = q.question.split(\/<br\\s*\\\/?>|\\n\/i);\n    let html = '<span class=\"q-stem\"><b>Q' + q.id + '.<\/b> ' + (parts[0] || '') + '<\/span>';\n    for (let i = 1; i < parts.length; i++) {\n        const seg = parts[i].trim();\n        if (!seg) continue;\n        const m = seg.match(\/^(\\d+)\\.\\s*(.*)$\/s);\n        if (m) html += '<span class=\"q-stmt\"><span class=\"sn\">' + m[1] + '.<\/span><span>' + m[2] + '<\/span><\/span>';\n        else if (\/^(select the correct|which of the (above|following|statements)|choose the correct|consider the following)\/i.test(seg))\n            html += '<span class=\"q-lead\">' + seg + '<\/span>';\n        else html += '<span class=\"q-lead\" style=\"font-style:normal\">' + seg + '<\/span>';\n    }\n    return html;\n}\nfunction renderOptions(q) {\n    $id('optionsList').innerHTML = q.options.map((opt, i) =>\n        '<div class=\"option-item\" data-opt=\"' + i + '\"><span class=\"option-letter\">(' + String.fromCharCode(97 + i) + ')<\/span><span class=\"option-text\">' + opt + '<\/span><i class=\"option-icon\" style=\"margin-top:4px\"><\/i><\/div>'\n    ).join('');\n}\nfunction renderMastery(q) {\n    const s = getQStat(q.id);\n    const mi = $id('masteryIndicator');\n    if (s.correct + s.incorrect === 0) { mi.classList.remove('show'); return; }\n    mi.classList.add('show');\n    const stars = $id('masteryStars').querySelectorAll('i');\n    stars.forEach((st, i) => st.classList.toggle('filled', i < Math.min(s.correct, 5)));\n}\nfunction checkAnswer() {\n    if (answerChecked || selectedOption === null) { if (selectedOption === null) showToast('Select an option first'); return; }\n    const q = filteredQuestions[currentQuestionIndex];\n    const isCorrect = selectedOption === q.correct;\n    sessionAnswers[q.id] = selectedOption;\n    sessionStats.attempted++; isCorrect ? sessionStats.correct++ : sessionStats.incorrect++;\n    updateQuestionStats(q, isCorrect);\n    revealAnswer(q, selectedOption, false);\n    updateStats(); renderGrid(); renderWeakList(); updateHeader();\n}\nfunction revealAnswer(q, chosen, restoring) {\n    answerChecked = true;\n    const items = $id('optionsList').querySelectorAll('.option-item');\n    items.forEach((it, i) => {\n        it.classList.add('disabled');\n        if (i === q.correct) { it.classList.add('correct'); const oi=it.querySelector('.option-icon'); oi.textContent='\\u2713'; oi.style.fontStyle='normal'; }\n        else if (i === chosen) { it.classList.add('incorrect'); const oj=it.querySelector('.option-icon'); oj.textContent='\\u2717'; oj.style.fontStyle='normal'; }\n    });\n    $id('explanationText').innerHTML = q.explanation;\n    $id('explanationBox').classList.add('show');\n    $id('checkBtn').disabled = true;\n    renderMastery(q);\n    if (!restoring) showToast(chosen === q.correct ? 'Correct! Well done.' : 'Incorrect \u2014 read the explanation.', chosen === q.correct ? 'success' : '');\n}\nfunction updateQuestionStats(q, isCorrect) {\n    const s = getQStat(q.id);\n    isCorrect ? s.correct++ : s.incorrect++;\n    s.lastAttempt = Date.now(); s.lastCorrect = isCorrect;\n    progress.attemptLog.push({ qid: q.id, correct: isCorrect, ts: Date.now() });\n    const isWeak = progress.weakAreas.includes(q.id);\n    if (!isCorrect && s.incorrect >= quizConfig.weakThreshold && !isWeak) progress.weakAreas.push(q.id);\n    if (isCorrect && isWeak && s.correct >= quizConfig.masteryThreshold) progress.weakAreas = progress.weakAreas.filter(id => id !== q.id);\n    saveProgress();\n}\n\n\/\/ ==========================================\n\/\/ GRID + STATS\n\/\/ ==========================================\nfunction renderGrid() {\n    $id('questionGrid').innerHTML = filteredQuestions.map((q, i) => {\n        let cls = 'unattempted';\n        const ans = sessionAnswers[q.id];\n        if (ans !== undefined) cls = (ans === q.correct) ? 'correct-answered' : 'incorrect-answered';\n        else { const s = progress.questionStats[q.id]; if (s && (s.correct + s.incorrect) > 0) cls = 'attempted'; }\n        if (i === currentQuestionIndex) cls = 'current';\n        const weak = progress.weakAreas.includes(q.id) ? ' weak-marked' : '';\n        return '<div class=\"grid-item ' + cls + weak + '\" data-idx=\"' + i + '\" title=\"Q' + q.id + '\">' + (i + 1) + '<\/div>';\n    }).join('');\n}\nfunction masteredCount() { return allQuestions.filter(q => { const s = progress.questionStats[q.id]; return s && s.correct >= quizConfig.masteryThreshold; }).length; }\nfunction updateStats() {\n    $id('totalQuestions').textContent = filteredQuestions.length;\n    $id('attemptedCount').textContent = sessionStats.attempted;\n    $id('correctCount').textContent = sessionStats.correct;\n    $id('incorrectCount').textContent = sessionStats.incorrect;\n    const mastered = masteredCount();\n    const pct = allQuestions.length ? Math.round(mastered \/ allQuestions.length * 100) : 0;\n    $id('progressPercentage').textContent = pct + '%';\n    $id('progressRingFill').style.strokeDashoffset = 264 - (264 * pct \/ 100);\n    $id('totalCorrectProgress').textContent = Object.values(progress.questionStats).reduce((a, s) => a + s.correct, 0);\n    $id('totalWeakProgress').textContent = progress.weakAreas.length;\n    $id('allCount').textContent = allQuestions.length;\n    $id('weakModeCount').textContent = progress.weakAreas.length;\n}\nfunction updateHeader() {\n    $id('hdrTotalQ').textContent = allQuestions.length;\n    $id('hdrCycles').textContent = YEARS.length;\n    const pct = allQuestions.length ? Math.round(masteredCount() \/ allQuestions.length * 100) : 0;\n    $id('hdrMastered').textContent = pct + '%';\n    const w = progress.weakAreas.length;\n    $id('weakBadgeHeader').style.display = w ? '' : 'none';\n    $id('weakCountHeader').textContent = w;\n    const r = computeReadiness();\n    $id('hdrReadiness').textContent = r.attempted ? r.score + '%' : '\u2014';\n    $id('perfPill').style.display = w >= 5 ? '' : 'none';\n}\n\n\/\/ ==========================================\n\/\/ SUBMIT \/ RESULT \/ RESETS\n\/\/ ==========================================\nfunction submitExam() {\n    if (!sessionStats.attempted) { showToast('Attempt at least one question first'); return; }\n    const pct = Math.round(sessionStats.correct \/ sessionStats.attempted * 100);\n    $id('resultCorrect').textContent = sessionStats.correct;\n    $id('resultIncorrect').textContent = sessionStats.incorrect;\n    $id('resultScore').textContent = pct + '%';\n    $id('resultIcon').textContent = pct >= 80 ? '\ud83c\udfc6' : pct >= 60 ? '\ud83c\udf89' : pct >= 40 ? '\ud83d\udcd6' : '\ud83d\udcaa';\n    $id('resultTitle').textContent = pct >= 80 ? 'Outstanding!' : pct >= 60 ? 'Great Job!' : pct >= 40 ? 'Keep Practising!' : 'Needs Revision';\n    $id('resultMessage').textContent = 'You attempted ' + sessionStats.attempted + ' of ' + filteredQuestions.length + ' questions in this session.';\n    $id('practiceWeakBtn').style.display = progress.weakAreas.length ? '' : 'none';\n    $id('resultModal').classList.add('show');\n    if (quizConfig.useWordPressSync && typeof window.cssaddaSaveQuizResult === 'function') {\n        window.cssaddaSaveQuizResult({\n            quiz_id: quizConfig.quizId,\n            score: sessionStats.correct,\n            total_questions: sessionStats.attempted,\n            percentage: pct,\n            time_taken: Math.round((Date.now() - sessionStartTs) \/ 1000),\n            answers: sessionAnswers\n        });\n    }\n}\nfunction reviewAnswers() { $id('resultModal').classList.remove('show'); currentQuestionIndex = 0; loadQuestion(); }\nfunction retryQuiz() { $id('resultModal').classList.remove('show'); sessionStats = { attempted: 0, correct: 0, incorrect: 0 }; sessionAnswers = {}; currentQuestionIndex = 0; loadQuestion(); updateStats(); }\n\/\/ SESSION RESET (Practice tab): clears ONLY this session's answers\/score.\n\/\/ Lifetime performance (mastery, weak areas, attempt history) is preserved.\nfunction resetSession() {\n    if (!confirm('Reset this session? Only the current answers and session score are cleared \u2014 your lifetime performance and mastery are kept.')) return;\n    sessionStats = { attempted: 0, correct: 0, incorrect: 0 };\n    sessionAnswers = {};\n    sessionStartTs = Date.now();\n    currentQuestionIndex = 0;\n    loadQuestion(); updateStats(); renderGrid();\n    showToast('Session reset \u2014 performance data kept', 'success');\n}\n\/\/ PERFORMANCE RESET (My Performance tab): wipes lifetime data after confirm.\nfunction resetPerformance() {\n    if (!confirm('Permanently erase ALL lifetime performance for this quiz?\\n\\nThis clears mastery stars, weak areas, accuracy history and the readiness score. This cannot be undone.')) return;\n    progress = { questionStats: {}, weakAreas: [], lastQuestionId: null, lastMode: 'all', lastFilter: null, attemptLog: [] };\n    saveProgress();\n    sessionStats = { attempted: 0, correct: 0, incorrect: 0 };\n    sessionAnswers = {};\n    sessionStartTs = Date.now();\n    setMode('all');\n    updateHeader();\n    renderAI();\n    showToast('Lifetime performance erased', 'success');\n}\n\n\/\/ ==========================================\n\/\/ TAB 2 \u2014 DYNAMIC EXAM ANALYTICS\n\/\/ ==========================================\nfunction chapterCounts() {\n    const map = {};\n    allQuestions.forEach(q => { map[q.chapter] = (map[q.chapter] || 0) + 1; });\n    return Object.entries(map).sort((a, b) => b[1] - a[1]);\n}\nlet analyticsRendered = false;\nfunction renderAnalytics() {\n    if (analyticsRendered) return; analyticsRendered = true;\n    const total = allQuestions.length;\n    if (!total) {\n        $id('rankedBars').innerHTML = '<div class=\"ai-empty\"><div class=\"big\">No questions loaded yet<\/div><p>Paste your MCQs into the <b>allQuestions<\/b> array and reload \u2014 the analytics build themselves from the data.<\/p><\/div>';\n        return;\n    }\n    const ranked = chapterCounts();\n    const max = ranked[0][1];\n    \/\/ FIXED: chapter name printed ONCE (was chShort + ': ' + chFull which doubled\n    \/\/ the name whenever the helpers couldn't parse the prefix). Wraps via CSS.\n    $id('rankedBars').innerHTML = ranked.map(([c, n], i) => {\n        const pct = (n \/ total * 100).toFixed(1);\n        const grad = n >= 15 ? 'linear-gradient(90deg,var(--gold-l),var(--gold))' : 'linear-gradient(90deg,#93c5fd,var(--navy))';\n        return '<div class=\"bar-row\"><span class=\"bar-rank\">' + (i + 1) + '<\/span><span class=\"bar-name\" title=\"' + c + '\">' + chLabel(c) + '<\/span><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:' + (n \/ max * 100) + '%;background:' + grad + '\"><\/div><\/div><span class=\"bar-val\">' + n + '<span class=\"pct\">' + pct + '%<\/span><\/span><\/div>';\n    }).join('');\n\n    \/\/ Heatmap\n    const shade = (n) => n === 0 ? '#fff' : n === 1 ? '#fdf6e3' : n === 2 ? '#f6e7b8' : n <= 4 ? '#e9cf7f' : n <= 6 ? '#d8b23f' : '#c9992a';\n    const fg = (n) => n >= 5 ? '#fff' : 'inherit';\n    let thead = '<tr><th>Chapter<\/th>' + YEARS.map(y => '<th>' + y + '<\/th>').join('') + '<th>Total<\/th><\/tr>';\n    let tbody = chapterCounts().map(([c]) => {\n        const cells = YEARS.map(y => {\n            const n = allQuestions.filter(q => q.chapter === c && q.year === y).length;\n            return '<td style=\"background:' + shade(n) + ';color:' + fg(n) + ';font-weight:' + (n ? '600' : '400') + '\">' + (n || '\u00b7') + '<\/td>';\n        }).join('');\n        const tot = allQuestions.filter(q => q.chapter === c).length;\n        return '<tr><td class=\"rn\" title=\"' + c + '\">' + chLabel(c) + '<\/td>' + cells + '<td class=\"rt\">' + tot + '<\/td><\/tr>';\n    }).join('');\n    let tfoot = '<tr><td>Total<\/td>' + YEARS.map(y => '<td>' + allQuestions.filter(q => q.year === y).length + '<\/td>').join('') + '<td>' + total + '<\/td><\/tr>';\n    $id('heatmapContainer').innerHTML = '<table class=\"matrix\"><thead>' + thead + '<\/thead><tbody>' + tbody + '<\/tbody><tfoot>' + tfoot + '<\/tfoot><\/table>';\n\n    \/\/ Cycle chart\n    const yMax = Math.max(...YEARS.map(y => allQuestions.filter(q => q.year === y).length));\n    $id('cycleChart').innerHTML = YEARS.map(y => {\n        const n = allQuestions.filter(q => q.year === y).length;\n        return '<div class=\"yb\"><div class=\"yb-bar\" style=\"height:' + Math.max(8, n \/ yMax * 100) + '%\"><span>' + n + '<\/span><\/div><div class=\"yb-lab\">' + y + '<\/div><\/div>';\n    }).join('');\n\n    \/\/ Takeaways (guarded for quizzes with fewer than 3 chapters)\n    const [c1, n1] = ranked[0];\n    const second = ranked[1], third = ranked[2];\n    const latest = YEARS[YEARS.length - 1];\n    const latestN = allQuestions.filter(q => q.year === latest).length;\n    let takeaways = '<div class=\"ins\"><h4><span class=\"ic\">\ud83d\udd25<\/span> Highest-Yield Chapter<\/h4><p><b>' + chLabel(c1) + '<\/b> alone contributes <b>' + n1 + ' questions (' + (n1 \/ total * 100).toFixed(1) + '%)<\/b> \u2014 master it first.<\/p><\/div>';\n    if (second && third) {\n        const top3pct = Math.round((n1 + second[1] + third[1]) \/ total * 100);\n        takeaways += '<div class=\"ins\"><h4><span class=\"ic\">\ud83d\uddc2\ufe0f<\/span> Top-3 Concentration<\/h4><p><b>' + chShort(c1) + ', ' + chShort(second[0]) + ' &amp; ' + chShort(third[0]) + '<\/b> together cover <b>' + top3pct + '%<\/b> of all PYQs \u2014 prioritise these before anything else.<\/p><\/div>';\n    }\n    takeaways += \n        '<div class=\"ins\"><h4><span class=\"ic\">\ud83c\udfaf<\/span> Strategy<\/h4><p>Use <b>By Chapter<\/b> mode for high-weight chapters, then switch to <b>Weak Areas<\/b> mode until every question shows <b>' + quizConfig.masteryThreshold + '\u2605 mastery<\/b>.<\/p><\/div>';\n    $id('takeaways').innerHTML = takeaways;\n}\n\n\/\/ ==========================================\n\/\/ TAB 3 \u2014 AI COACH ENGINE (rule-based, client-side)\n\/\/ ==========================================\nfunction chapterStats() {\n    const total = allQuestions.length;\n    return chapterCounts().map(([c, n]) => {\n        const qs = allQuestions.filter(q => q.chapter === c);\n        let attempted = 0, correct = 0, incorrect = 0, scoreSum = 0;\n        qs.forEach(q => {\n            const s = progress.questionStats[q.id];\n            if (s && (s.correct + s.incorrect) > 0) { attempted++; correct += s.correct; incorrect += s.incorrect; }\n            scoreSum += s ? Math.min(s.correct \/ quizConfig.masteryThreshold, 1) : 0;\n        });\n        const acc = (correct + incorrect) ? correct \/ (correct + incorrect) : null;\n        const weight = n \/ total;\n        const coverage = attempted \/ n;\n        const mastery = scoreSum \/ n;\n        const priority = weight * (acc === null ? 0.85 : (1 - acc)) * (0.5 + 0.5 * (1 - coverage));\n        return { chapter: c, count: n, weight, attempted, coverage, acc, mastery, priority };\n    });\n}\nfunction computeReadiness() {\n    const stats = chapterStats();\n    const score = Math.round(stats.reduce((a, s) => a + s.weight * s.mastery, 0) * 100);\n    const attempted = Object.values(progress.questionStats).some(s => (s.correct + s.incorrect) > 0);\n    return { score, attempted, stats };\n}\nfunction renderAI() {\n    if (!allQuestions.length) {\n        $id('aiEmptyState').style.display = '';\n        $id('aiContent').style.display = 'none';\n        return;\n    }\n    const { score, attempted, stats } = computeReadiness();\n    $id('aiEmptyState').style.display = attempted ? 'none' : '';\n    $id('aiContent').style.display = attempted ? '' : 'none';\n    if (!attempted) return;\n\n    \/\/ Readiness ring\n    $id('aiScore').textContent = score;\n    $id('aiRingFill').style.strokeDashoffset = 402 - (402 * score \/ 100);\n    const verdict = score >= 80 ? '<b>Exam-ready.<\/b> Maintain with the revision queue and weak-area drills.'\n        : score >= 60 ? '<b>Strong base.<\/b> Close the gaps in your top-weight chapters to cross 80.'\n        : score >= 35 ? '<b>Building up.<\/b> Focus on the priority chapters below \u2014 they move your score fastest.'\n        : '<b>Early stage.<\/b> Start with the highest-weight chapters; every mastered question compounds.';\n    $id('aiVerdict').innerHTML = verdict + '<br><span style=\"font-size:11.8px;opacity:.8\">Score = \u03a3 (chapter exam-weight \u00d7 your mastery), computed from ' + YEARS.length + ' cycles of PYQ data.<\/span>';\n\n    \/\/ KPIs\n    const totalAttempted = allQuestions.filter(q => { const s = progress.questionStats[q.id]; return s && (s.correct + s.incorrect) > 0; }).length;\n    const allC = Object.values(progress.questionStats).reduce((a, s) => a + s.correct, 0);\n    const allI = Object.values(progress.questionStats).reduce((a, s) => a + s.incorrect, 0);\n    const accAll = (allC + allI) ? Math.round(allC \/ (allC + allI) * 100) : 0;\n    const recent = progress.attemptLog.slice(-20);\n    const accRecent = recent.length ? Math.round(recent.filter(a => a.correct).length \/ recent.length * 100) : 0;\n    const trendArrow = recent.length >= 5 ? (accRecent > accAll ? ' <span style=\"color:var(--green)\">\\u2197<\/span>' : accRecent < accAll ? ' <span style=\"color:var(--red)\">\\u2198<\/span>' : '') : '';\n    $id('aiKpis').innerHTML =\n        '<div class=\"ai-kpi\"><div class=\"n\">' + totalAttempted + '\/' + allQuestions.length + '<\/div><div class=\"l\">Coverage<\/div><\/div>' +\n        '<div class=\"ai-kpi\"><div class=\"n ' + (accAll >= 70 ? 'g' : accAll >= 45 ? 'a' : 'r') + '\">' + accAll + '%<\/div><div class=\"l\">Lifetime Accuracy<\/div><\/div>' +\n        '<div class=\"ai-kpi\"><div class=\"n ' + (accRecent >= 70 ? 'g' : accRecent >= 45 ? 'a' : 'r') + '\">' + accRecent + '%' + trendArrow + '<\/div><div class=\"l\">Last 20 Attempts<\/div><\/div>' +\n        '<div class=\"ai-kpi\"><div class=\"n g\">' + masteredCount() + '<\/div><div class=\"l\">Mastered (' + quizConfig.masteryThreshold + '\u2605)<\/div><\/div>' +\n        '<div class=\"ai-kpi\"><div class=\"n r\">' + progress.weakAreas.length + '<\/div><div class=\"l\">Weak Questions<\/div><\/div>';\n\n    \/\/ Smart study plan\n    const byPriority = [...stats].sort((a, b) => b.priority - a.priority);\n    const recos = [];\n    byPriority.slice(0, 3).forEach(s => {\n        if (s.acc === null) recos.push({ ic: 'warm', icon: '\ud83e\udded', txt: '<b>' + chShort(s.chapter) + '<\/b> carries <b>' + Math.round(s.weight * 100) + '%<\/b> of the paper but you haven\\u2019t attempted it yet \u2014 begin here.', ch: s.chapter });\n        else if (s.acc < 0.6) recos.push({ ic: 'hot', icon: '\ud83d\udd25', txt: '<b>' + chShort(s.chapter) + '<\/b>: exam weight <b>' + Math.round(s.weight * 100) + '%<\/b>, your accuracy only <b>' + Math.round(s.acc * 100) + '%<\/b> \u2014 highest payoff zone right now.', ch: s.chapter });\n        else if (s.coverage < 0.6) recos.push({ ic: 'cool', icon: '\ud83d\udd0d', txt: '<b>' + chShort(s.chapter) + '<\/b>: accuracy is fine (' + Math.round(s.acc * 100) + '%) but you\\u2019ve only covered <b>' + Math.round(s.coverage * 100) + '%<\/b> of its PYQs \u2014 finish the set.', ch: s.chapter });\n    });\n    if (progress.weakAreas.length >= 3) recos.push({ ic: 'hot', icon: '\u26a0\ufe0f', txt: 'You have <b>' + progress.weakAreas.length + ' weak questions<\/b> flagged. One focused Weak-Areas session will clear the backlog.', weak: true });\n    const due = revisionDue();\n    if (due.length) recos.push({ ic: 'warm', icon: '\ud83d\udd01', txt: '<b>' + due.length + ' mastered questions<\/b> haven\\u2019t been touched in over ' + quizConfig.revisionGapDays + ' days \u2014 revise before they fade.' });\n    const best = [...stats].filter(s => s.acc !== null).sort((a, b) => b.acc - a.acc)[0];\n    if (best && best.acc >= 0.75) recos.push({ ic: 'good', icon: '\ud83c\udfc5', txt: 'Strongest area: <b>' + chShort(best.chapter) + '<\/b> at <b>' + Math.round(best.acc * 100) + '%<\/b> accuracy \u2014 bank these marks on exam day.' });\n    $id('aiRecoList').innerHTML = recos.map(r =>\n        '<div class=\"ai-reco\"><span class=\"ic ' + r.ic + '\">' + r.icon + '<\/span><p>' + r.txt + '<\/p>' +\n        (r.ch ? '<button class=\"go\" data-practice-ch=\"' + encodeURIComponent(r.ch) + '\">Practice \\u2192<\/button>' : r.weak ? '<button class=\"go\" data-practice-weak=\"1\">Start \\u2192<\/button>' : '') + '<\/div>'\n    ).join('');\n\n    \/\/ Performance table\n    $id('perfTableBody').innerHTML = byPriority.map(s => {\n        const accPct = s.acc === null ? null : Math.round(s.acc * 100);\n        const tag = s.acc === null ? '<span class=\"tag na\">Not started<\/span>'\n            : accPct < 45 ? '<span class=\"tag hot\">Critical<\/span>'\n            : accPct < 65 ? '<span class=\"tag warm\">Needs work<\/span>'\n            : accPct < 85 ? '<span class=\"tag ok\">On track<\/span>'\n            : '<span class=\"tag good\">Strong<\/span>';\n        const accBar = s.acc === null ? '\u2014' : '<div class=\"mini-track\"><div class=\"mini-fill\" style=\"width:' + accPct + '%;background:' + (accPct < 45 ? 'var(--red)' : accPct < 65 ? 'var(--amber)' : 'var(--green)') + '\"><\/div><\/div><span style=\"font-size:11.5px\">' + accPct + '%<\/span>';\n        return '<tr><td title=\"' + s.chapter + '\">' + chLabel(s.chapter) + '<\/td><td><b>' + Math.round(s.weight * 100) + '%<\/b> <span style=\"color:var(--faint);font-size:11.2px\">(' + s.count + ' Qs)<\/span><\/td><td>' + s.attempted + '\/' + s.count + '<\/td><td>' + accBar + '<\/td><td>' + tag + '<\/td><td><button class=\"mini-go\" data-practice-ch=\"' + encodeURIComponent(s.chapter) + '\">Practice<\/button><\/td><\/tr>';\n    }).join('');\n\n    \/\/ Revision queue\n    $id('revisionQueue').innerHTML = due.length ? due.slice(0, 8).map(({ q, days }) =>\n        '<div class=\"rev-item\" data-goto=\"' + q.id + '\"><span class=\"q-num\">Q' + q.id + '<\/span><span class=\"q-text\">' + q.question.replace(\/<br\\s*\\\/?>|\\n\/gi, ' ').substring(0, 55) + '\u2026<\/span><span class=\"days\">' + days + 'd ago<\/span><\/div>'\n    ).join('') : '<div class=\"ai-empty\" style=\"padding:18px\"><p style=\"font-size:13.3px\">Nothing due for revision. Mastered questions reappear here after ' + quizConfig.revisionGapDays + ' days.<\/p><\/div>';\n\n    \/\/ Mastery distribution\n    const buckets = [0, 0, 0, 0]; \/\/ untouched, learning, close, mastered\n    allQuestions.forEach(q => {\n        const s = progress.questionStats[q.id];\n        if (!s || (s.correct + s.incorrect) === 0) buckets[0]++;\n        else if (s.correct >= quizConfig.masteryThreshold) buckets[3]++;\n        else if (s.correct >= 2) buckets[2]++;\n        else buckets[1]++;\n    });\n    const labels = ['Untouched', 'Learning (0\u20131\u2605)', 'Almost there (2\u2605)', 'Mastered (' + quizConfig.masteryThreshold + '\u2605+)'];\n    const colors = ['#cbd5e1', 'var(--amber)', 'var(--navy-l)', 'var(--green)'];\n    $id('masteryDist').innerHTML = buckets.map((n, i) =>\n        '<div class=\"bar-row\" style=\"grid-template-columns:minmax(130px,1fr) 2fr auto\"><span class=\"bar-name\">' + labels[i] + '<\/span><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:' + (allQuestions.length ? n \/ allQuestions.length * 100 : 0) + '%;background:' + colors[i] + '\"><\/div><\/div><span class=\"bar-val\">' + n + '<\/span><\/div>'\n    ).join('');\n}\nfunction revisionDue() {\n    const now = Date.now(), gap = quizConfig.revisionGapDays * 86400000;\n    return allQuestions.map(q => {\n        const s = progress.questionStats[q.id];\n        if (s && s.correct >= quizConfig.masteryThreshold && s.lastAttempt && (now - s.lastAttempt) > gap)\n            return { q, days: Math.floor((now - s.lastAttempt) \/ 86400000) };\n        return null;\n    }).filter(Boolean).sort((a, b) => b.days - a.days);\n}\nfunction gotoQuestion(qid) {\n    switchView('practice');\n    let idx = filteredQuestions.findIndex(q => q.id === qid);\n    if (idx === -1) { setMode('all'); idx = filteredQuestions.findIndex(q => q.id === qid); }\n    if (idx !== -1) { currentQuestionIndex = idx; loadQuestion(); }\n}\nfunction practiceChapter(ch) {\n    switchView('practice');\n    setMode('chapter', ch);\n    showToast('Filtered to ' + chShort(ch), 'success');\n}\n\n\/\/ ==========================================\n\/\/ EVENT DELEGATION (single listener)\n\/\/ ==========================================\ndocument.addEventListener('click', function (e) {\n    const w = e.target.closest('.gfr-portal');\n    if (!w) return;\n    const tab = e.target.closest('.gp-tab'); if (tab) { switchView(tab.dataset.view); return; }\n    const mode = e.target.closest('.mode-tab'); if (mode) { setMode(mode.dataset.mode); return; }\n    const yf = e.target.closest('.filter-item[data-year]'); if (yf) { setMode('year', currentFilter === yf.dataset.year ? null : yf.dataset.year); return; }\n    const cf = e.target.closest('.filter-item[data-chapter]'); if (cf) { const c = decodeURIComponent(cf.dataset.chapter); setMode('chapter', currentFilter === c ? null : c); return; }\n    const gi = e.target.closest('.grid-item'); if (gi) { currentQuestionIndex = parseInt(gi.dataset.idx, 10); loadQuestion(); return; }\n    const go = e.target.closest('[data-goto]'); if (go) { gotoQuestion(parseInt(go.dataset.goto, 10)); return; }\n    const pc = e.target.closest('[data-practice-ch]'); if (pc) { practiceChapter(decodeURIComponent(pc.dataset.practiceCh)); return; }\n    const pw = e.target.closest('[data-practice-weak]'); if (pw) { switchView('practice'); setMode('weak'); return; }\n    const opt = e.target.closest('.option-item'); if (opt && !answerChecked) {\n        $id('optionsList').querySelectorAll('.option-item').forEach(o => o.classList.remove('selected'));\n        opt.classList.add('selected'); selectedOption = parseInt(opt.dataset.opt, 10); return;\n    }\n    switch (e.target.closest('button') ? e.target.closest('button').id : '') {\n        case 'checkBtn': checkAnswer(); break;\n        case 'prevBtn': if (currentQuestionIndex > 0) { currentQuestionIndex--; loadQuestion(); } break;\n        case 'nextBtn': if (currentQuestionIndex < filteredQuestions.length - 1) { currentQuestionIndex++; loadQuestion(); } break;\n        case 'submitBtn': submitExam(); break;\n        case 'resetBtn': resetSession(); break;\n        case 'resetPerfBtn': resetPerformance(); break;\n        case 'reviewBtn': reviewAnswers(); break;\n        case 'retryBtn': retryQuiz(); break;\n        case 'practiceWeakBtn': $id('resultModal').classList.remove('show'); setMode('weak'); break;\n        case 'practiceWeakAreasBtn': setMode('weak'); break;\n        case 'resumeBtn': {\n            const qid = progress.lastQuestionId;\n            if (progress.lastMode) setMode(progress.lastMode, progress.lastFilter);\n            if (qid) gotoQuestion(qid);\n            $id('sessionInfo').style.display = 'none';\n            break;\n        }\n    }\n});\n\n\/\/ Screenshot \/ copy deterrents (as in original)\ndocument.addEventListener('contextmenu', function (e) { if (e.target.closest('.gfr-portal')) { e.preventDefault(); showToast('Right-click is disabled to protect content'); } });\ndocument.addEventListener('keydown', function (e) {\n    if ((e.ctrlKey || e.metaKey) && ['c', 's', 'p', 'u'].includes(e.key.toLowerCase()) && document.querySelector('.gfr-portal')) {\n        e.preventDefault(); showToast('Copying is disabled to protect content');\n    }\n    if (e.key === 'PrintScreen') showToast('Screenshots are discouraged \u2014 content is protected');\n});\n\n\/\/ ==========================================\n\/\/ INIT\n\/\/ ==========================================\ndocument.addEventListener('DOMContentLoaded', function () {\n    $id('topicName').textContent = quizConfig.topic;\n    $id('topicSubtitle').textContent = quizConfig.subtitle;\n    loadProgress();\n    renderFilters();\n    setMode(progress.lastMode || 'all', progress.lastFilter || null);\n    updateHeader();\n    if (progress.lastQuestionId) {\n        const q = allQuestions.find(x => x.id === progress.lastQuestionId);\n        if (q) { $id('sessionInfo').style.display = ''; $id('sessionText').textContent = 'Last session: Q' + q.id + ' (' + q.year + ')'; }\n    }\n    initDone = true;\n});\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u26a0\ufe0f Message \ud83c\udf89 Great Job! You have completed the quiz. 0 Correct 0 Incorrect 0% Score \ud83d\udc41 Review \u26a0\ufe0f Practice [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"disabled","ast-banner-title-visibility":"disabled","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"disabled","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[],"tags":[],"class_list":["post-13611","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/promotionexams.com\/index.php?rest_route=\/wp\/v2\/pages\/13611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/promotionexams.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/promotionexams.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/promotionexams.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/promotionexams.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=13611"}],"version-history":[{"count":10,"href":"https:\/\/promotionexams.com\/index.php?rest_route=\/wp\/v2\/pages\/13611\/revisions"}],"predecessor-version":[{"id":13666,"href":"https:\/\/promotionexams.com\/index.php?rest_route=\/wp\/v2\/pages\/13611\/revisions\/13666"}],"wp:attachment":[{"href":"https:\/\/promotionexams.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=13611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/promotionexams.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=13611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/promotionexams.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=13611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}