Code_runner / index (1).html
Dktattooz's picture
Upload 105 files
3cb8048 verified
Raw
History Blame Contribute Delete
31.1 kB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Enhanced ID Generator Tool</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Tailwind CSS -->
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<!-- Font Awesome -->
<link href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.5.2/css/all.min.css" rel="stylesheet">
<!-- Google Fonts -->
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap" rel="stylesheet">
<!-- Chart.js -->
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.3/dist/chart.umd.min.js"></script>
<style>
html, body { font-family: 'Roboto', sans-serif; background: #f3f4f6; color: #222;}
.shadow-card { box-shadow: 0 6px 24px rgb(0 0 0 / 7%),0 1.5px 5px rgb(0 0 0 / 4%);}
.admin-divider {border-bottom: 1.5px solid #e5e7eb;}
.fa {vertical-align: middle;}
/* Hide scrollbars for PDF export */
::-webkit-scrollbar {display: none;}
* { scrollbar-width: none; -ms-overflow-style: none;}
/* Remove number input arrows for consistency in PDF export*/
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
input[type=number] { -moz-appearance: textfield;}
/* Card table for generated list */
#generatedCardsTable th, #generatedCardsTable td {padding: 0.25rem 0.5rem; border-right: 1px solid #eee;}
#generatedCardsTable tr {border-top: 1px solid #eee;}
/* Hide file input for a better button */
#importFile {display:none;}
.table-wrap {overflow-x: auto;}
@media print {
html, body {background: white;}
.print-hide {display: none !important;}
}
</style>
</head>
<body>
<!-- HEADER -->
<header class="flex items-center bg-gradient-to-r from-green-400 to-green-200 p-4 shadow-lg">
<div class="flex items-center space-x-3">
<i class="fa fa-id-card text-2xl text-white"></i>
<span class="text-2xl font-bold text-white tracking-wide">Fake ID Data Tools+</span>
</div>
<button onclick="showAdmin(true)" class="ml-auto px-6 py-2 rounded bg-black text-white font-semibold shadow-card print-hide transition hover:bg-green-800 text-sm"><i class="fas fa-user-cog mr-2"></i>Admin Panel</button>
</header>
<main class="max-w-5xl mx-auto p-4 space-y-6 bg-white mt-6 rounded-lg shadow-card">
<!-- CARD GENERATION -->
<section>
<div class="flex items-center mb-2">
<i class="fa fa-credit-card text-green-600 mr-2"></i>
<h2 class="text-xl font-bold text-green-800">Card Generation</h2>
</div>
<div class="rounded bg-green-50 p-4 shadow-card border border-green-200">
<div class="grid md:grid-cols-6 sm:grid-cols-2 grid-cols-1 gap-3 mb-4">
<div><label class="block text-xs mb-1 font-semibold">Card Holder Name</label><input id="holderInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Random if blank"></div>
<div><label class="block text-xs mb-1 font-semibold">Phone Number</label><input id="phoneInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Random if blank"></div>
<div><label class="block text-xs mb-1 font-semibold">Date of Birth</label><input id="dobInput" type="date" class="w-full rounded border px-2 py-1"></div>
<div><label class="block text-xs mb-1 font-semibold">Number to Generate <span class="text-gray-400">(max 5000)</span></label><input id="qtyInput" min="1" max="5000" type="number" value="1" class="w-full rounded border px-2 py-1"></div>
<div><label class="block text-xs mb-1 font-semibold">BIN Source</label><input id="binInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Leave blank for random"></div>
<div><label class="block text-xs mb-1 font-semibold">Bank Name</label><input id="bankInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Optional"></div>
</div>
<div class="grid md:grid-cols-3 sm:grid-cols-2 grid-cols-1 gap-3 mb-3">
<div><label class="block text-xs mb-1 font-semibold">Email</label><input id="emailInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Auto-generated if blank"></div>
<div><label class="block text-xs mb-1 font-semibold">Address</label><input id="addressInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Optional"></div>
<div class="flex items-center mt-7">
<input id="randBinCheck" type="checkbox" class="mr-2"><label for="randBinCheck" class="text-xs font-semibold">System Random BIN</label>
</div>
</div>
<div class="flex flex-wrap space-x-2 mt-2 mb-2 items-center">
<button id="generateBtn" class="bg-green-600 hover:bg-green-700 text-white font-bold rounded-md px-4 py-2 shadow-card flex items-center mb-2"><i class="fa-solid fa-circle-plus mr-2"></i>Generate Cards</button>
<label for="importFile" class="bg-blue-400 hover:bg-blue-600 text-white font-bold rounded-md px-4 py-2 shadow-card flex items-center cursor-pointer mb-2"><i class="fa fa-file-upload mr-2"></i>Import Data</label>
<input type="file" id="importFile" accept=".txt,.csv,.json,.pdf">
<button onclick="clearHistory()" class="bg-red-400 hover:bg-red-600 text-white font-bold rounded-md px-4 py-2 shadow-card flex items-center mb-2"><i class="fa fa-trash mr-2"></i>Clear History</button>
<button onclick="exportHistory('csv')" class="bg-gray-800 hover:bg-gray-900 text-white font-bold rounded-md px-3 py-2 shadow-card flex items-center text-xs mb-2"><i class="fa fa-file-csv mr-2"></i>Export CSV</button>
<button onclick="exportHistory('json')" class="bg-gray-800 hover:bg-gray-900 text-white font-bold rounded-md px-3 py-2 shadow-card flex items-center text-xs mb-2"><i class="fa fa-file-code mr-2"></i>Export JSON</button>
<button onclick="exportHistory('txt')" class="bg-gray-800 hover:bg-gray-900 text-white font-bold rounded-md px-3 py-2 shadow-card flex items-center text-xs mb-2"><i class="fa fa-file-lines mr-2"></i>Export TXT</button>
<button onclick="copyAllCards()" class="bg-purple-500 hover:bg-purple-600 text-white font-bold rounded-md px-3 py-2 shadow-card flex items-center text-xs mb-2"><i class="fa fa-copy mr-2"></i>Copy All</button>
</div>
</div>
</section>
<!-- GENERATED CARDS HISTORY -->
<section>
<h3 class="text-lg font-semibold mt-8 mb-1 text-blue-800 flex items-center"><i class="fa fa-history mr-2"></i>Generated Cards History</h3>
<div class="table-wrap border rounded bg-blue-50 border-blue-200 shadow-card pb-2 pt-2 px-2">
<input id="historySearch" type="text" class="w-full mb-2 rounded px-2 py-1 border border-blue-100" placeholder="Search History (Name, Card, Bank, etc.)..." oninput="filterHistory()">
<table id="generatedCardsTable" class="w-full text-xs border-collapse">
<thead>
<tr class="bg-blue-100">
<th>#</th>
<th>Card Holder</th>
<th>Number</th>
<th>MM/YY</th>
<th>CVV</th>
<th>Bank</th>
<th>BIN</th>
<th>Email</th>
<th>IP</th>
<th>Status</th>
</tr>
</thead>
<tbody id="cardHistory"></tbody>
</table>
<div id="noCardMsg" class="text-center text-gray-400 py-4">No generated cards yet.</div>
</div>
</section>
<!-- CARD VALIDATOR -->
<section id="validator-section">
<h3 class="text-lg font-semibold mt-6 mb-3 flex items-center text-yellow-700"><i class="fa fa-magnifying-glass mr-2"></i>Card Validator (Simulated)</h3>
<div class="flex flex-col sm:flex-row items-center mb-2">
<input id="validateCardNumber" type="text" class="w-full sm:w-1/2 rounded border px-2 py-2 mr-4 mb-2 sm:mb-0" placeholder="Paste or type card number">
<button onclick="validateCard()" class="bg-yellow-500 hover:bg-yellow-600 text-white font-bold py-2 px-6 rounded shadow-card mr-2 flex items-center"><i class="fa fa-check mr-2"></i>Validate</button>
<button onclick="autoValidateCard()" class="bg-yellow-200 text-black hover:bg-yellow-300 rounded shadow px-3 py-2 font-bold flex items-center" title="Auto Validate"><i class="fa fa-bolt"></i> Auto</button>
</div>
<div id="validateStatus" class="font-bold mt-2 mb-3 ml-1"></div>
</section>
<!-- SIMULATED ANALYZERS -->
<section>
<h3 class="text-lg font-semibold mt-8 mb-3 flex items-center text-indigo-700"><i class="fa fa-flask mr-2"></i>Simulated Analyzers</h3>
<div class="grid md:grid-cols-3 gap-3">
<!-- Fraud Score Simulator -->
<div class="bg-indigo-50 border rounded shadow-card p-3">
<div class="flex items-center mb-1 text-indigo-700 font-semibold"><i class="fa fa-shield-halved mr-2"></i>Fraud Score Simulator</div>
<div class="flex mb-2">
<input id="fraudCardInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Enter card number">
<button onclick="analyzeFraudScore()" class="ml-2 bg-indigo-600 hover:bg-indigo-700 text-white rounded px-3 flex items-center"><i class="fa fa-vial mr-2"></i>Analyze</button>
<button onclick="autoAnalyzeFraud()" class="ml-2 bg-indigo-300 hover:bg-indigo-400 text-black rounded px-2 flex items-center" title="Auto Analyze"><i class="fa fa-bolt"></i></button>
</div>
<div id="fraudScoreResult" class="mt-2 font-bold"></div>
</div>
<!-- IP Address Simulator -->
<div class="bg-blue-50 border rounded shadow-card p-3">
<div class="flex items-center mb-1 text-blue-700 font-semibold"><i class="fa fa-globe mr-2"></i>IP Address Simulator</div>
<div class="flex mb-2">
<input id="ipInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Enter IPv4 or IPv6">
<button onclick="analyzeIP()" class="ml-2 bg-blue-600 hover:bg-blue-700 text-white rounded px-3 flex items-center"><i class="fa fa-network-wired mr-2"></i>Analyze</button>
<button onclick="autoAnalyzeIP()" class="ml-2 bg-blue-300 hover:bg-blue-400 text-black rounded px-2 flex items-center" title="Auto Analyze"><i class="fa fa-bolt"></i></button>
</div>
<div id="ipResult" class="mt-2 font-bold"></div>
</div>
<!-- Email Analyzer Simulator -->
<div class="bg-green-50 border rounded shadow-card p-3">
<div class="flex items-center mb-1 text-green-800 font-semibold"><i class="fa fa-envelope mr-2"></i>Email Analyzer Simulator</div>
<div class="flex mb-2">
<input id="emailAnalyzerInput" type="text" class="w-full rounded border px-2 py-1" placeholder="Enter email address">
<button onclick="analyzeEmail()" class="ml-2 bg-green-700 hover:bg-green-800 text-white rounded px-3 flex items-center"><i class="fa fa-envelope-open-text mr-2"></i>Analyze</button>
<button onclick="autoAnalyzeEmail()" class="ml-2 bg-green-200 hover:bg-green-300 text-black rounded px-2 flex items-center" title="Auto Analyze"><i class="fa fa-bolt"></i></button>
</div>
<div id="emailResult" class="mt-2 font-bold"></div>
</div>
</div>
</section>
<!-- SSN TOOLS -->
<section>
<h3 class="text-lg font-semibold mt-8 mb-3 flex items-center text-blue-900"><i class="fa fa-address-card mr-2"></i>SSN Tools (Fake Data)</h3>
<div class="flex flex-col md:flex-row gap-4 mb-2">
<!-- Fake SSN Generator -->
<div class="bg-blue-100 border rounded shadow-card p-3 flex-1">
<div class="flex items-center mb-2 text-blue-900 font-semibold"><i class="fa fa-magic mr-2"></i>Fake SSN Generator</div>
<div class="flex mb-2 items-center gap-2">
<input id="ssnQtyInput" type="number" min="1" max="5000" value="1" class="rounded border px-2 py-1 w-20">
<button onclick="generateSSNs()" class="bg-blue-700 hover:bg-blue-900 text-white rounded px-3 flex items-center font-bold"><i class="fa fa-plus mr-2"></i>Generate SSNs</button>
<button onclick="autoGenerateSSN()" class="bg-blue-300 hover:bg-blue-400 text-black rounded px-2 flex items-center" title="Auto Generate"><i class="fa fa-bolt"></i></button>
</div>
<div>
<textarea id="ssnGenResult" class="w-full h-16 rounded px-2 py-1 border" readonly></textarea>
</div>
</div>
<!-- SSN Validator -->
<div class="bg-blue-100 border rounded shadow-card p-3 flex-1">
<div class="flex items-center mb-2 text-blue-900 font-semibold"><i class="fa fa-spell-check mr-2"></i>SSN Validator (Basic)</div>
<div class="flex mb-2 items-center gap-2">
<input id="ssnValidateInput" type="text" class="rounded border px-2 py-1 w-48" placeholder="SSN (XXX-XX-XXXX)">
<button onclick="validateSSN()" class="bg-blue-700 hover:bg-blue-900 text-white rounded px-3 flex items-center font-bold"><i class="fa fa-check mr-2"></i>Validate</button>
<button onclick="autoValidateSSN()" class="bg-blue-300 hover:bg-blue-400 text-black rounded px-2 flex items-center" title="Auto Validate"><i class="fa fa-bolt"></i></button>
</div>
<div id="ssnValidateResult" class="mt-2 font-bold"></div>
</div>
</div>
<div class="text-xs text-gray-600 ml-1"><i class="fa fa-info-circle text-blue-400"></i> Generated SSNs are <b>fake</b>, follow known allocation patterns, but are not real. Validation is basic format/rule check only.</div>
</section>
</main>
<!-- ADMIN PANEL MODAL -->
<div id="adminModal" class="hidden fixed inset-0 z-50 bg-black bg-opacity-40 flex justify-center items-center print-hide">
<div class="bg-white rounded-lg p-6 w-full max-w-2xl shadow-card relative">
<button onclick="showAdmin(false)" class="absolute top-3 right-4 text-gray-700 hover:text-red-800 text-lg font-bold"><i class="fa fa-times"></i></button>
<div class="text-2xl font-bold mb-1 text-green-800 flex items-center"><i class="fa fa-user-cog mr-2"></i>Admin Panel</div>
<div class="admin-divider mb-4"></div>
<div class="grid md:grid-cols-2 gap-6 mb-6">
<div>
<label class="block mb-1 font-bold">Live Card Generation Stats</label>
<ul class="text-green-800 font-semibold space-y-2 text-sm list-inside list-disc">
<li><span>Cards generated (this session): </span><span id="adminCardsCount">0</span></li>
<li><span>Unique BINs imported: </span><span id="adminBinsCount">0</span></li>
<li><span>Saved emails: </span><span id="adminEmailsCount">0</span></li>
<li><span>Uploaded IPs: </span><span id="adminIPsCount">0</span></li>
</ul>
</div>
<div>
<label class="block mb-1 font-bold">Recently Imported Data</label>
<div class="bg-gray-100 rounded px-3 py-2 h-32 overflow-y-auto text-xs" id="adminImports"></div>
</div>
</div>
<div>
<label class="block mb-1 font-bold">Card Generation Timeline</label>
<canvas id="cardGenChart" height="60"></canvas>
</div>
</div>
</div>
<!-- FOOTER -->
<footer class="w-full text-xs text-center py-5 mt-10 text-gray-500 print-hide">
© 2025 Fake ID Data Tools+ &mdash; Data is for testing and educational purposes only.<br>
Design optimized for browser PDF export - use browser’s print-to-PDF for full content.
</footer>
<script>
// DATA STORAGE
let cards = JSON.parse(localStorage.getItem("cards")||"[]");
let importedBins = JSON.parse(localStorage.getItem("importedBins")||"[]");
let importedEmails = JSON.parse(localStorage.getItem("importedEmails")||"[]");
let importedIPs = JSON.parse(localStorage.getItem("importedIPs")||"[]");
let genTimeline = JSON.parse(localStorage.getItem("genTimeline")||"[]"); // [{ts,count}]
// BIN SOURCES (you can expand with your own or imported)
const staticBins = [
'4539 1488', '4556 7375', '4916 7336', '4485 2847',
'5490 7559', '4621 0428', '4024 0071', '6011 9400'
];
// DOM HELPERS
function el(id) { return document.getElementById(id);}
function showAdmin(show) {
el('adminModal').style.display = show ? 'flex' : 'none';
if(show) renderAdmin();
}
// RENDER CARDS HISTORY
function renderHistory() {
let tbody = el('cardHistory');
let noCardMsg = el('noCardMsg');
tbody.innerHTML = "";
let filtered = cards;
let kw = el('historySearch').value.trim().toLowerCase();
if(kw.length) {
filtered = cards.filter(card =>
(card.name||"").toLowerCase().includes(kw) ||
(card.number||"").toLowerCase().includes(kw) ||
(card.bank||"").toLowerCase().includes(kw) ||
(card.email||"").toLowerCase().includes(kw) ||
(card.ip||"").toLowerCase().includes(kw)
);
}
if(!filtered.length) {
noCardMsg.style.display = '';
return;
}
noCardMsg.style.display = 'none';
filtered.forEach((card, i) => {
let tr = document.createElement("tr");
tr.innerHTML = `
<td>${i+1}</td>
<td>${escapeHTML(card.name)}</td>
<td><span class="font-mono">${card.number}</span></td>
<td>${escapeHTML(card.mm)}/${escapeHTML(card.yy)}</td>
<td>${escapeHTML(card.cvv)}</td>
<td>${escapeHTML(card.bank||'-')}</td>
<td>${escapeHTML(card.bin||'-')}</td>
<td>${escapeHTML(card.email||'-')}</td>
<td>${escapeHTML(card.ip||'-')}</td>
<td>${escapeHTML(card.status||'-')}</td>
`;
tbody.appendChild(tr);
});
}
// CARD GENERATION LOGIC
el('generateBtn').onclick = function() {
let n = parseInt(el('qtyInput').value);
if(n < 1 || n > 5000 || isNaN(n)) { alert("Number to generate: Enter between 1 and 5000."); return;}
let inputBin = el('binInput').value.replace(/\s+/g, '');
let useRandomBin = el('randBinCheck').checked || !inputBin;
let bins = useRandomBin ? (staticBins.concat(importedBins)) : [inputBin];
let bankName = el('bankInput').value || '-';
let emails = [];
let ips = [];
let cardsBatch = [];
for(let i=0;i<n;i++) {
let bin = bins[Math.floor(Math.random() * bins.length)] || "400000";
let cardNumber = genCardNumberFromBin(bin.replace(/\s+/g,""));
let mm = String(Math.floor(Math.random()*12+1)).padStart(2,'0');
let y = (new Date().getFullYear()+Math.floor(Math.random()*7)+1).toString().substr(2,2);
let cvv = String(Math.floor(Math.random()*900)+100);
let name = el('holderInput').value || genRndName();
let phone = el('phoneInput').value || ("+1"+randStr(10,"0123456789"));
let email = el('emailInput').value || (genRndMail(name));
let addr = el('addressInput').value || genRndAddr();
let ip = randIP();
let status = "LIVE";
let obj = {number: cardNumber, mm, yy:y, cvv, bank:bankName, bin, name, phone, email, address:addr, ip, status};
cards.push(obj);
cardsBatch.push(obj);
emails.push(email);
ips.push(ip);
}
// Track imported
importedEmails = importedEmails.concat(emails.filter(x=>!importedEmails.includes(x)));
importedIPs = importedIPs.concat(ips.filter(x=>!importedIPs.includes(x)));
// Timeline chart
const now = new Date();
genTimeline.push({ts: now.getTime(), count: n});
localStorage.setItem("cards",JSON.stringify(cards));
localStorage.setItem("importedEmails",JSON.stringify(importedEmails));
localStorage.setItem("importedIPs",JSON.stringify(importedIPs));
localStorage.setItem("genTimeline",JSON.stringify(genTimeline));
renderHistory();
alert(`Generated ${n} cards.`);
}
function filterHistory() {renderHistory();}
function clearHistory() {
if(confirm("Clear all generated cards?")) {
cards = [];
localStorage.setItem("cards","[]");
renderHistory();
}
}
// Helper: Generate Card Number According to Luhn algorithm
function genCardNumberFromBin(bin) {
let res = bin;
for(let i=bin.length;i<15;i++) res += Math.floor(Math.random()*10);
// Luhn digit
let arr = res.split('').map(Number);
for(let i=arr.length-1;i>=0;i-=2)arr[i]*=2;
let sum = arr.join('').split('').reduce((a,c)=>a+parseInt(c),0);
let last = (10 - sum%10)%10;
return res + last;
}
function randIP() {
return [rand4(),rand4(),rand4(),rand4()].join('.');
function rand4(){ let n=Math.floor(Math.random()*254)+1; return n==127?128:n;}
}
function randStr(n, chars) {
let out = ""; let C = chars || "abcdefghijklmnopqrstuvwxyz";
for(let i=0;i<n;i++) out += C[Math.floor(Math.random()*C.length)];
return out;
}
function genRndName() {
const first = ["Alex","Dana","Taylor","Jordan","Robin","Morgan","Sam","Jesse"];
const last = ["Smith","Johnson","Lee","Walker","Cooper","Scott","Lewis","Allen"];
return first[Math.floor(Math.random()*first.length)]+" "+last[Math.floor(Math.random()*last.length)];
}
function genRndAddr() {
const streets = ["Park Ave","Maple St.","Elm Dr.","Sunset Blvd.","Oak St.","First Ave."];
return `${Math.floor(Math.random()*9999)+101} ${streets[Math.floor(Math.random()*streets.length)]}`;
}
function genRndMail(name) {
const d = ["mail.com","yahoo.com","testmail.io","example.org"];
let nick = name.replace(/\s+/g,'').toLowerCase() + randStr(2,"1234567890");
return nick+"@"+d[Math.floor(Math.random()*d.length)];
}
// CARD EXPORT
function exportHistory(fmt) {
let sep, ext, mimetype, content="";
if(!cards.length) {alert("No cards to export."); return;}
if(fmt=='csv'){
let keys = ["Card Holder","Number","MM/YY","CVV","Bank","BIN","Email","IP","Status"];
content = keys.join(",")+'\n';
cards.forEach(card=>{
content += `"${card.name}","${card.number}","${card.mm}/${card.yy}","${card.cvv}","${card.bank}","${card.bin}","${card.email}","${card.ip}","${card.status}"\n`;
});
downloadText(content,"cards.csv");
} else if(fmt=='json'){
downloadText(JSON.stringify(cards,null,2),"cards.json");
} else if(fmt=='txt'){
cards.forEach(c=>{
content+=`${c.number}|${c.mm}|${c.yy}|${c.cvv}|${c.name}|${c.email}|${c.bank}|${c.bin}|${c.ip}|${c.status}\n`;
});
downloadText(content,"cards.txt");
}
}
function downloadText(text, filename){
let a = document.createElement('a');
a.href = 'data:text/plain;charset=utf-8,'+encodeURIComponent(text);
a.download = filename; a.click();
}
function copyAllCards() {
let out = "";
cards.forEach(c=>{
out+=`${c.number}|${c.mm}|${c.yy}|${c.cvv}|${c.name}|${c.email}|${c.bank}|${c.bin}|${c.ip}|${c.status}\n`;
});
navigator.clipboard.writeText(out).then(()=>alert("All cards copied."));
}
// CARD VALIDATOR (Simulated)
function validateCard() {
let num = (el('validateCardNumber').value || "").replace(/\s+/g,'');
if(!num.match(/^\d{13,19}$/)) { showStatus("Enter a valid card number.",false); return;}
let isLuhn = luhnChk(num);
let randomStatus = Math.random()>.3 ? "LIVE" : "DEAD";
let score = Math.floor(Math.random()*60)+40;
showStatus(`${isLuhn?"Valid, ":"INVALID "} ${randomStatus}. Score:${score}/100`,isLuhn);
}
function luhnChk(num) {
let arr = num.split('').reverse().map(x=>parseInt(x));
let sum = 0;
for(let i=0;i<arr.length;i++) {
let v = arr[i];
if(i%2==1) v = v*2;
if(v>9) v-=9;
sum+=v;
}
return sum%10===0;
}
function autoValidateCard() {
if(cards.length){el('validateCardNumber').value = cards[0].number; validateCard();}
else {alert("Generate at least one card first.");}
}
function showStatus(txt, good) {
el('validateStatus').innerHTML = txt;
el('validateStatus').style.color = good?"green":"#d97706";
}
// FRAUD SCORE SIMULATOR (random)
function analyzeFraudScore() {
let num = (el('fraudCardInput').value || "").replace(/\s+/g,'');
if(!num.match(/^\d{13,19}$/)){el('fraudScoreResult').textContent = "Enter a valid card number.";return;}
let fs = Math.floor(Math.random()*40)+50;
el('fraudScoreResult').innerHTML = `Fraud Score: <span class="font-bold">${fs}</span>/100 [${fs < 65 ? "LOW" : "HIGH"}]`;
el('fraudScoreResult').style.color = fs<65?"#18590d":"#b91c1c";
}
function autoAnalyzeFraud() {
if(cards.length){el('fraudCardInput').value = cards[0].number; analyzeFraudScore();}
else {alert("Generate at least one card first.");}
}
// IP ANALYZER
function analyzeIP() {
let ip = el('ipInput').value;
if(!ip.match(/^(\d{1,3}\.){3}\d{1,3}$/)) { el('ipResult').textContent = "Enter valid IPv4"; el('ipResult').style.color='red'; return; }
let tag = Math.random() > 0.5 ? "Residential" : "Datacenter";
el('ipResult').innerHTML = `<b class="text-blue-900">${ip}</b> - Type: <span class="font-bold text-gray-700">${tag}</span>`;
el('ipResult').style.color = "#1e293b";
}
function autoAnalyzeIP() {
if(cards.length){el('ipInput').value = cards[0].ip; analyzeIP();}
else {alert("Generate at least one card first.");}
}
// EMAIL ANALYZER
function analyzeEmail() {
let e = el('emailAnalyzerInput').value || "";
let hasAt = e.includes("@") && e.length>5;
el('emailResult').textContent = !hasAt ? "Invalid email address." : (["Valid","Suspicious"][Math.round(Math.random())]);
el('emailResult').style.color = hasAt ? (el('emailResult').textContent==='Valid'?'#18590d':'#E6B800') : "red";
}
function autoAnalyzeEmail() {
if(cards.length){el('emailAnalyzerInput').value = cards[0].email; analyzeEmail();}
else {alert("Generate at least one card first.");}
}
// SSN GENERATOR
function generateSSNs() {
let n = parseInt(el('ssnQtyInput').value)||1;
let out = "";
for(let i=0;i<Math.min(5000,n);i++) {
let a = String(Math.floor(Math.random()*900)+100);
let g = String(Math.floor(Math.random()*90)+10);
let s = String(Math.floor(Math.random()*9000)+1000);
out += `${a}-${g}-${s}\n`;
}
el('ssnGenResult').value=out.trim();
}
function autoGenerateSSN() {
el('ssnQtyInput').value=5; generateSSNs();
}
// SSN VALIDATOR (format check)
function validateSSN() {
let ssn = (el('ssnValidateInput').value||"").replace(/-/g,'');
let valid = ssn.match(/^(?!000|666|9\d{2})\d{3}(?!00)\d{2}(?!0000)\d{4}$/);
el('ssnValidateResult').textContent = valid ? "Valid (format)." : "INVALID";
el('ssnValidateResult').style.color = valid?"#18590d":"#b91c1c";
}
function autoValidateSSN() {
if(el('ssnGenResult').value){
let v = el('ssnGenResult').value.split('\n')[0];
el('ssnValidateInput').value = v;
validateSSN();
} else {
autoGenerateSSN(); setTimeout(autoValidateSSN,100);
}
}
// DATA IMPORT HANDLING
el('importFile').addEventListener('change', function(evt){
let file = evt.target.files[0]; if(!file) return;
let ext = file.name.split(".").pop().toLowerCase();
let reader = new FileReader();
reader.onload = function(e) {
let text = e.target.result;
if(ext==="json") {
let data = JSON.parse(text);
if(Array.isArray(data)){
data.forEach(x=>{
if(x.bin) importedBins.push(x.bin);
if(x.email) importedEmails.push(x.email);
if(x.ip) importedIPs.push(x.ip);
});
alert("Imported data from JSON.");
}
} else if(ext==="csv" || ext==="txt"){
let rows = text.split('\n');
rows.forEach(r=>{
let vals = r.split(/[,|;]/);
vals.forEach(v=>{
v = v.trim();
if(v.match(/^\d{6,8}$/)) importedBins.push(v);
if(v.includes('@')) importedEmails.push(v);
if(v.match(/^(\d{1,3}\.){3}\d{1,3}$/)) importedIPs.push(v);
});
});
alert("Imported plaintext/csv data.");
} else if(ext==="pdf"){
alert("PDF import requires server parsing: Cannot auto-detect BINs/emails/ips here.");
}
importedBins = Array.from(new Set(importedBins));
importedEmails = Array.from(new Set(importedEmails));
importedIPs = Array.from(new Set(importedIPs));
localStorage.setItem("importedBins",JSON.stringify(importedBins));
localStorage.setItem("importedEmails",JSON.stringify(importedEmails));
localStorage.setItem("importedIPs",JSON.stringify(importedIPs));
};
if(file) reader.readAsText(file);
});
// ADMIN PANEL RENDER
function renderAdmin() {
el('adminCardsCount').innerText = cards.length;
el('adminBinsCount').innerText = importedBins.length;
el('adminEmailsCount').innerText = importedEmails.length;
el('adminIPsCount').innerText = importedIPs.length;
let imports = "";
if(importedBins.length) imports += "<b>Bins:</b><br>"+importedBins.slice(-6).join(", ")+"<br>";
if(importedEmails.length) imports += "<b>Emails:</b><br>"+importedEmails.slice(-6).join(", ")+"<br>";
if(importedIPs.length) imports += "<b>IPs:</b><br>"+importedIPs.slice(-6).join(", ")+"<br>";
el('adminImports').innerHTML = imports||"No data imported yet.";
renderChart();
}
// Card timeline chart
function renderChart() {
let data = {};
genTimeline.forEach(x=>{
let dt = new Date(x.ts);
let ds = `${dt.getFullYear()}-${(dt.getMonth()+1).toString().padStart(2,'0')}-${dt.getDate().toString().padStart(2,'0')}`;
data[ds]= (data[ds]||0)+x.count;
});
let labels = Object.keys(data);
let counts = Object.values(data);
if(window.cardGenChart) window.cardGenChart.destroy();
let ctx = document.getElementById('cardGenChart').getContext('2d');
window.cardGenChart = new Chart(ctx, {
type: 'bar',
data: {labels, datasets:[{label:'Cards Generated',data:counts, backgroundColor:"#059669"}]},
options: {plugins:{legend:{display:false}},scales:{y:{beginAtZero:true}}}
});
}
// UTILS
function escapeHTML(txt){return String(txt||'').replace(/[&<>"']/g,c=>({ '&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]));}
// INIT
renderHistory();
// END
</script>
</body>
</html>