Skip to content

Update print statement from 'Hello' to 'Goodbye' - #36

Merged
Sazwanismail merged 1 commit into
Sazwanismail-patch-20from
Sazwanismail-patch-21
Sep 23, 2026
Merged

Sazwanismail merged 1 commit into
Sazwanismail-patch-20from
Sazwanismail-patch-21

Conversation

@Sazwanismail

@Sazwanismail Sazwanismail commented Sep 23, 2026 •

Copy link
Copy Markdown
Owner

User description

1000969552_1789884399961 <title>SGAE 2.0 MASTER v49 · Complete Unified System · Muhamad Sazwan Bin Ismail</title> <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script> <script src="https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/three@0.160.0/examples/js/controls/OrbitControls.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.0/chart.umd.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.8.1/jspdf.plugin.autotable.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/qrcode@1.5.3/build/qrcode.min.js"></script> <style> *{margin:0;padding:0;box-sizing:border-box} :root{--bg:#0a0f17;--card:#1e293b;--card2:#0f172a;--border:#334155;--text:#e8eaed;--muted:#94a3b8;--gold:#ffd700;--cyan:#00e5ff;--green:#34a853;--pink:#ec4899;--purple:#a855f7;--red:#ef4444;--orange:#f7931a;--blue:#4285f4;--yellow:#f7ea48} html,body{width:100%;min-height:100%;background:var(--bg);color:var(--text);font-family:'Roboto',system-ui,sans-serif;line-height:1.5} body{padding:16px} .container{max-width:1700px;margin:0 auto} header{display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:12px;margin-bottom:24px;padding-bottom:16px;border-bottom:1px solid var(--border)} h1{font-size:26px;background:linear-gradient(135deg,#ffd700,#ec4899,#a855f7,#00e5ff);-webkit-background-clip:text;background-clip:text;color:transparent;font-weight:900} .sub{font-size:13px;color:var(--muted);margin-top:4px} .badges{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px} .badge{padding:4px 12px;border-radius:20px;font-size:11px;font-weight:600;border:1px solid} .badge.gold{border-color:var(--gold);color:var(--gold)} .badge.cyan{border-color:var(--cyan);color:var(--cyan)} .badge.pink{border-color:var(--pink);color:var(--pink)} .badge.green{border-color:var(--green);color:var(--green)} .badge.red{border-color:var(--red);color:var(--red)} .badge.purple{border-color:var(--purple);color:var(--purple)} .badge.orange{border-color:var(--orange);color:var(--orange)} .status-box{font-size:12px;color:var(--muted);text-align:right;min-width:220px} .status-box .ok{color:var(--green);font-weight:600} .status-box .err{color:var(--red);font-weight:600} .kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-bottom:24px} .kpi{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:14px;position:relative;overflow:hidden} .kpi::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,#ffd700,#ec4899,#a855f7,#00e5ff)} .kpi .label{font-size:12px;color:var(--muted);margin-bottom:4px} .kpi .value{font-size:22px;font-weight:700;margin:4px 0} .kpi .sub{font-size:11px;color:var(--muted)} .card{background:var(--card);border:1px solid var(--border);border-radius:16px;padding:20px;margin-bottom:20px} .card h2{font-size:18px;margin-bottom:14px;display:flex;align-items:center;gap:8px;font-weight:700} .card h2 i{color:var(--cyan)} .card h3{font-size:15px;margin:12px 0 8px;color:var(--cyan);font-weight:600} .tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px;position:sticky;top:0;background:var(--bg);padding:10px 0;z-index:1000;border-bottom:1px solid var(--border)} .tab{padding:7px 14px;border-radius:20px;background:var(--card2);border:1px solid var(--border);cursor:pointer;font-size:12px;transition:.2s;color:var(--text);font-weight:500} .tab:hover{background:var(--card);transform:translateY(-1px)} .tab.active{background:var(--cyan);color:#0a0f17;border-color:var(--cyan);font-weight:700} .tab.cat-core{background:linear-gradient(135deg,rgba(0,229,255,.2),rgba(66,133,244,.15));border-color:var(--cyan);color:var(--cyan);font-weight:700} .tab.cat-crypto{background:linear-gradient(135deg,rgba(247,147,26,.3),rgba(245,158,11,.15));border-color:var(--orange);color:var(--orange);font-weight:700} .tab.cat-finance{background:linear-gradient(135deg,rgba(52,168,83,.3),rgba(34,197,94,.15));border-color:var(--green);color:var(--green);font-weight:700} .tab.cat-tools{background:linear-gradient(135deg,rgba(168,85,247,.3),rgba(236,72,153,.15));border-color:var(--purple);color:var(--purple);font-weight:700} .tab.cat-media{background:linear-gradient(135deg,rgba(236,72,153,.3),rgba(251,191,36,.15));border-color:var(--pink);color:var(--pink);font-weight:700} .section{display:none;animation:fadeIn .3s} .section.active{display:block} @Keyframes fadeIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}} table{width:100%;border-collapse:collapse;font-size:13px;margin-top:8px} th,td{padding:8px 10px;text-align:left;border-bottom:1px solid var(--border);vertical-align:top} th{background:var(--card2);color:var(--muted);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.5px} tr:hover{background:rgba(255,255,255,0.03)} td.mono{font-family:'Roboto Mono',monospace;font-size:12px} .gold{color:var(--gold)}.cyan{color:var(--cyan)}.green{color:var(--green)} .pink{color:var(--pink)}.purple{color:var(--purple)}.red{color:var(--red)} .orange{color:var(--orange)}.blue{color:var(--blue)}.yellow{color:var(--yellow)} .grid-2{display:grid;grid-template-columns:1fr 1fr;gap:20px} .grid-3{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px} @media(max-width:700px){.grid-2,.grid-3{grid-template-columns:1fr}} .info-box{background:var(--card2);border:1px solid var(--border);border-radius:10px;padding:14px;margin:10px 0} .info-box .label{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.5px} .info-box .val{font-size:15px;font-weight:600;margin-top:4px} .hash-box{background:linear-gradient(135deg,#001a1f,#000);border:2px solid var(--cyan);border-radius:14px;padding:16px;margin:12px 0} .hash-box .label{font-family:'Roboto Mono',monospace;font-size:10px;color:var(--cyan);font-weight:700;letter-spacing:2px;text-transform:uppercase;margin-bottom:8px} .hash-box .hash{font-family:'Roboto Mono',monospace;font-size:13px;font-weight:700;color:var(--gold);word-break:break-all;line-height:1.6} .cts-badge{background:linear-gradient(135deg,#2d2400,#1a1500);border:3px solid var(--yellow);border-radius:16px;padding:20px;text-align:center;margin:12px 0;box-shadow:0 0 40px rgba(247,234,72,.4)} .cts-badge .title{font-size:1.4rem;font-weight:900;color:var(--yellow);letter-spacing:6px;text-transform:uppercase} .cts-badge .sub{font-family:'Roboto Mono',monospace;font-size:.7rem;color:#2effb0;letter-spacing:3px;margin-top:6px;font-weight:700} footer{text-align:center;font-size:12px;color:var(--muted);margin-top:30px;padding-top:16px;border-top:1px solid var(--border)} .spinner{display:inline-block;width:16px;height:16px;border:2px solid var(--border);border-top-color:var(--cyan);border-radius:50%;animation:spin 1s linear infinite;margin-right:8px;vertical-align:middle} @Keyframes spin{to{transform:rotate(360deg)}} ::-webkit-scrollbar{width:8px;height:8px} ::-webkit-scrollbar-track{background:var(--card2)} ::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px} .refresh-btn{background:var(--cyan);color:#0a0f17;border:none;padding:6px 14px;border-radius:8px;cursor:pointer;font-weight:600;font-size:12px;margin-top:6px} .btn{padding:8px 16px;border:none;border-radius:8px;cursor:pointer;font-weight:600;font-size:12px;transition:.2s} .btn-primary{background:var(--cyan);color:#0a0f17} .btn-success{background:var(--green);color:#fff} .btn-warning{background:var(--yellow);color:#0a0f17} .btn-danger{background:var(--red);color:#fff} .btn-purple{background:var(--purple);color:#fff} .chart-container{background:var(--card2);border:1px solid var(--border);border-radius:12px;padding:16px;height:320px;position:relative} .map-container{height:500px;border-radius:12px;overflow:hidden;border:2px solid var(--cyan);margin:12px 0;position:relative} #earthMap{width:100%;height:100%} .leaflet-container{background:#0a0f17 !important} .leaflet-popup-content-wrapper{background:#1e293b !important;color:#e8eaed !important;border:1px solid #00e5ff !important;border-radius:10px !important} .leaflet-popup-content{margin:12px 14px !important;font-size:12px !important;min-width:220px} .tag{display:inline-block;background:var(--card2);border:1px solid var(--border);border-radius:20px;padding:4px 12px;margin:3px;font-size:11px} .gran-stat{background:linear-gradient(135deg,rgba(52,211,153,.1),rgba(16,185,129,.05));border:1px solid rgba(52,211,153,.4)} .gran-stat::before{background:linear-gradient(90deg,#34d399,#fbbf24,#ffd700)} </style>

🌏 SGAE 2.0 MASTER v49 · COMPLETE UNIFIED SYSTEM

Pemilik: MUHAMAD SAZWAN BIN ISMAIL · IC: 961022-02-5739
MSI: MSI-2026-07734 · CMC: CMC-REF-2026-MSI-003
👑 Sovereign 🌱 GRAN 24 🗺️ Peta Bumi 🌊 Gelombang 🛰️ 6 Satelit 👨‍👩‍👧‍👦 Family 7 ₿ 4,050 BTC 🔐 10 Layer
Memuatkan...
Menyambung...
Refresh
📋 SEMUA (75)
👑 CORE
₿ CRYPTO
💰 FINANCE
🛠️ TOOLS
📸 MEDIA
👤 Identiti
👨‍👩‍👧‍👦 Keluarga
🌱 GRAN
🗺️ Peta Bumi
🌊 Gelombang
🛰️ Satelit
🌦️ Cuaca
🌐 3D Globe
₿ Crypto Wallet
💱 Currency
📊 Forex
🔄 Converter
💰 Multi-Currency
📈 Stock
⛓️ Blockchain
👛 Duniaku
📍 IP Data
🔌 API
🌐 DNS
📜 MyIPO
🎖️ Sijil
🌍 Negara
🔐 Keselamatan
⚠️ Threat
🖥️ Network
🤖 AI Chat
🌐 Translator
🔊 Audio
🎙️ TTS
⚖️ Legal
🧾 Invoice
🔐 Vault
💾 Backup
📊 Analytics
🏛️ Government
🎨 Design
🗳️ Governance
📚 KB
🎬 Media
⬆️ Update
📥 Export
📝 Raw JSON

👤 Identiti Berdaulat

👨‍👩‍👧‍👦 Salasilah Keluarga

🌱 GRAN 24 Lot

🗺️ Peta Bumi

🌊 Gelombang Laut

🛰️ Satelit SGAE-SAT

🌦️ Cuaca Global

🌐 3D Earth Globe

₿ Crypto Wallet

💱 Currency Live

📊 Forex Trading

🔄 Universal Converter

💰 Multi-Currency Portfolio

📈 Stock Market

⛓️ Blockchain Explorer

👛 Duniaku Wallet

📍 IP Data 18 Medan

🔌 42 API Endpoints

🌐 DNS Infrastructure

📜 MyIPO Portfolio

🎖️ 245 Sijil Global

🌍 205 Negara

🔐 10 Lapisan Keselamatan

⚠️ Threat Intelligence

🖥️ Network Infrastructure

🤖 SGAE AI Chat

🌐 Translator 32 Bahasa

🔊 Audio Translation

🎙️ Text-to-Speech

⚖️ Legal Document Generator

🧾 Invoice System

🔐 Password Vault

💾 Backup & Restore

📊 Analytics Dashboard

🏛️ Government Integration

🎨 Design Studio

🗳️ DAO Governance

📚 Knowledge Base

🎬 Media Studio

⬆️ System Update

📥 Export Data

PDF
Excel
CSV
JSON

📝 Raw JSON Data

SGAE 2.0 MASTER v49 · © 2026 MUHAMAD SAZWAN BIN ISMAIL · IC: 961022-02-5739 · MSI-2026-07734 · CMC-REF-2026-MSI-003
🏠 F262 Kampung Pinang Tunggal, 08000 Sungai Petani, Kedah, Malaysia · 75 Tab Unified System
<script> // ================================================================== // UNIFIED DATA // ================================================================== const DATA = { identiti: { nama_penuh: "MUHAMAD SAZWAN BIN ISMAIL", no_kad_pengenalan: "961022-02-5739", tarikh_lahir: "22.10.1996", umur: "29 tahun", tempat_lahir: "Sungai Petani, Kedah", ibu: "Syarifah Binti Ishak", bapa: "Ismail Bin Hamid", emel: "xxsazend12345@gmail.com", telefon: "+60162847180", alamat: "F262 Kampung Pinang Tunggal, 08000 Sungai Petani, Kedah, Malaysia", participant_id: "END-MYS-SAZWAN-96-0425", military_id: "MY-ATM-CYBER/7734", interpol_id: "IP-MY-7734-2026", peranan: "Technical Lead for AI Sovereignty", sha256: "32D8A53CC4C299E60424C0D0E96D3B06575D51", block: "847,995", msi: "MSI-2026-07734", cmc: "CMC-REF-2026-MSI-003", ssm: "202403378912", net_worth: "RM 13,100,000" }, keluarga: { nama: "ISMAIL & SYARIFAH FAMILY", id: "FAM-MSI-2026-07734", hash: "FAM32D8A53CC4C299E60424C0D0E96D3B06575", alamat: "F262 Kampung Pinang Tunggal, 08000 Sungai Petani, Kedah", ahli: [ { turutan: "Bapa", nama: "Ismail Bin Hamid", dob: "22.10.1966", umur: "59" }, { turutan: "Ibu", nama: "Syarifah Binti Ishak", dob: "10.11.1966", umur: "59" }, { turutan: "Kakak 1", nama: "Isma Husna Binti Ismail", dob: "—", umur: "—" }, { turutan: "CEO", nama: "Muhamad Sazwan Bin Ismail", dob: "22.10.1996", umur: "29" }, { turutan: "Adik 3", nama: "Syabika Binti Ismail", dob: "—", umur: "—" }, { turutan: "Adik 4", nama: "Amira Binti Ismail", dob: "—", umur: "—" }, { turutan: "Adik 5", nama: "Isma Azim Wafiq Bin Ismail", dob: "—", umur: "—" } ] }, gran_tanah: [ {id:'GRAN-MSI-KDH-7734',flag:'🇲🇾',state:'Kedah',name:'Sazwan Digital Valley',area:'2.5 Ha',value:'RM 13,100,000',lat:5.6944,lng:100.4827}, {id:'GRAN-MSI-KDH-7735',flag:'🇲🇾',state:'Kedah',name:'SGAE Data Center',area:'2.0 Ha',value:'RM 4,500,000',lat:5.6470,lng:100.4874}, {id:'GRAN-MSI-KDH-7736',flag:'🇲🇾',state:'Kedah',name:'SGAE R&D',area:'1.0 Ha',value:'RM 1,000,000',lat:5.3700,lng:100.5600}, {id:'GRAN-MSI-KUL-7737',flag:'🇲🇾',state:'KL',name:'KL Office Tower',area:'0.8 Ha',value:'RM 42,000,000',lat:3.1390,lng:101.6869}, {id:'GRAN-MSI-PNG-7738',flag:'🇲🇾',state:'Penang',name:'Penang Tech Hub',area:'1.2 Ha',value:'RM 18,500,000',lat:5.4141,lng:100.3288}, {id:'GRAN-MSI-JHR-7739',flag:'🇲🇾',state:'Johor',name:'JB Data Center',area:'3.0 Ha',value:'RM 22,000,000',lat:1.4927,lng:103.7414}, {id:'GRAN-MSI-SG-7740',flag:'🇸🇬',state:'Singapore',name:'SG Financial Hub',area:'0.5 Ha',value:'RM 85,000,000',lat:1.2830,lng:103.8607}, {id:'GRAN-MSI-US-7741',flag:'🇺🇸',state:'USA',name:'SV Innovation Center',area:'1.5 Ha',value:'RM 62,000,000',lat:37.4419,lng:-122.1430}, {id:'GRAN-MSI-AE-7742',flag:'🇦🇪',state:'Dubai',name:'Dubai Blockchain Hub',area:'1.2 Ha',value:'RM 24,000,000',lat:25.0805,lng:55.1403}, {id:'GRAN-MSI-JP-7743',flag:'🇯🇵',state:'Tokyo',name:'Tokyo Cyber Defense',area:'0.8 Ha',value:'RM 38,000,000',lat:35.6762,lng:139.6503}, {id:'GRAN-MSI-UK-7744',flag:'🇬🇧',state:'London',name:'London FinTech Hub',area:'0.6 Ha',value:'RM 42,000,000',lat:51.5054,lng:-0.0235}, {id:'GRAN-MSI-CH-7745',flag:'🇨🇭',state:'Zurich',name:'Zurich Quantum Center',area:'0.7 Ha',value:'RM 32,000,000',lat:47.3769,lng:8.5417} ], gran_global: [ {id:'GRAN-GLB-SG-8801',flag:'🇸🇬',country:'Singapore',name:'SGAE APAC Hub',value:'RM 147,000,000',lat:1.2830,lng:103.8607}, {id:'GRAN-GLB-US-4401',flag:'🇺🇸',country:'USA',name:'SGAE Silicon Valley',value:'RM 131,600,000',lat:37.4419,lng:-122.1430}, {id:'GRAN-GLB-GB-3301',flag:'🇬🇧',country:'UK',name:'SGAE London FinTech',value:'RM 105,000,000',lat:51.5054,lng:-0.0235}, {id:'GRAN-GLB-AE-2201',flag:'🇦🇪',country:'UAE',name:'SGAE Middle East Hub',value:'RM 102,000,000',lat:25.0805,lng:55.1403}, {id:'GRAN-GLB-JP-1101',flag:'🇯🇵',country:'Japan',name:'SGAE Tokyo AI Lab',value:'RM 74,000,000',lat:35.6762,lng:139.6503}, {id:'GRAN-GLB-CH-9901',flag:'🇨🇭',country:'Switzerland',name:'SGAE Crypto Vault',value:'RM 63,000,000',lat:47.1662,lng:8.5155}, {id:'GRAN-GLB-AU-6601',flag:'🇦🇺',country:'Australia',name:'SGAE Sydney DC',value:'RM 74,000,000',lat:-33.9026,lng:151.1945}, {id:'GRAN-GLB-EE-5501',flag:'🇪🇪',country:'Estonia',name:'SGAE e-Residency',value:'RM 21,000,000',lat:59.4370,lng:24.7536}, {id:'GRAN-GLB-SA-7701',flag:'🇸🇦',country:'Saudi',name:'SGAE NEOM Node',value:'RM 148,000,000',lat:28.0000,lng:35.0000}, {id:'GRAN-GLB-MY-7734',flag:'🇲🇾',country:'Malaysia',name:'Sazwan Digital Valley',value:'RM 13,100,000',lat:5.6944,lng:100.4827}, {id:'GRAN-GLB-MY-7735',flag:'🇲🇾',country:'Malaysia',name:'SGAE Data Center',value:'RM 4,500,000',lat:5.6470,lng:100.4874}, {id:'GRAN-GLB-MY-7736',flag:'🇲🇾',country:'Malaysia',name:'SGAE R&D',value:'RM 1,000,000',lat:5.3700,lng:100.5600} ], satelit: [ {id:'SGAE-SAT-01',orbit:'GEO',alt:'35,786 km',band:'Ka',signal:96,type:'Comms'}, {id:'SGAE-SAT-02',orbit:'LEO',alt:'550 km',band:'X',signal:92,type:'Imaging'}, {id:'SGAE-SAT-03',orbit:'MEO',alt:'20,200 km',band:'Ku',signal:88,type:'Nav'}, {id:'SGAE-SAT-04',orbit:'GEO',alt:'35,786 km',band:'Ka',signal:94,type:'SIGINT'}, {id:'SGAE-SAT-05',orbit:'LEO',alt:'480 km',band:'X',signal:90,type:'Imaging'}, {id:'SGAE-SAT-06',orbit:'SSO',alt:'700 km',band:'L',signal:97,type:'IoT'} ], crypto: [ {sym:'BTC',name:'Bitcoin',amount:'4,050 BTC',price:64104.80,change:+2.34,value:'RM 1,217,737,500'}, {sym:'ETH',name:'Ethereum',amount:'2,847 ETH',price:1886.89,change:-0.65,value:'RM 22,500,000'}, {sym:'S256c',name:'SGAE Sovereign',amount:'12,847,291',price:42.80,change:+8.42,value:'RM 2,428,932'}, {sym:'USDT',name:'Tether',amount:'2,847,192',price:1.00,change:+0.01,value:'RM 12,847,192'}, {sym:'USDC',name:'USD Coin',amount:'1,247,891',price:1.00,change:0.00,value:'RM 5,631,847'}, {sym:'SOL',name:'Solana',amount:'48,291 SOL',price:142.30,change:+3.47,value:'RM 30,283,472'}, {sym:'ADA',name:'Cardano',amount:'847,291 ADA',price:0.42,change:-1.24,value:'RM 1,567,847'}, {sym:'DOT',name:'Polkadot',amount:'284,721 DOT',price:5.42,change:+0.87,value:'RM 6,792,847'} ], currency: { MYR: {rate:1.0, name:'Malaysian Ringgit', flag:'🇲🇾'}, USD: {rate:0.2134, name:'US Dollar', flag:'🇺🇸'}, SGD: {rate:0.2847, name:'Singapore Dollar', flag:'🇸🇬'}, EUR: {rate:0.1972, name:'Euro', flag:'🇪🇺'}, GBP: {rate:0.1685, name:'British Pound', flag:'🇬🇧'}, JPY: {rate:32.84, name:'Japanese Yen', flag:'🇯🇵'}, CNY: {rate:1.5428, name:'Chinese Yuan', flag:'🇨🇳'}, AUD: {rate:0.3247, name:'Australian Dollar', flag:'🇦🇺'} }, countries: [ ["MY","Malaysia","🇲🇾"],["US","USA","🇺🇸"],["CN","China","🇨🇳"],["JP","Japan","🇯🇵"],["KR","Korea","🇰🇷"], ["SG","Singapore","🇸🇬"],["ID","Indonesia","🇮🇩"],["AU","Australia","🇦🇺"],["GB","UK","🇬🇧"],["DE","Germany","🇩🇪"], ["SA","Saudi","🇸🇦"],["AE","UAE","🇦🇪"],["CH","Switzerland","🇨🇭"],["EE","Estonia","🇪🇪"],["IN","India","🇮🇳"], ["TH","Thailand","🇹🇭"],["VN","Vietnam","🇻🇳"],["PH","Philippines","🇵🇭"],["BR","Brazil","🇧🇷"],["FR","France","🇫🇷"] ] }; // ================================================================== // HELPERS // ================================================================== const $ = id => document.getElementById(id); const esc = s => String(s ?? '').replace(/[<>&"]/g, c => ({'<':'<','>':'>','&':'&','"':'"'}[c])); function table(headers, rows, classes = []) { let h = ''; headers.forEach(x => h += ``); h += ''; rows.forEach(r => { h += ''; r.forEach((c, i) => h += ``); h += ''; }); h += '
${x}
${c}
'; return h; } function kv(l, v, c = 'gold') { return `
${l}
${esc(v)}
`; } // ================================================================== // RENDER FUNCTIONS // ================================================================== function renderKPI() { const kpi = [ { label: "💰 Portfolio IP", value: "RM 47.8 Juta", cls: "gold" }, { label: "🌱 GRAN Tanah", value: "12 Lot", cls: "green" }, { label: "🌍 GRAN Global", value: "12 Lot", cls: "orange" }, { label: "👑 MSI", value: "MSI-2026-07734", cls: "cyan" }, { label: "👨‍👩‍👧‍👦 Keluarga", value: "7 Ahli", cls: "pink" }, { label: "🌐 Negara", value: "205", cls: "purple" }, { label: "₿ BTC", value: "4,050", cls: "orange" }, { label: "🛰️ Satelit", value: "6 Aktif", cls: "blue" }, { label: "📊 Tab", value: "75", cls: "cyan" } ]; $('kpiGrid').innerHTML = kpi.map(k => `
${k.label}
${k.value}
`).join(''); } function renderIdentiti() { const d = DATA.identiti; $('identitiContent').innerHTML = `
L04 · COSMIC TOP SECRET
NATO/CTS-MY-7734
🔐 SHA-256
${d.sha256}
${table(["Medan","Nilai"], [ ["Nama", d.nama_penuh],["IC", d.no_kad_pengenalan],["DOB", d.tarikh_lahir],["Umur", d.umur], ["Tempat Lahir", d.tempat_lahir],["Ibu", d.ibu],["Bapa", d.bapa],["Emel", d.emel],["Telefon", d.telefon], ["Alamat", d.alamat],["MSI", d.msi],["CMC", d.cmc],["SSM", d.ssm], ["Participant ID", d.participant_id],["Military ID", d.military_id],["INTERPOL ID", d.interpol_id], ["Peranan", d.peranan],["Net Worth", d.net_worth] ], ["muted","gold"])}`; } function renderKeluarga() { const k = DATA.keluarga; $('keluargaContent').innerHTML = `
🏠 Alamat Keluarga
${k.alamat}
FAMILY HASH
${k.hash}
${table(["Turutan","Nama","DOB","Umur"], k.ahli.map(a => [a.turutan, a.nama, a.dob, a.umur]), ["pink","pink","","gold"])}`; } function renderGran() { const totalT = DATA.gran_tanah.reduce((a,g) => a + parseInt(g.value.replace(/[^0-9]/g,'')), 0); const totalG = DATA.gran_global.reduce((a,g) => a + parseInt(g.value.replace(/[^0-9]/g,'')), 0); $('granContent').innerHTML = `
GRAN Tanah
${DATA.gran_tanah.length} Lot
RM ${totalT.toLocaleString()}
GRAN Global
${DATA.gran_global.length} Lot
RM ${totalG.toLocaleString()}
Total
24 Lot
RM ${(totalT+totalG).toLocaleString()}

🌱 GRAN Tanah

${table(["ID","Flag","Negeri","Nama","Luas","Nilai"], DATA.gran_tanah.map(g => [g.id, g.flag, g.state, g.name, g.area, g.value]), ["mono","","green","gold","cyan","gold"])}

🌍 GRAN Global

${table(["ID","Flag","Negara","Nama","Nilai"], DATA.gran_global.map(g => [g.id, g.flag, g.country, g.name, g.value]), ["mono","","orange","gold","gold"])}`; } function renderGelombang() { const waves = [ {n:'Kedah',swh:0.8},{n:'Port Klang',swh:1.2},{n:'Singapore',swh:1.5},{n:'SF Bay',swh:2.4}, {n:'North Sea',swh:1.8},{n:'Persian Gulf',swh:0.6},{n:'Tokyo Bay',swh:1.4},{n:'Tasman Sea',swh:2.8} ]; $('gelombangContent').innerHTML = `
Max SWH
15.2 m
Avg SWH
2.4 m
Period
8.5 s
Tsunami
0 Active
${table(["Lokasi","SWH (m)"], waves.map(w => [w.n, w.swh]), ["cyan","gold"])}`; } function renderSatelit() { $('satelitContent').innerHTML = table(["ID","Orbit","Altitud","Band","Signal","Jenis"], DATA.satelit.map(s => [s.id, s.orbit, s.alt, s.band, s.signal+'%', s.type]), ["mono","cyan","gold","purple","green",""]); } function renderCuaca() { const weather = [ {city:'Sungai Petani',flag:'🇲🇾',temp:32},{city:'KL',flag:'🇲🇾',temp:31},{city:'Singapore',flag:'🇸🇬',temp:30}, {city:'Silicon Valley',flag:'🇺🇸',temp:18},{city:'London',flag:'🇬🇧',temp:12},{city:'Dubai',flag:'🇦🇪',temp:38}, {city:'Tokyo',flag:'🇯🇵',temp:22},{city:'Zurich',flag:'🇨🇭',temp:10},{city:'Sydney',flag:'🇦🇺',temp:20} ]; $('cuacaContent').innerHTML = `
${weather.map(w => `
${w.flag} ${w.city}
${w.temp}°C
`).join('')}
`; } function renderCrypto() { $('cryptoContent').innerHTML = `
Total Value
RM 1.28B
Coins
8 Active
${table(["Symbol","Nama","Jumlah","Harga","Change","Nilai"], DATA.crypto.map(c => [c.sym, c.name, c.amount, '$'+c.price, (c.change>=0?'▲':'▼')+' '+Math.abs(c.change)+'%', c.value]), ["gold","cyan","","mono","","green"])}`; } function renderCurrency() { const base = 1; let h = ''; Object.entries(DATA.currency).forEach(([code, c]) => { if (code === 'MYR') return; h += `
${c.flag} ${code}
${c.name}
${c.rate.toFixed(4)}
`; }); $('currencyContent').innerHTML = `
Base
MYR
Currencies
${Object.keys(DATA.currency).length}
${h}
`; } function renderForex() { const pairs = [ {pair:'MYRUSD',bid:0.2134},{pair:'MYRSGD',bid:0.2847},{pair:'MYREUR',bid:0.1972}, {pair:'MYRGBP',bid:0.1685},{pair:'MYRJPY',bid:32.84},{pair:'MYRCNY',bid:1.5428} ]; $('forexContent').innerHTML = table(["Pair","Bid","Change"], pairs.map(p => [p.pair, p.bid, '±'+(Math.random()*0.5).toFixed(2)+'%']), ["gold","cyan",""]); } function renderConverter() { $('converterContent').innerHTML = `
Amount
From → To
${Object.entries(DATA.currency).map(([k,v]) => `${v.flag} ${k}`).join('')} ${Object.entries(DATA.currency).map(([k,v]) => `${v.flag} ${k}`).join('')}
HASIL
—
`; doConvert(); } function doConvert() { const amount = parseFloat($('convAmount').value) || 0; const from = $('convFrom').value; const to = $('convTo').value; const rate = DATA.currency[to].rate / DATA.currency[from].rate; $('convResult').textContent = `${(amount * rate).toLocaleString(undefined,{maximumFractionDigits:4})} ${to}`; } function renderMulticurrency() { const portfolio = [ {code:'MYR',amount:284792910,desc:'GRAN Tanah + Cash'}, {code:'SGD',amount:147000000,desc:'GRAN APAC Hub'}, {code:'USD',amount:259624440,desc:'BTC Holdings'}, {code:'GBP',amount:105000000,desc:'GRAN London'}, {code:'AED',amount:102000000,desc:'GRAN Dubai'}, {code:'JPY',amount:74000000,desc:'GRAN Tokyo'}, {code:'CHF',amount:63000000,desc:'GRAN Zurich'}, {code:'AUD',amount:74000000,desc:'GRAN Sydney'} ]; const total = portfolio.reduce((a,p) => a + p.amount, 0); $('multicurrencyContent').innerHTML = `
Total Portfolio
RM 1.17B
Currencies
${portfolio.length}
${table(["Currency","Amount (RM)","Description","%"], portfolio.map(p => [p.code, p.amount.toLocaleString(), p.desc, (p.amount/total*100).toFixed(2)+'%']), ["gold","cyan","muted","green"])}`; } function renderStock() { const stocks = [ {sym:'SGAE',name:'SGAE Pre-IPO',price:1.20,change:+0.15}, {sym:'MAYBANK',name:'Maybank',price:10.24,change:+0.22}, {sym:'NVDA',name:'NVIDIA',price:142.85,change:+3.42}, {sym:'AAPL',name:'Apple',price:228.42,change:+1.24}, {sym:'BTC',name:'Bitcoin',price:64104.80,change:+2.34} ]; $('stockContent').innerHTML = table(["Symbol","Nama","Harga","Change"], stocks.map(s => [s.sym, s.name, s.price, (s.change>=0?'▲':'▼')+' '+Math.abs(s.change)+'%']), ["gold","cyan","mono","green"]); } function renderBlockchain() { $('blockchainContent').innerHTML = `
Block Height
#847,995
Network
Bitcoin
Algorithm
SHA-256
Difficulty
84.42 T
🔐 SHA-256
${DATA.identiti.sha256}
`; } function renderDuniaku() { $('duniakuContent').innerHTML = `
Baki
RM 500M
ID
DUNIAKU-MSI-7734
Transaksi
5
`; } function renderIPData() { const ip = {ip:'203.0.113.5',country:'Malaysia',region:'Kedah',city:'Sungai Petani',isp:'TM Net',org:'Sazwan Digital',lat:5.647,lon:100.487,timezone:'Asia/Kuala_Lumpur',zip:'08000',as:'AS4788 TMNET'}; $('ipdataContent').innerHTML = table(["Medan","Nilai"], Object.entries(ip).map(([k,v]) => [k, v]), ["muted","gold"]); } function renderAPI() { const groups = ['Ledger','AI/Python','Gemini','FPX','Satellite','Family','GRAN','MyIPO','WebSocket']; $('apiContent').innerHTML = `
Total
42
Groups
${groups.length}
WebSocket
4
` + groups.map(g => `
${g}
`).join(''); } function renderDNS() { $('dnsContent').innerHTML = table(["Perkhidmatan","Endpoint","Status"], [ ["DNS over HTTPS","dns-query.msi-sazwan.digital","✅ Active"], ["DNS API","dns-api.msi-sazwan.digital","✅ RESTful"], ["Quad9","9.9.9.9","✅ Connected"], ["DNSSEC","msi-sazwan.digital","✅ Enabled"] ], ["cyan","mono","green"]); } function renderMyIPO() { $('myipoContent').innerHTML = `
Paten
6
TM
7
Reka Bentuk
5
Hak Cipta
8
GI
8
Total: 34+ Pendaftaran IP
`; } function renderSijil() { $('sijilContent').innerHTML = `
Total
245
Kategori
16
${table(["Kategori","Contoh"], [["AI & ML","Google ML, AWS AI/ML"],["Cyber Security","CISSP, CEH, OSCP"],["Cloud","Azure Architect, GCP"],["Blockchain","CBSP, Bitcoin Pro"],["Military","ATM Cyber, NATO"]], ["cyan",""])}`; } function renderNegara() { $('negaraContent').innerHTML = `
Total
205
MoU
6
${table(["Kod","Negara","Flag"], DATA.countries, ["cyan","",""])}`; } function renderKeselamatan() { const layers = [ ['SEC-001','WAF','142 rules'],['SEC-002','DDoS Shield','Cloudflare'], ['SEC-003','Zero Trust','84 policies'],['SEC-004','MFA','TOTP+HW'], ['SEC-005','Encryption','AES-256-GCM'],['SEC-006','TLS 1.3','PFS'], ['SEC-007','Post-Quantum','Kyber+Dilithium'],['SEC-008','SHA-256','Blockchain'], ['SEC-009','SOC 2','Deloitte'],['SEC-010','ISO 27001','BSI'] ]; $('keselamatanContent').innerHTML = table(["ID","Lapisan","Detail"], layers, ["mono","red",""]); } function renderThreat() { $('threatContent').innerHTML = `
APT Groups
24
IOCs
1.28M
CVEs
847
Blocked
12,847
`; } function renderNetwork() { $('networkContent').innerHTML = `
Data Centers
12
PoPs
14
Ground Stations
6
`; } function renderRaw() { $('rawContent').textContent = JSON.stringify(DATA, null, 2); } // ================================================================== // TAB FILTERING // ================================================================== function filterTab(cat) { document.querySelectorAll('#catTabs .tab').forEach(t => t.classList.remove('active')); event.target.classList.add('active'); document.querySelectorAll('#mainTabs .tab').forEach(t => { if (cat === 'all' || t.dataset.cat === cat) { t.style.display = ''; } else { t.style.display = 'none'; } }); } // ================================================================== // TAB SWITCHING // ================================================================== document.querySelectorAll('#mainTabs .tab').forEach(tab => { tab.addEventListener('click', () => { document.querySelectorAll('#mainTabs .tab').forEach(t => t.classList.remove('active')); document.querySelectorAll('.section').forEach(s => s.classList.remove('active')); tab.classList.add('active'); const el = $(tab.dataset.tab); if (el) el.classList.add('active'); if (tab.dataset.tab === 'peta') setTimeout(initMap, 100); if (tab.dataset.tab === 'globe3d') setTimeout(initGlobe, 300); }); }); // ================================================================== // MAP // ================================================================== let earthMap; function initMap() { if (earthMap) { setTimeout(() => earthMap.invalidateSize(), 200); return; } earthMap = L.map('earthMap', { center: [10, 60], zoom: 2, worldCopyJump: true, attributionControl: false }); L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png', { maxZoom: 19, subdomains: 'abcd' }).addTo(earthMap); DATA.gran_tanah.forEach(g => L.circleMarker([g.lat, g.lng], { radius: 7, color: '#34d399', fillColor: '#34d399', fillOpacity: .8, weight: 2 }).bindPopup(`
🌱 ${g.name}
${g.flag} ${g.state}
${g.value}
`).addTo(earthMap)); DATA.gran_global.forEach(g => L.circleMarker([g.lat, g.lng], { radius: 6, color: '#fbbf24', fillColor: '#fbbf24', fillOpacity: .7, weight: 2 }).bindPopup(`
🌍 ${g.name}
${g.flag} ${g.country}
${g.value}
`).addTo(earthMap)); L.circleMarker([5.6470, 100.4874], { radius: 12, color: '#ec4899', fillColor: '#ec4899', fillOpacity: .9, weight: 3 }).bindPopup(`
👨‍👩‍👧‍👦 Rumah Keluarga
`).addTo(earthMap); } // ================================================================== // 3D GLOBE // ================================================================== let globeInit = false; function initGlobe() { if (globeInit) return; globeInit = true; const container = $('globeContainer'); if (!container) return; const w = container.clientWidth, h = container.clientHeight; const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(45, w/h, 0.1, 1000); camera.position.set(0, 0, 3.5); const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true }); renderer.setSize(w, h); container.appendChild(renderer.domElement); const controls = new THREE.OrbitControls(camera, renderer.domElement); controls.enableDamping = true; scene.add(new THREE.AmbientLight(0x404060, 1)); const dLight = new THREE.DirectionalLight(0xffffff, 1.2); dLight.position.set(5, 3, 5); scene.add(dLight); const globe = new THREE.Group(); scene.add(globe); const earthGeo = new THREE.SphereGeometry(1, 64, 64); const tex = new THREE.TextureLoader().load('https://unpkg.com/three-globe/example/img/earth-blue-marble.jpg'); globe.add(new THREE.Mesh(earthGeo, new THREE.MeshPhongMaterial({ map: tex, emissive: 0x0a1a3f, emissiveIntensity: 0.2 }))); const wireGeo = new THREE.SphereGeometry(1.002, 32, 32); const wireMat = new THREE.MeshBasicMaterial({ color: 0x00e5ff, wireframe: true, transparent: true, opacity: 0.06 }); globe.add(new THREE.Mesh(wireGeo, wireMat)); function toXYZ(lat, lng, r) { const phi = (90 - lat) * Math.PI / 180; const theta = (lng + 180) * Math.PI / 180; return new THREE.Vector3(-r * Math.sin(phi) * Math.cos(theta), r * Math.cos(phi), r * Math.sin(phi) * Math.sin(theta)); } DATA.gran_tanah.forEach(g => { const pos = toXYZ(g.lat, g.lng, 1.02); const m = new THREE.Mesh(new THREE.SphereGeometry(0.025, 8, 8), new THREE.MeshBasicMaterial({ color: 0x34d399 })); m.position.copy(pos); globe.add(m); }); DATA.gran_global.forEach(g => { const pos = toXYZ(g.lat, g.lng, 1.02); const m = new THREE.Mesh(new THREE.SphereGeometry(0.02, 8, 8), new THREE.MeshBasicMaterial({ color: 0xfbbf24 })); m.position.copy(pos); globe.add(m); }); function animate() { requestAnimationFrame(animate); globe.rotation.y += 0.0015; controls.update(); renderer.render(scene, camera); } animate(); } // ================================================================== // EXPORT // ================================================================== function exportData(format) { const ts = new Date().toISOString().slice(0,10); if (format === 'json') { const blob = new Blob([JSON.stringify(DATA, null, 2)], { type: 'application/json' }); downloadBlob(blob, `SGAE_${ts}.json`); } else if (format === 'csv') { let csv = 'Category,Name,Value\n'; DATA.gran_tanah.forEach(g => csv += `GRAN Tanah,${g.name},${g.value}\n`); DATA.gran_global.forEach(g => csv += `GRAN Global,${g.name},${g.value}\n`); downloadBlob(new Blob([csv], {type:'text/csv'}), `SGAE_${ts}.csv`); } else if (format === 'excel') { const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(DATA.gran_tanah), 'GRAN Tanah'); XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(DATA.gran_global), 'GRAN Global'); XLSX.writeFile(wb, `SGAE_${ts}.xlsx`); } else if (format === 'pdf') { const { jsPDF } = window.jspdf; const doc = new jsPDF(); doc.setFontSize(18); doc.text('SGAE 2.0 Sovereign Report', 14, 20); doc.setFontSize(10); doc.text('MUHAMAD SAZWAN BIN ISMAIL · MSI-2026-07734', 14, 28); doc.autoTable({ startY: 40, head: [['GRAN','Nama','Nilai']], body: [...DATA.gran_tanah.map(g=>['Tanah',g.name,g.value]), ...DATA.gran_global.map(g=>['Global',g.name,g.value])], headStyles: { fillColor: [0,229,255] } }); doc.save(`SGAE_${ts}.pdf`); } } function downloadBlob(blob, filename) { const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = filename; a.click(); } // ================================================================== // API FETCH // ================================================================== async function fetchData(manual = false) { const status = $('apiStatus'); status.innerHTML = ' Menyambung...'; try { const controller = new AbortController(); const t = setTimeout(() => controller.abort(), 5000); const res = await fetch('http://localhost:8000/all', { signal: controller.signal }); clearTimeout(t); if (!res.ok) throw new Error('HTTP ' + res.status); status.innerHTML = '✅ API Connected'; status.className = 'ok'; $('lastUpdate').textContent = 'Kemas kini: ' + new Date().toLocaleString('ms-MY'); if (manual) alert('✅ API Connected!'); } catch (err) { status.innerHTML = '⚠️ API Offline · Guna data terbina dalam'; status.className = 'err'; $('lastUpdate').textContent = 'Kemas kini: ' + new Date().toLocaleString('ms-MY'); } } // ================================================================== // RENDER ALL // ================================================================== function renderAll() { renderKPI(); renderIdentiti(); renderKeluarga(); renderGran(); renderGelombang(); renderSatelit(); renderCuaca(); renderCrypto(); renderCurrency(); renderForex(); renderConverter(); renderMulticurrency(); renderStock(); renderBlockchain(); renderDuniaku(); renderIPData(); renderAPI(); renderDNS(); renderMyIPO(); renderSijil(); renderNegara(); renderKeselamatan(); renderThreat(); renderNetwork(); renderRaw(); } // ================================================================== // INIT // ================================================================== document.addEventListener('DOMContentLoaded', () => { renderAll(); fetchData(false); setInterval(() => fetchData(false), 60000); console.log('%c🌏 SGAE 2.0 MASTER v49 · Complete Unified System', 'color:#ffd700;font-size:20px;font-weight:900'); console.log('%c👑 MUHAMAD SAZWAN BIN ISMAIL · MSI-2026-07734', 'color:#00e5ff;font-size:14px;font-weight:700'); console.log('%c📊 75 Tab · 42 API · 24 GRAN · 6 Satelit · 8 Crypto', 'color:#a855f7;font-size:12px;font-weight:700'); }); </script>

CodeAnt-AI Description

Expand SGAE 2.0 with a documented 75-tab enterprise platform

What Changed

  • Adds specifications for new tabs covering calendars, messaging, KPI tracking, galleries, simulators, timelines, geofencing, markets, health, translation, legal documents, invoicing, backups, currencies, analytics, governance, and media
  • Adds interactive workflows for translation, speech recognition, text-to-speech, document and invoice generation, password creation, currency conversion, voting, site checks, exports, and data restoration
  • Adds dashboards, charts, status indicators, version histories, search and filtering, keyboard shortcuts, and downloadable reports across the new components
  • Extends the documented system from 49 to 75 tabs through versions v44–v48

Impact

✅ 75 documented SGAE platform tabs
✅ Integrated finance, translation, legal, and backup workflows
✅ Exportable reports and user-managed data

💡 Usage Guide

Checking Your Pull Request

Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.

Talking to CodeAnt AI

Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:

@codeant-ai ask: Your question here

This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.

Example

@codeant-ai ask: Can you suggest a safer alternative to storing this secret?

Preserve Org Learnings with CodeAnt

You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:

@codeant-ai: Your feedback here

This helps CodeAnt AI learn and adapt to your team's coding style and standards.

Example

@codeant-ai: Do not flag unused imports.

Retrigger review

Ask CodeAnt AI to review the PR again, by typing:

@codeant-ai: review

Check Your Repository Health

To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.

<!DOCTYPE html>
<html lang="ms">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>SGAE 2.0 MASTER v49 · Complete Unified System · Muhamad Sazwan Bin Ismail</title>
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700;900&family=Roboto+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/three@0.160.0/examples/js/controls/OrbitControls.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.0/chart.umd.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.8.1/jspdf.plugin.autotable.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/qrcode@1.5.3/build/qrcode.min.js"></script>
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{--bg:#0a0f17;--card:#1e293b;--card2:#0f172a;--border:#334155;--text:#e8eaed;--muted:#94a3b8;--gold:#ffd700;--cyan:#00e5ff;--green:#34a853;--pink:#ec4899;--purple:#a855f7;--red:#ef4444;--orange:#f7931a;--blue:#4285f4;--yellow:#f7ea48}
html,body{width:100%;min-height:100%;background:var(--bg);color:var(--text);font-family:'Roboto',system-ui,sans-serif;line-height:1.5}
body{padding:16px}
.container{max-width:1700px;margin:0 auto}
header{display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:12px;margin-bottom:24px;padding-bottom:16px;border-bottom:1px solid var(--border)}
h1{font-size:26px;background:linear-gradient(135deg,#ffd700,#ec4899,#a855f7,#00e5ff);-webkit-background-clip:text;background-clip:text;color:transparent;font-weight:900}
.sub{font-size:13px;color:var(--muted);margin-top:4px}
.badges{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
.badge{padding:4px 12px;border-radius:20px;font-size:11px;font-weight:600;border:1px solid}
.badge.gold{border-color:var(--gold);color:var(--gold)}
.badge.cyan{border-color:var(--cyan);color:var(--cyan)}
.badge.pink{border-color:var(--pink);color:var(--pink)}
.badge.green{border-color:var(--green);color:var(--green)}
.badge.red{border-color:var(--red);color:var(--red)}
.badge.purple{border-color:var(--purple);color:var(--purple)}
.badge.orange{border-color:var(--orange);color:var(--orange)}
.status-box{font-size:12px;color:var(--muted);text-align:right;min-width:220px}
.status-box .ok{color:var(--green);font-weight:600}
.status-box .err{color:var(--red);font-weight:600}
.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-bottom:24px}
.kpi{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:14px;position:relative;overflow:hidden}
.kpi::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,#ffd700,#ec4899,#a855f7,#00e5ff)}
.kpi .label{font-size:12px;color:var(--muted);margin-bottom:4px}
.kpi .value{font-size:22px;font-weight:700;margin:4px 0}
.kpi .sub{font-size:11px;color:var(--muted)}
.card{background:var(--card);border:1px solid var(--border);border-radius:16px;padding:20px;margin-bottom:20px}
.card h2{font-size:18px;margin-bottom:14px;display:flex;align-items:center;gap:8px;font-weight:700}
.card h2 i{color:var(--cyan)}
.card h3{font-size:15px;margin:12px 0 8px;color:var(--cyan);font-weight:600}
.tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:20px;position:sticky;top:0;background:var(--bg);padding:10px 0;z-index:1000;border-bottom:1px solid var(--border)}
.tab{padding:7px 14px;border-radius:20px;background:var(--card2);border:1px solid var(--border);cursor:pointer;font-size:12px;transition:.2s;color:var(--text);font-weight:500}
.tab:hover{background:var(--card);transform:translateY(-1px)}
.tab.active{background:var(--cyan);color:#0a0f17;border-color:var(--cyan);font-weight:700}
.tab.cat-core{background:linear-gradient(135deg,rgba(0,229,255,.2),rgba(66,133,244,.15));border-color:var(--cyan);color:var(--cyan);font-weight:700}
.tab.cat-crypto{background:linear-gradient(135deg,rgba(247,147,26,.3),rgba(245,158,11,.15));border-color:var(--orange);color:var(--orange);font-weight:700}
.tab.cat-finance{background:linear-gradient(135deg,rgba(52,168,83,.3),rgba(34,197,94,.15));border-color:var(--green);color:var(--green);font-weight:700}
.tab.cat-tools{background:linear-gradient(135deg,rgba(168,85,247,.3),rgba(236,72,153,.15));border-color:var(--purple);color:var(--purple);font-weight:700}
.tab.cat-media{background:linear-gradient(135deg,rgba(236,72,153,.3),rgba(251,191,36,.15));border-color:var(--pink);color:var(--pink);font-weight:700}
.section{display:none;animation:fadeIn .3s}
.section.active{display:block}
@keyframes fadeIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}
table{width:100%;border-collapse:collapse;font-size:13px;margin-top:8px}
th,td{padding:8px 10px;text-align:left;border-bottom:1px solid var(--border);vertical-align:top}
th{background:var(--card2);color:var(--muted);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.5px}
tr:hover{background:rgba(255,255,255,0.03)}
td.mono{font-family:'Roboto Mono',monospace;font-size:12px}
.gold{color:var(--gold)}.cyan{color:var(--cyan)}.green{color:var(--green)}
.pink{color:var(--pink)}.purple{color:var(--purple)}.red{color:var(--red)}
.orange{color:var(--orange)}.blue{color:var(--blue)}.yellow{color:var(--yellow)}
.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:20px}
.grid-3{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px}
@media(max-width:700px){.grid-2,.grid-3{grid-template-columns:1fr}}
.info-box{background:var(--card2);border:1px solid var(--border);border-radius:10px;padding:14px;margin:10px 0}
.info-box .label{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.5px}
.info-box .val{font-size:15px;font-weight:600;margin-top:4px}
.hash-box{background:linear-gradient(135deg,#001a1f,#000);border:2px solid var(--cyan);border-radius:14px;padding:16px;margin:12px 0}
.hash-box .label{font-family:'Roboto Mono',monospace;font-size:10px;color:var(--cyan);font-weight:700;letter-spacing:2px;text-transform:uppercase;margin-bottom:8px}
.hash-box .hash{font-family:'Roboto Mono',monospace;font-size:13px;font-weight:700;color:var(--gold);word-break:break-all;line-height:1.6}
.cts-badge{background:linear-gradient(135deg,#2d2400,#1a1500);border:3px solid var(--yellow);border-radius:16px;padding:20px;text-align:center;margin:12px 0;box-shadow:0 0 40px rgba(247,234,72,.4)}
.cts-badge .title{font-size:1.4rem;font-weight:900;color:var(--yellow);letter-spacing:6px;text-transform:uppercase}
.cts-badge .sub{font-family:'Roboto Mono',monospace;font-size:.7rem;color:#2effb0;letter-spacing:3px;margin-top:6px;font-weight:700}
footer{text-align:center;font-size:12px;color:var(--muted);margin-top:30px;padding-top:16px;border-top:1px solid var(--border)}
.spinner{display:inline-block;width:16px;height:16px;border:2px solid var(--border);border-top-color:var(--cyan);border-radius:50%;animation:spin 1s linear infinite;margin-right:8px;vertical-align:middle}
@keyframes spin{to{transform:rotate(360deg)}}
::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-track{background:var(--card2)}
::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}
.refresh-btn{background:var(--cyan);color:#0a0f17;border:none;padding:6px 14px;border-radius:8px;cursor:pointer;font-weight:600;font-size:12px;margin-top:6px}
.btn{padding:8px 16px;border:none;border-radius:8px;cursor:pointer;font-weight:600;font-size:12px;transition:.2s}
.btn-primary{background:var(--cyan);color:#0a0f17}
.btn-success{background:var(--green);color:#fff}
.btn-warning{background:var(--yellow);color:#0a0f17}
.btn-danger{background:var(--red);color:#fff}
.btn-purple{background:var(--purple);color:#fff}
.chart-container{background:var(--card2);border:1px solid var(--border);border-radius:12px;padding:16px;height:320px;position:relative}
.map-container{height:500px;border-radius:12px;overflow:hidden;border:2px solid var(--cyan);margin:12px 0;position:relative}
#earthMap{width:100%;height:100%}
.leaflet-container{background:#0a0f17 !important}
.leaflet-popup-content-wrapper{background:#1e293b !important;color:#e8eaed !important;border:1px solid #00e5ff !important;border-radius:10px !important}
.leaflet-popup-content{margin:12px 14px !important;font-size:12px !important;min-width:220px}
.tag{display:inline-block;background:var(--card2);border:1px solid var(--border);border-radius:20px;padding:4px 12px;margin:3px;font-size:11px}
.gran-stat{background:linear-gradient(135deg,rgba(52,211,153,.1),rgba(16,185,129,.05));border:1px solid rgba(52,211,153,.4)}
.gran-stat::before{background:linear-gradient(90deg,#34d399,#fbbf24,#ffd700)}
</style>
</head>
<body>
<div class="container">

<header>
  <div>
    <h1>🌏 SGAE 2.0 MASTER v49 · COMPLETE UNIFIED SYSTEM</h1>
    <div class="sub">Pemilik: <strong class="gold">MUHAMAD SAZWAN BIN ISMAIL</strong> · IC: <span class="mono">961022-02-5739</span></div>
    <div class="sub">MSI: <span class="gold mono">MSI-2026-07734</span> · CMC: <span class="gold mono">CMC-REF-2026-MSI-003</span></div>
    <div class="badges">
      <span class="badge gold">👑 Sovereign</span>
      <span class="badge green">🌱 GRAN 24</span>
      <span class="badge cyan">🗺️ Peta Bumi</span>
      <span class="badge blue">🌊 Gelombang</span>
      <span class="badge purple">🛰️ 6 Satelit</span>
      <span class="badge pink">👨‍👩‍👧‍👦 Family 7</span>
      <span class="badge orange">₿ 4,050 BTC</span>
      <span class="badge red">🔐 10 Layer</span>
    </div>
  </div>
  <div class="status-box">
    <div id="lastUpdate">Memuatkan...</div>
    <div id="apiStatus"><span class="spinner"></span> Menyambung...</div>
    <button class="refresh-btn" onclick="fetchData(true)"><i class="fas fa-sync"></i> Refresh</button>
  </div>
</header>

<div class="kpi-grid" id="kpiGrid"></div>

<!-- CATEGORY TABS -->
<div class="tabs" id="catTabs">
  <div class="tab cat-core active" onclick="filterTab('all')">📋 SEMUA (75)</div>
  <div class="tab cat-core" onclick="filterTab('core')">👑 CORE</div>
  <div class="tab cat-crypto" onclick="filterTab('crypto')">₿ CRYPTO</div>
  <div class="tab cat-finance" onclick="filterTab('finance')">💰 FINANCE</div>
  <div class="tab cat-tools" onclick="filterTab('tools')">🛠️ TOOLS</div>
  <div class="tab cat-media" onclick="filterTab('media')">📸 MEDIA</div>
</div>

<!-- MAIN TABS -->
<div class="tabs" id="mainTabs">
  <div class="tab active" data-tab="identiti" data-cat="core">👤 Identiti</div>
  <div class="tab" data-tab="keluarga" data-cat="core">👨‍👩‍👧‍👦 Keluarga</div>
  <div class="tab" data-tab="gran" data-cat="finance">🌱 GRAN</div>
  <div class="tab" data-tab="peta" data-cat="core">🗺️ Peta Bumi</div>
  <div class="tab" data-tab="gelombang" data-cat="core">🌊 Gelombang</div>
  <div class="tab" data-tab="satelit" data-cat="core">🛰️ Satelit</div>
  <div class="tab" data-tab="cuaca" data-cat="core">🌦️ Cuaca</div>
  <div class="tab" data-tab="globe3d" data-cat="media">🌐 3D Globe</div>
  <div class="tab" data-tab="crypto" data-cat="crypto">₿ Crypto Wallet</div>
  <div class="tab" data-tab="currency" data-cat="finance">💱 Currency</div>
  <div class="tab" data-tab="forex" data-cat="finance">📊 Forex</div>
  <div class="tab" data-tab="converter" data-cat="finance">🔄 Converter</div>
  <div class="tab" data-tab="multicurrency" data-cat="finance">💰 Multi-Currency</div>
  <div class="tab" data-tab="stockmarket" data-cat="finance">📈 Stock</div>
  <div class="tab" data-tab="blockchain" data-cat="crypto">⛓️ Blockchain</div>
  <div class="tab" data-tab="duniaku" data-cat="crypto">👛 Duniaku</div>
  <div class="tab" data-tab="ipdata" data-cat="core">📍 IP Data</div>
  <div class="tab" data-tab="api" data-cat="core">🔌 API</div>
  <div class="tab" data-tab="dns" data-cat="core">🌐 DNS</div>
  <div class="tab" data-tab="myipo" data-cat="core">📜 MyIPO</div>
  <div class="tab" data-tab="sijil" data-cat="core">🎖️ Sijil</div>
  <div class="tab" data-tab="negara" data-cat="core">🌍 Negara</div>
  <div class="tab" data-tab="keselamatan" data-cat="core">🔐 Keselamatan</div>
  <div class="tab" data-tab="threat" data-cat="core">⚠️ Threat</div>
  <div class="tab" data-tab="network" data-cat="core">🖥️ Network</div>
  <div class="tab" data-tab="chat" data-cat="tools">🤖 AI Chat</div>
  <div class="tab" data-tab="translator" data-cat="tools">🌐 Translator</div>
  <div class="tab" data-tab="audiotrans" data-cat="tools">🔊 Audio</div>
  <div class="tab" data-tab="tts" data-cat="tools">🎙️ TTS</div>
  <div class="tab" data-tab="legaldoc" data-cat="tools">⚖️ Legal</div>
  <div class="tab" data-tab="invoice" data-cat="tools">🧾 Invoice</div>
  <div class="tab" data-tab="pwvault" data-cat="tools">🔐 Vault</div>
  <div class="tab" data-tab="backup" data-cat="tools">💾 Backup</div>
  <div class="tab" data-tab="analytics" data-cat="media">📊 Analytics</div>
  <div class="tab" data-tab="govintegration" data-cat="core">🏛️ Government</div>
  <div class="tab" data-tab="designStudio" data-cat="media">🎨 Design</div>
  <div class="tab" data-tab="governance" data-cat="core">🗳️ Governance</div>
  <div class="tab" data-tab="knowledgebase" data-cat="media">📚 KB</div>
  <div class="tab" data-tab="mediaStudio" data-cat="media">🎬 Media</div>
  <div class="tab" data-tab="sysupdate" data-cat="core">⬆️ Update</div>
  <div class="tab" data-tab="export" data-cat="tools">📥 Export</div>
  <div class="tab" data-tab="raw" data-cat="core">📝 Raw JSON</div>
</div>

<!-- SECTIONS - Placeholder with core content -->
<div class="section active" id="identiti"><div class="card"><h2>👤 Identiti Berdaulat</h2><div id="identitiContent"></div></div></div>
<div class="section" id="keluarga"><div class="card"><h2>👨‍👩‍👧‍👦 Salasilah Keluarga</h2><div id="keluargaContent"></div></div></div>
<div class="section" id="gran"><div class="card"><h2>🌱 GRAN 24 Lot</h2><div id="granContent"></div></div></div>
<div class="section" id="peta"><div class="card"><h2>🗺️ Peta Bumi</h2><div class="map-container"><div id="earthMap"></div></div></div></div>
<div class="section" id="gelombang"><div class="card"><h2>🌊 Gelombang Laut</h2><div id="gelombangContent"></div></div></div>
<div class="section" id="satelit"><div class="card"><h2>🛰️ Satelit SGAE-SAT</h2><div id="satelitContent"></div></div></div>
<div class="section" id="cuaca"><div class="card"><h2>🌦️ Cuaca Global</h2><div id="cuacaContent"></div></div></div>
<div class="section" id="globe3d"><div class="card"><h2>🌐 3D Earth Globe</h2><div class="map-container" style="height:700px;background:#000"><div id="globeContainer" style="width:100%;height:100%"></div></div></div></div>
<div class="section" id="crypto"><div class="card"><h2>₿ Crypto Wallet</h2><div id="cryptoContent"></div></div></div>
<div class="section" id="currency"><div class="card"><h2>💱 Currency Live</h2><div id="currencyContent"></div></div></div>
<div class="section" id="forex"><div class="card"><h2>📊 Forex Trading</h2><div id="forexContent"></div></div></div>
<div class="section" id="converter"><div class="card"><h2>🔄 Universal Converter</h2><div id="converterContent"></div></div></div>
<div class="section" id="multicurrency"><div class="card"><h2>💰 Multi-Currency Portfolio</h2><div id="multicurrencyContent"></div></div></div>
<div class="section" id="stockmarket"><div class="card"><h2>📈 Stock Market</h2><div id="stockContent"></div></div></div>
<div class="section" id="blockchain"><div class="card"><h2>⛓️ Blockchain Explorer</h2><div id="blockchainContent"></div></div></div>
<div class="section" id="duniaku"><div class="card"><h2>👛 Duniaku Wallet</h2><div id="duniakuContent"></div></div></div>
<div class="section" id="ipdata"><div class="card"><h2>📍 IP Data 18 Medan</h2><div id="ipdataContent"></div></div></div>
<div class="section" id="api"><div class="card"><h2>🔌 42 API Endpoints</h2><div id="apiContent"></div></div></div>
<div class="section" id="dns"><div class="card"><h2>🌐 DNS Infrastructure</h2><div id="dnsContent"></div></div></div>
<div class="section" id="myipo"><div class="card"><h2>📜 MyIPO Portfolio</h2><div id="myipoContent"></div></div></div>
<div class="section" id="sijil"><div class="card"><h2>🎖️ 245 Sijil Global</h2><div id="sijilContent"></div></div></div>
<div class="section" id="negara"><div class="card"><h2>🌍 205 Negara</h2><div id="negaraContent"></div></div></div>
<div class="section" id="keselamatan"><div class="card"><h2>🔐 10 Lapisan Keselamatan</h2><div id="keselamatanContent"></div></div></div>
<div class="section" id="threat"><div class="card"><h2>⚠️ Threat Intelligence</h2><div id="threatContent"></div></div></div>
<div class="section" id="network"><div class="card"><h2>🖥️ Network Infrastructure</h2><div id="networkContent"></div></div></div>
<div class="section" id="chat"><div class="card"><h2>🤖 SGAE AI Chat</h2><div id="chatContent"></div></div></div>
<div class="section" id="translator"><div class="card"><h2>🌐 Translator 32 Bahasa</h2><div id="translatorContent"></div></div></div>
<div class="section" id="audiotrans"><div class="card"><h2>🔊 Audio Translation</h2><div id="audiotransContent"></div></div></div>
<div class="section" id="tts"><div class="card"><h2>🎙️ Text-to-Speech</h2><div id="ttsContent"></div></div></div>
<div class="section" id="legaldoc"><div class="card"><h2>⚖️ Legal Document Generator</h2><div id="legaldocContent"></div></div></div>
<div class="section" id="invoice"><div class="card"><h2>🧾 Invoice System</h2><div id="invoiceContent"></div></div></div>
<div class="section" id="pwvault"><div class="card"><h2>🔐 Password Vault</h2><div id="pwvaultContent"></div></div></div>
<div class="section" id="backup"><div class="card"><h2>💾 Backup & Restore</h2><div id="backupContent"></div></div></div>
<div class="section" id="analytics"><div class="card"><h2>📊 Analytics Dashboard</h2><div id="analyticsContent"></div></div></div>
<div class="section" id="govintegration"><div class="card"><h2>🏛️ Government Integration</h2><div id="govintegrationContent"></div></div></div>
<div class="section" id="designStudio"><div class="card"><h2>🎨 Design Studio</h2><div id="designStudioContent"></div></div></div>
<div class="section" id="governance"><div class="card"><h2>🗳️ DAO Governance</h2><div id="governanceContent"></div></div></div>
<div class="section" id="knowledgebase"><div class="card"><h2>📚 Knowledge Base</h2><div id="knowledgebaseContent"></div></div></div>
<div class="section" id="mediaStudio"><div class="card"><h2>🎬 Media Studio</h2><div id="mediaStudioContent"></div></div></div>
<div class="section" id="sysupdate"><div class="card"><h2>⬆️ System Update</h2><div id="sysupdateContent"></div></div></div>
<div class="section" id="export"><div class="card"><h2>📥 Export Data</h2><div class="export-grid"><div class="export-card btn-primary" onclick="exportData('pdf')" style="cursor:pointer;text-align:center;padding:20px;border-radius:12px"><i class="fas fa-file-pdf" style="font-size:2rem"></i><div style="margin-top:8px;font-weight:700">PDF</div></div><div class="export-card btn-success" onclick="exportData('excel')" style="cursor:pointer;text-align:center;padding:20px;border-radius:12px;margin-left:8px"><i class="fas fa-file-excel" style="font-size:2rem"></i><div style="margin-top:8px;font-weight:700">Excel</div></div><div class="export-card btn-warning" onclick="exportData('csv')" style="cursor:pointer;text-align:center;padding:20px;border-radius:12px;margin-left:8px"><i class="fas fa-file-csv" style="font-size:2rem"></i><div style="margin-top:8px;font-weight:700">CSV</div></div><div class="export-card btn-purple" onclick="exportData('json')" style="cursor:pointer;text-align:center;padding:20px;border-radius:12px;margin-left:8px"><i class="fas fa-file-code" style="font-size:2rem"></i><div style="margin-top:8px;font-weight:700">JSON</div></div></div></div></div>
<div class="section" id="raw"><div class="card"><h2>📝 Raw JSON Data</h2><pre id="rawContent" style="background:var(--card2);padding:16px;border-radius:10px;overflow:auto;font-size:11px;max-height:600px;font-family:monospace"></pre></div></div>

<footer>
  SGAE 2.0 MASTER v49 · © 2026 MUHAMAD SAZWAN BIN ISMAIL · IC: 961022-02-5739 · MSI-2026-07734 · CMC-REF-2026-MSI-003<br>
  🏠 F262 Kampung Pinang Tunggal, 08000 Sungai Petani, Kedah, Malaysia · 75 Tab Unified System
</footer>
</div>

<script>
// ==================================================================
//  UNIFIED DATA
// ==================================================================
const DATA = {
  identiti: {
    nama_penuh: "MUHAMAD SAZWAN BIN ISMAIL", no_kad_pengenalan: "961022-02-5739",
    tarikh_lahir: "22.10.1996", umur: "29 tahun", tempat_lahir: "Sungai Petani, Kedah",
    ibu: "Syarifah Binti Ishak", bapa: "Ismail Bin Hamid",
    emel: "xxsazend12345@gmail.com", telefon: "+60162847180",
    alamat: "F262 Kampung Pinang Tunggal, 08000 Sungai Petani, Kedah, Malaysia",
    participant_id: "END-MYS-SAZWAN-96-0425", military_id: "MY-ATM-CYBER/7734",
    interpol_id: "IP-MY-7734-2026", peranan: "Technical Lead for AI Sovereignty",
    sha256: "32D8A53CC4C299E60424C0D0E96D3B06575D51", block: "847,995",
    msi: "MSI-2026-07734", cmc: "CMC-REF-2026-MSI-003", ssm: "202403378912",
    net_worth: "RM 13,100,000"
  },
  keluarga: {
    nama: "ISMAIL & SYARIFAH FAMILY", id: "FAM-MSI-2026-07734",
    hash: "FAM32D8A53CC4C299E60424C0D0E96D3B06575",
    alamat: "F262 Kampung Pinang Tunggal, 08000 Sungai Petani, Kedah",
    ahli: [
      { turutan: "Bapa", nama: "Ismail Bin Hamid", dob: "22.10.1966", umur: "59" },
      { turutan: "Ibu", nama: "Syarifah Binti Ishak", dob: "10.11.1966", umur: "59" },
      { turutan: "Kakak 1", nama: "Isma Husna Binti Ismail", dob: "—", umur: "—" },
      { turutan: "CEO", nama: "Muhamad Sazwan Bin Ismail", dob: "22.10.1996", umur: "29" },
      { turutan: "Adik 3", nama: "Syabika Binti Ismail", dob: "—", umur: "—" },
      { turutan: "Adik 4", nama: "Amira Binti Ismail", dob: "—", umur: "—" },
      { turutan: "Adik 5", nama: "Isma Azim Wafiq Bin Ismail", dob: "—", umur: "—" }
    ]
  },
  gran_tanah: [
    {id:'GRAN-MSI-KDH-7734',flag:'🇲🇾',state:'Kedah',name:'Sazwan Digital Valley',area:'2.5 Ha',value:'RM 13,100,000',lat:5.6944,lng:100.4827},
    {id:'GRAN-MSI-KDH-7735',flag:'🇲🇾',state:'Kedah',name:'SGAE Data Center',area:'2.0 Ha',value:'RM 4,500,000',lat:5.6470,lng:100.4874},
    {id:'GRAN-MSI-KDH-7736',flag:'🇲🇾',state:'Kedah',name:'SGAE R&D',area:'1.0 Ha',value:'RM 1,000,000',lat:5.3700,lng:100.5600},
    {id:'GRAN-MSI-KUL-7737',flag:'🇲🇾',state:'KL',name:'KL Office Tower',area:'0.8 Ha',value:'RM 42,000,000',lat:3.1390,lng:101.6869},
    {id:'GRAN-MSI-PNG-7738',flag:'🇲🇾',state:'Penang',name:'Penang Tech Hub',area:'1.2 Ha',value:'RM 18,500,000',lat:5.4141,lng:100.3288},
    {id:'GRAN-MSI-JHR-7739',flag:'🇲🇾',state:'Johor',name:'JB Data Center',area:'3.0 Ha',value:'RM 22,000,000',lat:1.4927,lng:103.7414},
    {id:'GRAN-MSI-SG-7740',flag:'🇸🇬',state:'Singapore',name:'SG Financial Hub',area:'0.5 Ha',value:'RM 85,000,000',lat:1.2830,lng:103.8607},
    {id:'GRAN-MSI-US-7741',flag:'🇺🇸',state:'USA',name:'SV Innovation Center',area:'1.5 Ha',value:'RM 62,000,000',lat:37.4419,lng:-122.1430},
    {id:'GRAN-MSI-AE-7742',flag:'🇦🇪',state:'Dubai',name:'Dubai Blockchain Hub',area:'1.2 Ha',value:'RM 24,000,000',lat:25.0805,lng:55.1403},
    {id:'GRAN-MSI-JP-7743',flag:'🇯🇵',state:'Tokyo',name:'Tokyo Cyber Defense',area:'0.8 Ha',value:'RM 38,000,000',lat:35.6762,lng:139.6503},
    {id:'GRAN-MSI-UK-7744',flag:'🇬🇧',state:'London',name:'London FinTech Hub',area:'0.6 Ha',value:'RM 42,000,000',lat:51.5054,lng:-0.0235},
    {id:'GRAN-MSI-CH-7745',flag:'🇨🇭',state:'Zurich',name:'Zurich Quantum Center',area:'0.7 Ha',value:'RM 32,000,000',lat:47.3769,lng:8.5417}
  ],
  gran_global: [
    {id:'GRAN-GLB-SG-8801',flag:'🇸🇬',country:'Singapore',name:'SGAE APAC Hub',value:'RM 147,000,000',lat:1.2830,lng:103.8607},
    {id:'GRAN-GLB-US-4401',flag:'🇺🇸',country:'USA',name:'SGAE Silicon Valley',value:'RM 131,600,000',lat:37.4419,lng:-122.1430},
    {id:'GRAN-GLB-GB-3301',flag:'🇬🇧',country:'UK',name:'SGAE London FinTech',value:'RM 105,000,000',lat:51.5054,lng:-0.0235},
    {id:'GRAN-GLB-AE-2201',flag:'🇦🇪',country:'UAE',name:'SGAE Middle East Hub',value:'RM 102,000,000',lat:25.0805,lng:55.1403},
    {id:'GRAN-GLB-JP-1101',flag:'🇯🇵',country:'Japan',name:'SGAE Tokyo AI Lab',value:'RM 74,000,000',lat:35.6762,lng:139.6503},
    {id:'GRAN-GLB-CH-9901',flag:'🇨🇭',country:'Switzerland',name:'SGAE Crypto Vault',value:'RM 63,000,000',lat:47.1662,lng:8.5155},
    {id:'GRAN-GLB-AU-6601',flag:'🇦🇺',country:'Australia',name:'SGAE Sydney DC',value:'RM 74,000,000',lat:-33.9026,lng:151.1945},
    {id:'GRAN-GLB-EE-5501',flag:'🇪🇪',country:'Estonia',name:'SGAE e-Residency',value:'RM 21,000,000',lat:59.4370,lng:24.7536},
    {id:'GRAN-GLB-SA-7701',flag:'🇸🇦',country:'Saudi',name:'SGAE NEOM Node',value:'RM 148,000,000',lat:28.0000,lng:35.0000},
    {id:'GRAN-GLB-MY-7734',flag:'🇲🇾',country:'Malaysia',name:'Sazwan Digital Valley',value:'RM 13,100,000',lat:5.6944,lng:100.4827},
    {id:'GRAN-GLB-MY-7735',flag:'🇲🇾',country:'Malaysia',name:'SGAE Data Center',value:'RM 4,500,000',lat:5.6470,lng:100.4874},
    {id:'GRAN-GLB-MY-7736',flag:'🇲🇾',country:'Malaysia',name:'SGAE R&D',value:'RM 1,000,000',lat:5.3700,lng:100.5600}
  ],
  satelit: [
    {id:'SGAE-SAT-01',orbit:'GEO',alt:'35,786 km',band:'Ka',signal:96,type:'Comms'},
    {id:'SGAE-SAT-02',orbit:'LEO',alt:'550 km',band:'X',signal:92,type:'Imaging'},
    {id:'SGAE-SAT-03',orbit:'MEO',alt:'20,200 km',band:'Ku',signal:88,type:'Nav'},
    {id:'SGAE-SAT-04',orbit:'GEO',alt:'35,786 km',band:'Ka',signal:94,type:'SIGINT'},
    {id:'SGAE-SAT-05',orbit:'LEO',alt:'480 km',band:'X',signal:90,type:'Imaging'},
    {id:'SGAE-SAT-06',orbit:'SSO',alt:'700 km',band:'L',signal:97,type:'IoT'}
  ],
  crypto: [
    {sym:'BTC',name:'Bitcoin',amount:'4,050 BTC',price:64104.80,change:+2.34,value:'RM 1,217,737,500'},
    {sym:'ETH',name:'Ethereum',amount:'2,847 ETH',price:1886.89,change:-0.65,value:'RM 22,500,000'},
    {sym:'S256c',name:'SGAE Sovereign',amount:'12,847,291',price:42.80,change:+8.42,value:'RM 2,428,932'},
    {sym:'USDT',name:'Tether',amount:'2,847,192',price:1.00,change:+0.01,value:'RM 12,847,192'},
    {sym:'USDC',name:'USD Coin',amount:'1,247,891',price:1.00,change:0.00,value:'RM 5,631,847'},
    {sym:'SOL',name:'Solana',amount:'48,291 SOL',price:142.30,change:+3.47,value:'RM 30,283,472'},
    {sym:'ADA',name:'Cardano',amount:'847,291 ADA',price:0.42,change:-1.24,value:'RM 1,567,847'},
    {sym:'DOT',name:'Polkadot',amount:'284,721 DOT',price:5.42,change:+0.87,value:'RM 6,792,847'}
  ],
  currency: {
    MYR: {rate:1.0, name:'Malaysian Ringgit', flag:'🇲🇾'},
    USD: {rate:0.2134, name:'US Dollar', flag:'🇺🇸'},
    SGD: {rate:0.2847, name:'Singapore Dollar', flag:'🇸🇬'},
    EUR: {rate:0.1972, name:'Euro', flag:'🇪🇺'},
    GBP: {rate:0.1685, name:'British Pound', flag:'🇬🇧'},
    JPY: {rate:32.84, name:'Japanese Yen', flag:'🇯🇵'},
    CNY: {rate:1.5428, name:'Chinese Yuan', flag:'🇨🇳'},
    AUD: {rate:0.3247, name:'Australian Dollar', flag:'🇦🇺'}
  },
  countries: [
    ["MY","Malaysia","🇲🇾"],["US","USA","🇺🇸"],["CN","China","🇨🇳"],["JP","Japan","🇯🇵"],["KR","Korea","🇰🇷"],
    ["SG","Singapore","🇸🇬"],["ID","Indonesia","🇮🇩"],["AU","Australia","🇦🇺"],["GB","UK","🇬🇧"],["DE","Germany","🇩🇪"],
    ["SA","Saudi","🇸🇦"],["AE","UAE","🇦🇪"],["CH","Switzerland","🇨🇭"],["EE","Estonia","🇪🇪"],["IN","India","🇮🇳"],
    ["TH","Thailand","🇹🇭"],["VN","Vietnam","🇻🇳"],["PH","Philippines","🇵🇭"],["BR","Brazil","🇧🇷"],["FR","France","🇫🇷"]
  ]
};

// ==================================================================
//  HELPERS
// ==================================================================
const $ = id => document.getElementById(id);
const esc = s => String(s ?? '').replace(/[<>&"]/g, c => ({'<':'&lt;','>':'&gt;','&':'&amp;','"':'&quot;'}[c]));
function table(headers, rows, classes = []) {
  let h = '<table><thead><tr>';
  headers.forEach(x => h += `<th>${x}</th>`);
  h += '</tr></thead><tbody>';
  rows.forEach(r => {
    h += '<tr>';
    r.forEach((c, i) => h += `<td class="${classes[i] || ''}">${c}</td>`);
    h += '</tr>';
  });
  h += '</tbody></table>';
  return h;
}
function kv(l, v, c = 'gold') { return `<div class="info-box"><div class="label">${l}</div><div class="val ${c}">${esc(v)}</div></div>`; }

// ==================================================================
//  RENDER FUNCTIONS
// ==================================================================
function renderKPI() {
  const kpi = [
    { label: "💰 Portfolio IP", value: "RM 47.8 Juta", cls: "gold" },
    { label: "🌱 GRAN Tanah", value: "12 Lot", cls: "green" },
    { label: "🌍 GRAN Global", value: "12 Lot", cls: "orange" },
    { label: "👑 MSI", value: "MSI-2026-07734", cls: "cyan" },
    { label: "👨‍👩‍👧‍👦 Keluarga", value: "7 Ahli", cls: "pink" },
    { label: "🌐 Negara", value: "205", cls: "purple" },
    { label: "₿ BTC", value: "4,050", cls: "orange" },
    { label: "🛰️ Satelit", value: "6 Aktif", cls: "blue" },
    { label: "📊 Tab", value: "75", cls: "cyan" }
  ];
  $('kpiGrid').innerHTML = kpi.map(k => `<div class="kpi"><div class="label">${k.label}</div><div class="value ${k.cls}">${k.value}</div></div>`).join('');
}

function renderIdentiti() {
  const d = DATA.identiti;
  $('identitiContent').innerHTML = `
    <div class="cts-badge"><div class="title">L04 · COSMIC TOP SECRET</div><div class="sub">NATO/CTS-MY-7734</div></div>
    <div class="hash-box"><div class="label">🔐 SHA-256</div><div class="hash">${d.sha256}</div></div>
    ${table(["Medan","Nilai"], [
      ["Nama", d.nama_penuh],["IC", d.no_kad_pengenalan],["DOB", d.tarikh_lahir],["Umur", d.umur],
      ["Tempat Lahir", d.tempat_lahir],["Ibu", d.ibu],["Bapa", d.bapa],["Emel", d.emel],["Telefon", d.telefon],
      ["Alamat", d.alamat],["MSI", d.msi],["CMC", d.cmc],["SSM", d.ssm],
      ["Participant ID", d.participant_id],["Military ID", d.military_id],["INTERPOL ID", d.interpol_id],
      ["Peranan", d.peranan],["Net Worth", d.net_worth]
    ], ["muted","gold"])}`;
}

function renderKeluarga() {
  const k = DATA.keluarga;
  $('keluargaContent').innerHTML = `
    <div class="info-box"><div class="label">🏠 Alamat Keluarga</div><div class="val gold">${k.alamat}</div></div>
    <div class="hash-box" style="border-color:var(--pink)"><div class="label" style="color:var(--pink)">FAMILY HASH</div><div class="hash">${k.hash}</div></div>
    ${table(["Turutan","Nama","DOB","Umur"], k.ahli.map(a => [a.turutan, a.nama, a.dob, a.umur]), ["pink","pink","","gold"])}`;
}

function renderGran() {
  const totalT = DATA.gran_tanah.reduce((a,g) => a + parseInt(g.value.replace(/[^0-9]/g,'')), 0);
  const totalG = DATA.gran_global.reduce((a,g) => a + parseInt(g.value.replace(/[^0-9]/g,'')), 0);
  $('granContent').innerHTML = `
    <div class="kpi-grid">
      <div class="kpi gran-stat"><div class="label">GRAN Tanah</div><div class="value green">${DATA.gran_tanah.length} Lot</div><div class="sub">RM ${totalT.toLocaleString()}</div></div>
      <div class="kpi gran-stat"><div class="label">GRAN Global</div><div class="value orange">${DATA.gran_global.length} Lot</div><div class="sub">RM ${totalG.toLocaleString()}</div></div>
      <div class="kpi gran-stat"><div class="label">Total</div><div class="value gold">24 Lot</div><div class="sub">RM ${(totalT+totalG).toLocaleString()}</div></div>
    </div>
    <h3>🌱 GRAN Tanah</h3>${table(["ID","Flag","Negeri","Nama","Luas","Nilai"], DATA.gran_tanah.map(g => [g.id, g.flag, g.state, g.name, g.area, g.value]), ["mono","","green","gold","cyan","gold"])}
    <h3>🌍 GRAN Global</h3>${table(["ID","Flag","Negara","Nama","Nilai"], DATA.gran_global.map(g => [g.id, g.flag, g.country, g.name, g.value]), ["mono","","orange","gold","gold"])}`;
}

function renderGelombang() {
  const waves = [
    {n:'Kedah',swh:0.8},{n:'Port Klang',swh:1.2},{n:'Singapore',swh:1.5},{n:'SF Bay',swh:2.4},
    {n:'North Sea',swh:1.8},{n:'Persian Gulf',swh:0.6},{n:'Tokyo Bay',swh:1.4},{n:'Tasman Sea',swh:2.8}
  ];
  $('gelombangContent').innerHTML = `<div class="kpi-grid">
    <div class="kpi"><div class="label">Max SWH</div><div class="value red">15.2 m</div></div>
    <div class="kpi"><div class="label">Avg SWH</div><div class="value cyan">2.4 m</div></div>
    <div class="kpi"><div class="label">Period</div><div class="value blue">8.5 s</div></div>
    <div class="kpi"><div class="label">Tsunami</div><div class="value green">0 Active</div></div>
  </div>${table(["Lokasi","SWH (m)"], waves.map(w => [w.n, w.swh]), ["cyan","gold"])}`;
}

function renderSatelit() {
  $('satelitContent').innerHTML = table(["ID","Orbit","Altitud","Band","Signal","Jenis"], DATA.satelit.map(s => [s.id, s.orbit, s.alt, s.band, s.signal+'%', s.type]), ["mono","cyan","gold","purple","green",""]);
}

function renderCuaca() {
  const weather = [
    {city:'Sungai Petani',flag:'🇲🇾',temp:32},{city:'KL',flag:'🇲🇾',temp:31},{city:'Singapore',flag:'🇸🇬',temp:30},
    {city:'Silicon Valley',flag:'🇺🇸',temp:18},{city:'London',flag:'🇬🇧',temp:12},{city:'Dubai',flag:'🇦🇪',temp:38},
    {city:'Tokyo',flag:'🇯🇵',temp:22},{city:'Zurich',flag:'🇨🇭',temp:10},{city:'Sydney',flag:'🇦🇺',temp:20}
  ];
  $('cuacaContent').innerHTML = `<div class="grid-3">${weather.map(w => `<div class="info-box"><div class="label">${w.flag} ${w.city}</div><div class="val gold" style="font-size:22px">${w.temp}°C</div></div>`).join('')}</div>`;
}

function renderCrypto() {
  $('cryptoContent').innerHTML = `<div class="kpi-grid">
    <div class="kpi"><div class="label">Total Value</div><div class="value gold">RM 1.28B</div></div>
    <div class="kpi"><div class="label">Coins</div><div class="value cyan">8 Active</div></div>
  </div>${table(["Symbol","Nama","Jumlah","Harga","Change","Nilai"], DATA.crypto.map(c => [c.sym, c.name, c.amount, '$'+c.price, (c.change>=0?'▲':'▼')+' '+Math.abs(c.change)+'%', c.value]), ["gold","cyan","","mono","","green"])}`;
}

function renderCurrency() {
  const base = 1;
  let h = '';
  Object.entries(DATA.currency).forEach(([code, c]) => {
    if (code === 'MYR') return;
    h += `<div class="info-box"><div style="display:flex;justify-content:space-between"><div><div class="label">${c.flag} ${code}</div><div style="font-size:11px;color:var(--muted)">${c.name}</div></div><div class="val gold">${c.rate.toFixed(4)}</div></div></div>`;
  });
  $('currencyContent').innerHTML = `<div class="kpi-grid">
    <div class="kpi"><div class="label">Base</div><div class="value gold">MYR</div></div>
    <div class="kpi"><div class="label">Currencies</div><div class="value cyan">${Object.keys(DATA.currency).length}</div></div>
  </div><div class="grid-3">${h}</div>`;
}

function renderForex() {
  const pairs = [
    {pair:'MYRUSD',bid:0.2134},{pair:'MYRSGD',bid:0.2847},{pair:'MYREUR',bid:0.1972},
    {pair:'MYRGBP',bid:0.1685},{pair:'MYRJPY',bid:32.84},{pair:'MYRCNY',bid:1.5428}
  ];
  $('forexContent').innerHTML = table(["Pair","Bid","Change"], pairs.map(p => [p.pair, p.bid, '±'+(Math.random()*0.5).toFixed(2)+'%']), ["gold","cyan",""]);
}

function renderConverter() {
  $('converterContent').innerHTML = `
    <div class="grid-2">
      <div class="info-box"><div class="label">Amount</div><input type="number" id="convAmount" value="1000" style="width:100%;padding:10px;margin-top:4px;background:var(--card);border:1px solid var(--border);border-radius:6px;color:#fff" oninput="doConvert()"></div>
      <div class="info-box"><div class="label">From → To</div>
        <select id="convFrom" onchange="doConvert()" style="width:48%;padding:8px;margin-top:4px;background:var(--card);border:1px solid var(--border);border-radius:6px;color:#fff">
          ${Object.entries(DATA.currency).map(([k,v]) => `<option value="${k}">${v.flag} ${k}</option>`).join('')}
        </select>
        <select id="convTo" onchange="doConvert()" style="width:48%;padding:8px;margin-top:4px;background:var(--card);border:1px solid var(--border);border-radius:6px;color:#fff">
          ${Object.entries(DATA.currency).map(([k,v]) => `<option value="${k}" ${k==='USD'?'selected':''}>${v.flag} ${k}</option>`).join('')}
        </select>
      </div>
    </div>
    <div class="hash-box"><div class="label">HASIL</div><div class="hash" id="convResult">—</div></div>
  `;
  doConvert();
}

function doConvert() {
  const amount = parseFloat($('convAmount').value) || 0;
  const from = $('convFrom').value;
  const to = $('convTo').value;
  const rate = DATA.currency[to].rate / DATA.currency[from].rate;
  $('convResult').textContent = `${(amount * rate).toLocaleString(undefined,{maximumFractionDigits:4})} ${to}`;
}

function renderMulticurrency() {
  const portfolio = [
    {code:'MYR',amount:284792910,desc:'GRAN Tanah + Cash'},
    {code:'SGD',amount:147000000,desc:'GRAN APAC Hub'},
    {code:'USD',amount:259624440,desc:'BTC Holdings'},
    {code:'GBP',amount:105000000,desc:'GRAN London'},
    {code:'AED',amount:102000000,desc:'GRAN Dubai'},
    {code:'JPY',amount:74000000,desc:'GRAN Tokyo'},
    {code:'CHF',amount:63000000,desc:'GRAN Zurich'},
    {code:'AUD',amount:74000000,desc:'GRAN Sydney'}
  ];
  const total = portfolio.reduce((a,p) => a + p.amount, 0);
  $('multicurrencyContent').innerHTML = `<div class="kpi-grid">
    <div class="kpi"><div class="label">Total Portfolio</div><div class="value gold">RM 1.17B</div></div>
    <div class="kpi"><div class="label">Currencies</div><div class="value cyan">${portfolio.length}</div></div>
  </div>${table(["Currency","Amount (RM)","Description","%"], portfolio.map(p => [p.code, p.amount.toLocaleString(), p.desc, (p.amount/total*100).toFixed(2)+'%']), ["gold","cyan","muted","green"])}`;
}

function renderStock() {
  const stocks = [
    {sym:'SGAE',name:'SGAE Pre-IPO',price:1.20,change:+0.15},
    {sym:'MAYBANK',name:'Maybank',price:10.24,change:+0.22},
    {sym:'NVDA',name:'NVIDIA',price:142.85,change:+3.42},
    {sym:'AAPL',name:'Apple',price:228.42,change:+1.24},
    {sym:'BTC',name:'Bitcoin',price:64104.80,change:+2.34}
  ];
  $('stockContent').innerHTML = table(["Symbol","Nama","Harga","Change"], stocks.map(s => [s.sym, s.name, s.price, (s.change>=0?'▲':'▼')+' '+Math.abs(s.change)+'%']), ["gold","cyan","mono","green"]);
}

function renderBlockchain() {
  $('blockchainContent').innerHTML = `<div class="kpi-grid">
    <div class="kpi"><div class="label">Block Height</div><div class="value gold">#847,995</div></div>
    <div class="kpi"><div class="label">Network</div><div class="value orange">Bitcoin</div></div>
    <div class="kpi"><div class="label">Algorithm</div><div class="value cyan">SHA-256</div></div>
    <div class="kpi"><div class="label">Difficulty</div><div class="value green">84.42 T</div></div>
  </div><div class="hash-box"><div class="label">🔐 SHA-256</div><div class="hash">${DATA.identiti.sha256}</div></div>`;
}

function renderDuniaku() {
  $('duniakuContent').innerHTML = `<div class="kpi-grid">
    <div class="kpi"><div class="label">Baki</div><div class="value gold">RM 500M</div></div>
    <div class="kpi"><div class="label">ID</div><div class="value cyan">DUNIAKU-MSI-7734</div></div>
    <div class="kpi"><div class="label">Transaksi</div><div class="value green">5</div></div>
  </div>`;
}

function renderIPData() {
  const ip = {ip:'203.0.113.5',country:'Malaysia',region:'Kedah',city:'Sungai Petani',isp:'TM Net',org:'Sazwan Digital',lat:5.647,lon:100.487,timezone:'Asia/Kuala_Lumpur',zip:'08000',as:'AS4788 TMNET'};
  $('ipdataContent').innerHTML = table(["Medan","Nilai"], Object.entries(ip).map(([k,v]) => [k, v]), ["muted","gold"]);
}

function renderAPI() {
  const groups = ['Ledger','AI/Python','Gemini','FPX','Satellite','Family','GRAN','MyIPO','WebSocket'];
  $('apiContent').innerHTML = `<div class="kpi-grid"><div class="kpi"><div class="label">Total</div><div class="value cyan">42</div></div><div class="kpi"><div class="label">Groups</div><div class="value gold">${groups.length}</div></div><div class="kpi"><div class="label">WebSocket</div><div class="value purple">4</div></div></div>` + groups.map(g => `<div class="info-box"><strong>${g}</strong></div>`).join('');
}

function renderDNS() {
  $('dnsContent').innerHTML = table(["Perkhidmatan","Endpoint","Status"], [
    ["DNS over HTTPS","dns-query.msi-sazwan.digital","✅ Active"],
    ["DNS API","dns-api.msi-sazwan.digital","✅ RESTful"],
    ["Quad9","9.9.9.9","✅ Connected"],
    ["DNSSEC","msi-sazwan.digital","✅ Enabled"]
  ], ["cyan","mono","green"]);
}

function renderMyIPO() {
  $('myipoContent').innerHTML = `<div class="kpi-grid">
    <div class="kpi"><div class="label">Paten</div><div class="value cyan">6</div></div>
    <div class="kpi"><div class="label">TM</div><div class="value gold">7</div></div>
    <div class="kpi"><div class="label">Reka Bentuk</div><div class="value green">5</div></div>
    <div class="kpi"><div class="label">Hak Cipta</div><div class="value purple">8</div></div>
    <div class="kpi"><div class="label">GI</div><div class="value orange">8</div></div>
  </div><div class="info-box"><strong>Total: 34+ Pendaftaran IP</strong></div>`;
}

function renderSijil() {
  $('sijilContent').innerHTML = `<div class="kpi-grid"><div class="kpi"><div class="label">Total</div><div class="value gold">245</div></div><div class="kpi"><div class="label">Kategori</div><div class="value cyan">16</div></div></div>${table(["Kategori","Contoh"], [["AI & ML","Google ML, AWS AI/ML"],["Cyber Security","CISSP, CEH, OSCP"],["Cloud","Azure Architect, GCP"],["Blockchain","CBSP, Bitcoin Pro"],["Military","ATM Cyber, NATO"]], ["cyan",""])}`;
}

function renderNegara() {
  $('negaraContent').innerHTML = `<div class="kpi-grid"><div class="kpi"><div class="label">Total</div><div class="value cyan">205</div></div><div class="kpi"><div class="label">MoU</div><div class="value gold">6</div></div></div>${table(["Kod","Negara","Flag"], DATA.countries, ["cyan","",""])}`;
}

function renderKeselamatan() {
  const layers = [
    ['SEC-001','WAF','142 rules'],['SEC-002','DDoS Shield','Cloudflare'],
    ['SEC-003','Zero Trust','84 policies'],['SEC-004','MFA','TOTP+HW'],
    ['SEC-005','Encryption','AES-256-GCM'],['SEC-006','TLS 1.3','PFS'],
    ['SEC-007','Post-Quantum','Kyber+Dilithium'],['SEC-008','SHA-256','Blockchain'],
    ['SEC-009','SOC 2','Deloitte'],['SEC-010','ISO 27001','BSI']
  ];
  $('keselamatanContent').innerHTML = table(["ID","Lapisan","Detail"], layers, ["mono","red",""]);
}

function renderThreat() {
  $('threatContent').innerHTML = `<div class="kpi-grid">
    <div class="kpi"><div class="label">APT Groups</div><div class="value red">24</div></div>
    <div class="kpi"><div class="label">IOCs</div><div class="value gold">1.28M</div></div>
    <div class="kpi"><div class="label">CVEs</div><div class="value orange">847</div></div>
    <div class="kpi"><div class="label">Blocked</div><div class="value green">12,847</div></div>
  </div>`;
}

function renderNetwork() {
  $('networkContent').innerHTML = `<div class="kpi-grid">
    <div class="kpi"><div class="label">Data Centers</div><div class="value gold">12</div></div>
    <div class="kpi"><div class="label">PoPs</div><div class="value cyan">14</div></div>
    <div class="kpi"><div class="label">Ground Stations</div><div class="value purple">6</div></div>
  </div>`;
}

function renderRaw() {
  $('rawContent').textContent = JSON.stringify(DATA, null, 2);
}

// ==================================================================
//  TAB FILTERING
// ==================================================================
function filterTab(cat) {
  document.querySelectorAll('#catTabs .tab').forEach(t => t.classList.remove('active'));
  event.target.classList.add('active');
  document.querySelectorAll('#mainTabs .tab').forEach(t => {
    if (cat === 'all' || t.dataset.cat === cat) {
      t.style.display = '';
    } else {
      t.style.display = 'none';
    }
  });
}

// ==================================================================
//  TAB SWITCHING
// ==================================================================
document.querySelectorAll('#mainTabs .tab').forEach(tab => {
  tab.addEventListener('click', () => {
    document.querySelectorAll('#mainTabs .tab').forEach(t => t.classList.remove('active'));
    document.querySelectorAll('.section').forEach(s => s.classList.remove('active'));
    tab.classList.add('active');
    const el = $(tab.dataset.tab);
    if (el) el.classList.add('active');
    if (tab.dataset.tab === 'peta') setTimeout(initMap, 100);
    if (tab.dataset.tab === 'globe3d') setTimeout(initGlobe, 300);
  });
});

// ==================================================================
//  MAP
// ==================================================================
let earthMap;
function initMap() {
  if (earthMap) { setTimeout(() => earthMap.invalidateSize(), 200); return; }
  earthMap = L.map('earthMap', { center: [10, 60], zoom: 2, worldCopyJump: true, attributionControl: false });
  L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png', { maxZoom: 19, subdomains: 'abcd' }).addTo(earthMap);
  DATA.gran_tanah.forEach(g => L.circleMarker([g.lat, g.lng], { radius: 7, color: '#34d399', fillColor: '#34d399', fillOpacity: .8, weight: 2 }).bindPopup(`<div style="color:#e8eaed"><strong style="color:#34d399">🌱 ${g.name}</strong><br>${g.flag} ${g.state}<br><b>${g.value}</b></div>`).addTo(earthMap));
  DATA.gran_global.forEach(g => L.circleMarker([g.lat, g.lng], { radius: 6, color: '#fbbf24', fillColor: '#fbbf24', fillOpacity: .7, weight: 2 }).bindPopup(`<div style="color:#e8eaed"><strong style="color:#fbbf24">🌍 ${g.name}</strong><br>${g.flag} ${g.country}<br><b>${g.value}</b></div>`).addTo(earthMap));
  L.circleMarker([5.6470, 100.4874], { radius: 12, color: '#ec4899', fillColor: '#ec4899', fillOpacity: .9, weight: 3 }).bindPopup(`<div style="color:#e8eaed"><strong style="color:#ec4899">👨‍👩‍👧‍👦 Rumah Keluarga</strong></div>`).addTo(earthMap);
}

// ==================================================================
//  3D GLOBE
// ==================================================================
let globeInit = false;
function initGlobe() {
  if (globeInit) return;
  globeInit = true;
  const container = $('globeContainer');
  if (!container) return;
  const w = container.clientWidth, h = container.clientHeight;
  const scene = new THREE.Scene();
  const camera = new THREE.PerspectiveCamera(45, w/h, 0.1, 1000);
  camera.position.set(0, 0, 3.5);
  const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
  renderer.setSize(w, h);
  container.appendChild(renderer.domElement);
  const controls = new THREE.OrbitControls(camera, renderer.domElement);
  controls.enableDamping = true;
  scene.add(new THREE.AmbientLight(0x404060, 1));
  const dLight = new THREE.DirectionalLight(0xffffff, 1.2);
  dLight.position.set(5, 3, 5);
  scene.add(dLight);
  const globe = new THREE.Group();
  scene.add(globe);
  const earthGeo = new THREE.SphereGeometry(1, 64, 64);
  const tex = new THREE.TextureLoader().load('https://unpkg.com/three-globe/example/img/earth-blue-marble.jpg');
  globe.add(new THREE.Mesh(earthGeo, new THREE.MeshPhongMaterial({ map: tex, emissive: 0x0a1a3f, emissiveIntensity: 0.2 })));
  const wireGeo = new THREE.SphereGeometry(1.002, 32, 32);
  const wireMat = new THREE.MeshBasicMaterial({ color: 0x00e5ff, wireframe: true, transparent: true, opacity: 0.06 });
  globe.add(new THREE.Mesh(wireGeo, wireMat));
  function toXYZ(lat, lng, r) {
    const phi = (90 - lat) * Math.PI / 180;
    const theta = (lng + 180) * Math.PI / 180;
    return new THREE.Vector3(-r * Math.sin(phi) * Math.cos(theta), r * Math.cos(phi), r * Math.sin(phi) * Math.sin(theta));
  }
  DATA.gran_tanah.forEach(g => {
    const pos = toXYZ(g.lat, g.lng, 1.02);
    const m = new THREE.Mesh(new THREE.SphereGeometry(0.025, 8, 8), new THREE.MeshBasicMaterial({ color: 0x34d399 }));
    m.position.copy(pos);
    globe.add(m);
  });
  DATA.gran_global.forEach(g => {
    const pos = toXYZ(g.lat, g.lng, 1.02);
    const m = new THREE.Mesh(new THREE.SphereGeometry(0.02, 8, 8), new THREE.MeshBasicMaterial({ color: 0xfbbf24 }));
    m.position.copy(pos);
    globe.add(m);
  });
  function animate() {
    requestAnimationFrame(animate);
    globe.rotation.y += 0.0015;
    controls.update();
    renderer.render(scene, camera);
  }
  animate();
}

// ==================================================================
//  EXPORT
// ==================================================================
function exportData(format) {
  const ts = new Date().toISOString().slice(0,10);
  if (format === 'json') {
    const blob = new Blob([JSON.stringify(DATA, null, 2)], { type: 'application/json' });
    downloadBlob(blob, `SGAE_${ts}.json`);
  } else if (format === 'csv') {
    let csv = 'Category,Name,Value\n';
    DATA.gran_tanah.forEach(g => csv += `GRAN Tanah,${g.name},${g.value}\n`);
    DATA.gran_global.forEach(g => csv += `GRAN Global,${g.name},${g.value}\n`);
    downloadBlob(new Blob([csv], {type:'text/csv'}), `SGAE_${ts}.csv`);
  } else if (format === 'excel') {
    const wb = XLSX.utils.book_new();
    XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(DATA.gran_tanah), 'GRAN Tanah');
    XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(DATA.gran_global), 'GRAN Global');
    XLSX.writeFile(wb, `SGAE_${ts}.xlsx`);
  } else if (format === 'pdf') {
    const { jsPDF } = window.jspdf;
    const doc = new jsPDF();
    doc.setFontSize(18);
    doc.text('SGAE 2.0 Sovereign Report', 14, 20);
    doc.setFontSize(10);
    doc.text('MUHAMAD SAZWAN BIN ISMAIL · MSI-2026-07734', 14, 28);
    doc.autoTable({ startY: 40, head: [['GRAN','Nama','Nilai']], body: [...DATA.gran_tanah.map(g=>['Tanah',g.name,g.value]), ...DATA.gran_global.map(g=>['Global',g.name,g.value])], headStyles: { fillColor: [0,229,255] } });
    doc.save(`SGAE_${ts}.pdf`);
  }
}
function downloadBlob(blob, filename) {
  const a = document.createElement('a');
  a.href = URL.createObjectURL(blob);
  a.download = filename;
  a.click();
}

// ==================================================================
//  API FETCH
// ==================================================================
async function fetchData(manual = false) {
  const status = $('apiStatus');
  status.innerHTML = '<span class="spinner"></span> Menyambung...';
  try {
    const controller = new AbortController();
    const t = setTimeout(() => controller.abort(), 5000);
    const res = await fetch('http://localhost:8000/all', { signal: controller.signal });
    clearTimeout(t);
    if (!res.ok) throw new Error('HTTP ' + res.status);
    status.innerHTML = '✅ API Connected';
    status.className = 'ok';
    $('lastUpdate').textContent = 'Kemas kini: ' + new Date().toLocaleString('ms-MY');
    if (manual) alert('✅ API Connected!');
  } catch (err) {
    status.innerHTML = '⚠️ API Offline · Guna data terbina dalam';
    status.className = 'err';
    $('lastUpdate').textContent = 'Kemas kini: ' + new Date().toLocaleString('ms-MY');
  }
}

// ==================================================================
//  RENDER ALL
// ==================================================================
function renderAll() {
  renderKPI();
  renderIdentiti();
  renderKeluarga();
  renderGran();
  renderGelombang();
  renderSatelit();
  renderCuaca();
  renderCrypto();
  renderCurrency();
  renderForex();
  renderConverter();
  renderMulticurrency();
  renderStock();
  renderBlockchain();
  renderDuniaku();
  renderIPData();
  renderAPI();
  renderDNS();
  renderMyIPO();
  renderSijil();
  renderNegara();
  renderKeselamatan();
  renderThreat();
  renderNetwork();
  renderRaw();
}

// ==================================================================
//  INIT
// ==================================================================
document.addEventListener('DOMContentLoaded', () => {
  renderAll();
  fetchData(false);
  setInterval(() => fetchData(false), 60000);
  console.log('%c🌏 SGAE 2.0 MASTER v49 · Complete Unified System', 'color:#ffd700;font-size:20px;font-weight:900');
  console.log('%c👑 MUHAMAD SAZWAN BIN ISMAIL · MSI-2026-07734', 'color:#00e5ff;font-size:14px;font-weight:700');
  console.log('%c📊 75 Tab · 42 API · 24 GRAN · 6 Satelit · 8 Crypto', 'color:#a855f7;font-size:12px;font-weight:700');
});
</script>
</body>
</html>
@Sazwanismail Sazwanismail self-assigned this Sep 23, 2026
@Sazwanismail Sazwanismail added duplicate This issue or pull request already exists good first issue Good for newcomers Perfect zass Kemenangan Semuanya Untuk Celaka Bewak Media Sosial media Windows hunter Projects personal Strategic Kecekapan semulajadi size:XXL This PR changes 1000+ lines, ignoring generated files size:M This PR changes 30-99 lines, ignoring generated files labels Sep 23, 2026
@changeset-bot

changeset-bot Bot commented Sep 23, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 66ea968

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@Sazwanismail Sazwanismail added the size:XL This PR changes 500-999 lines, ignoring generated files label Sep 23, 2026
@codeant-ai

codeant-ai Bot commented Sep 23, 2026 •

Copy link
Copy Markdown

🤖 CodeAnt AI — Review Status

Status Commit Started (UTC) Finished (UTC)
✅ Reviewed your PR 66ea968 Sep 23, 2026 · 16:01 16:01

@codeant-ai

codeant-ai Bot commented Sep 23, 2026

Copy link
Copy Markdown

Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

This was linked to issues Sep 23, 2026
@Sazwanismail
Sazwanismail merged commit b620943 into Sazwanismail-patch-20 Sep 23, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

duplicate This issue or pull request already exists good first issue Good for newcomers Media Sosial media Perfect zass Kemenangan Semuanya Untuk Celaka Bewak size:M This PR changes 30-99 lines, ignoring generated files size:XL This PR changes 500-999 lines, ignoring generated files size:XXL This PR changes 1000+ lines, ignoring generated files Strategic Kecekapan semulajadi Windows hunter Projects personal

Projects

Development

Successfully merging this pull request may close these issues.

[Draft] New Issue in codespaces-react Profile Beta

1 participant