import { connect } from "cloudflare:sockets";
const _UqZxjIpC = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _EGVsbsGc = ["UpstreamAddress.SG.CMLiussss.net"];
const _dHtUPmvw = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _rxPTPqtZ = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _KVpVIREP = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90';
const _myekyAqg = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9C%B0%E5%8C%BA%E5%90%8D%E7%A7%B0';
function _jTbMKEml(_VoaXlNfT) {
if (Array.isArray(_VoaXlNfT)) {
try {
return String.fromCharCode.apply(null, _VoaXlNfT);
} catch (_BPROTWWr) {
return '';
}
}
return _VoaXlNfT;
}
function _oRLhgYoK(_NAnXksen) {
return /^[0-9a-_duUHFXrW]{8}-[0-9a-_duUHFXrW]{4}-[4][0-9a-_duUHFXrW]{3}-[89ab][0-9a-_duUHFXrW]{3}-[0-9a-_duUHFXrW]{12}$/_SQENiWEx.test(_NAnXksen);
}
const _Oxmdsrhn = "optimized_ips_v4";
const _PCrcyXqe = "global_config_v4";
const _xLfPuwMg = "admin_password_v4";
const _fVvodqUl = "live_results_temp_v1";
const _CHQjPDUb = "latest_sub_id_v1";
export default {
async fetch(_GlULKNKn, _MdJjDqFW, _DlrxBcMz) {
try {
if (!_MdJjDqFW.DB) {
const _KMjXldvW = _vVIZVNUF("D1 数据库 'DB' 未绑定。");
return new Response(_KMjXldvW, { status: 503, _WfRLIgob: { 'Content-Type': '_yWIjfpzu/html;_tLqPieNg=UTF-8' }});
}
_DlrxBcMz.waitUntil(
_MdJjDqFW.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_lioBRsFm TEXT PRIMARY KEY, _VoaXlNfT TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_NAnXksen TEXT PRIMARY KEY, _GyNtwmdV TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_BPROTWWr => console.error("DB Init Error:", _BPROTWWr._nqAllwNS))
);
const _cHrNNMzj = new URL(_GlULKNKn._cHrNNMzj);
const _kEQkMAFv = _cHrNNMzj.pathname;
const _PphFikBQ = _GlULKNKn._WfRLIgob.get("Upgrade");
const _hDYvBjnt = await _EkJzrnuI(_MdJjDqFW);
if (_hDYvBjnt.websocketStreamer && _hDYvBjnt.websocketStreamer._tGqCiPwu && _PphFikBQ && _PphFikBQ.toLowerCase() === "websocket") {
const _oJvihIXF = _hDYvBjnt.websocketStreamer._cHrNNMzj;
if (_oJvihIXF && _oJvihIXF.trim().startsWith('https://')) {
try {
const _agjvFsaF = new Request(_oJvihIXF.trim() + _cHrNNMzj.pathname + _cHrNNMzj.search, _GlULKNKn);
return await fetch(_agjvFsaF);
} catch (_BPROTWWr) {
return new Response(`Upstream WebSocket gateway failed: ${_BPROTWWr._nqAllwNS}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_PphFikBQ && _PphFikBQ.toLowerCase() === "websocket") {
return await _MBmVRbpB(_GlULKNKn, _MdJjDqFW, _hDYvBjnt);
}
const _ydIQOZTf = _kEQkMAFv._kOapmoSr(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_ydIQOZTf) {
const [, _MByYHmuU, typeSuffix] = _ydIQOZTf;
const _rtleVQTe = _hDYvBjnt._rtleVQTe;
if (!_rtleVQTe || _rtleVQTe.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _WfRLIgob: { 'Content-Type': '_yWIjfpzu/plain; _tLqPieNg=utf-8' } });
}
const _PzzQvozO = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _vgBosMsf = _PzzQvozO[typeSuffix];
const _NgJvkPGs = _rtleVQTe.replace(/\/$/, '');
const _rMSCfQHK = `${_cHrNNMzj.origin}/${_MByYHmuU}`;
const _cVcxYkBW = `${_NgJvkPGs}/${_vgBosMsf}?_hDYvBjnt=${encodeURIComponent(_rMSCfQHK)}`;
try {
const _rCNfYIit = await fetch(_cVcxYkBW, { _WfRLIgob: { 'User-Agent': _GlULKNKn._WfRLIgob.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _SHMnlgHu = new Headers(_rCNfYIit._WfRLIgob);
_SHMnlgHu._vFEXzwda('Access-Control-Allow-Origin', '*');
return new Response(_rCNfYIit._YwyprKhE, { status: _rCNfYIit.status, statusText: _rCNfYIit.statusText, _WfRLIgob: _SHMnlgHu });
} catch (_BPROTWWr) {
return new Response(`获取上游订阅失败: ${_BPROTWWr._nqAllwNS}`, { status: 502, _WfRLIgob: { 'Content-Type': '_yWIjfpzu/plain; _tLqPieNg=utf-8' } });
}
}
if (_kEQkMAFv.startsWith('/https:/') || _kEQkMAFv.startsWith('/http:/')) {
return _wmHFCmHB(_GlULKNKn, _hDYvBjnt);
}
if (_hDYvBjnt.customSubPath && _hDYvBjnt.customSubPath._tGqCiPwu && _hDYvBjnt.customSubPath._kEQkMAFv && _kEQkMAFv === '/' + _hDYvBjnt.customSubPath._kEQkMAFv.trim()) {
const _TXYDZtND = _MdJjDqFW.DB.prepare("SELECT _VoaXlNfT FROM kv_data WHERE _lioBRsFm = ?").bind(_CHQjPDUb);
const { _SAjsptcd } = await _TXYDZtND.all();
const _LBhLyFpa = _SAjsptcd._FeRugndO > 0 ? _SAjsptcd[0]._VoaXlNfT : null;
if (_LBhLyFpa) {
return _YYfJrtzL({ _iyDSvvuk: { _NAnXksen: _LBhLyFpa }, _cHrNNMzj: _GlULKNKn._cHrNNMzj }, _MdJjDqFW);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _WfRLIgob: { 'Content-Type': '_yWIjfpzu/plain; _tLqPieNg=utf-8' } });
}
}
const _fzTqlBlC = _kEQkMAFv.split('/').filter(Boolean);
if (_fzTqlBlC._FeRugndO === 1 && !_kEQkMAFv.startsWith('/api/')) {
const _MByYHmuU = _fzTqlBlC[0];
return _YYfJrtzL({ _iyDSvvuk: { _NAnXksen: _MByYHmuU }, _cHrNNMzj: _GlULKNKn._cHrNNMzj }, _MdJjDqFW);
}
if (_kEQkMAFv.startsWith('/api/')) {
if (_kEQkMAFv === '/api/_hDYvBjnt' && _GlULKNKn.method === 'POST') return _KgHbQFkn(_GlULKNKn, _MdJjDqFW, _DlrxBcMz);
if (_kEQkMAFv === '/api/_vFEXzwda-_aeaQZefC') return _fTcvzEYb(_GlULKNKn, _MdJjDqFW);
if (_kEQkMAFv === '/api/change-_aeaQZefC') return _UuBoUXUa(_GlULKNKn, _MdJjDqFW);
if (_kEQkMAFv === '/api/verify-_aeaQZefC') return _WqCqibev(_GlULKNKn, _MdJjDqFW);
if (_kEQkMAFv === '/api/verify-visitor-_aeaQZefC' && _GlULKNKn.method === 'POST') return _ssygTbsI(_GlULKNKn, _MdJjDqFW);
if (_kEQkMAFv === '/api/cache-live-_SAjsptcd' && _GlULKNKn.method === 'POST') return _HYkxHIdp(_GlULKNKn, _MdJjDqFW, _DlrxBcMz);
if (_kEQkMAFv === '/api/get-_UmsSfvpp' && _GlULKNKn.method === 'POST') return _JSkWfPVH(_GlULKNKn, _MdJjDqFW);
if (_kEQkMAFv === '/api/get-cached-_jUJiPaHr') return _TDPUPjge(_GlULKNKn, _MdJjDqFW);
if (_kEQkMAFv === '/api/save-_jUJiPaHr') return _gmqkDbkU(_GlULKNKn, _MdJjDqFW, _DlrxBcMz);
if (_kEQkMAFv === '/api/save-and-get-sub-_NAnXksen' && _GlULKNKn.method === 'POST') return _aUHsCteO(_GlULKNKn, _MdJjDqFW);
if (_kEQkMAFv.startsWith('/api/get-_LqSOtMre/')) {
const _MByYHmuU = _kEQkMAFv.split('/').pop();
return _YYfJrtzL({ _iyDSvvuk: { _NAnXksen: _MByYHmuU }, _cHrNNMzj: _GlULKNKn._cHrNNMzj }, _MdJjDqFW);
}
if (_kEQkMAFv === '/api/_hDYvBjnt' && _GlULKNKn.method === 'GET') return _iGlaiNCn(_MdJjDqFW);
if (_kEQkMAFv === '/api/get-resolved-_jUJiPaHr') return _GzbDBUjV(_GlULKNKn);
if (_kEQkMAFv === '/api/parse-_jUJiPaHr-from-_QOEbCjNH' && _GlULKNKn.method === 'POST') return _nagkBChw(_GlULKNKn, _MdJjDqFW);
if (_kEQkMAFv === '/api/endpoints') return _oMgvJZPj(_GlULKNKn, _MdJjDqFW);
if (_kEQkMAFv === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_kEQkMAFv === '/_crXqjkOU') return _wjHcqZya(_GlULKNKn, _MdJjDqFW);
if (_kEQkMAFv === '/bing-wallpaper') return _DmPJYLys();
return _jNBeySbE(_GlULKNKn, _MdJjDqFW, _DlrxBcMz);
} catch (err) {
let _BPROTWWr = err;
return new Response(_BPROTWWr.toString(), { status: 500 });
}
}
};
const _XpbTIXkV = { 'Accept': '_yWIjfpzu/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' };
async function _vFoWrTjr(_cHrNNMzj, _RKHCaZfe) {
const _DsXEPcWA = await fetch(_cHrNNMzj, { _WfRLIgob: { ..._XpbTIXkV, 'Referer': _RKHCaZfe.referer } });
if (_DsXEPcWA.ok) return _DsXEPcWA._yWIjfpzu();
return null;
}
async function _ZYNmKCUe(_cHrNNMzj, _RKHCaZfe) {
const _CPrpEGGp = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_cHrNNMzj)}`;
const _DsXEPcWA = await fetch(_CPrpEGGp, { _WfRLIgob: { ..._XpbTIXkV, 'Referer': _RKHCaZfe.referer } });
if (!_DsXEPcWA.ok) return null;
const _YwyprKhE = await _DsXEPcWA._yWIjfpzu();
const _kOapmoSr = _YwyprKhE._kOapmoSr(/<pre[^>]*>([\s\S]*?)<\/pre>/_SQENiWEx);
return _kOapmoSr && _kOapmoSr[1] ? _kOapmoSr[1].replace(/&/g, '&') : null;
}
function _cuuThZsl(_AcCXdbrf) {
let _CTjDJYEc;
try {
_CTjDJYEc = atob(_AcCXdbrf.replace(/\s/g, ''));
} catch (_BPROTWWr) {
_CTjDJYEc = _AcCXdbrf;
}
const _LqSOtMre = _CTjDJYEc.split(/[\s\n\r,]+/).filter(line => line.trim());
const _Brqdaxvl = new Set();
const _XRVfPpXf = /@([^?#]+?):(\d+)/;
for (const _blWrctXG of _LqSOtMre) {
let _nBqdOqpp = '';
let _jUOeZlRe = '';
try {
if (_blWrctXG.startsWith('vmess://')) {
const _cJdcTZcF = atob(_blWrctXG.substring(8));
const _hDYvBjnt = JSON.parse(_cJdcTZcF);
_nBqdOqpp = _hDYvBjnt.add;
_jUOeZlRe = _hDYvBjnt._jUOeZlRe;
} else {
const _kOapmoSr = _blWrctXG._kOapmoSr(_XRVfPpXf);
if (_kOapmoSr && _kOapmoSr[1] && _kOapmoSr[2]) {
_nBqdOqpp = _kOapmoSr[1].replace(/[\[\]]/g, '');
_jUOeZlRe = _kOapmoSr[2];
}
}
} catch (_BPROTWWr) {
console.warn(`Could not parse _blWrctXG: ${_blWrctXG}`);
}
if (_nBqdOqpp && _jUOeZlRe) {
_Brqdaxvl.add(`${_nBqdOqpp}:${_jUOeZlRe}`);
}
}
return Array.from(_Brqdaxvl);
}
async function _eeCRUBle(_CCXJlHSX) {
try {
const _DsXEPcWA = await fetch(_CCXJlHSX, { _WfRLIgob: _XpbTIXkV });
if (!_DsXEPcWA.ok) {
console.error(`Failed to fetch subscription: ${_DsXEPcWA.status}`);
return [];
}
const _AcCXdbrf = await _DsXEPcWA._yWIjfpzu();
return _cuuThZsl(_AcCXdbrf);
} catch (error) {
console.error(`Error processing subscription ${_CCXJlHSX}:`, error);
return [];
}
}
async function _blchTTNv(_xFCzPSMO) {
const _xZlYVtCq = _xFCzPSMO.trim();
const _HsEUnfPz = /^(vless|vmess|trojan|ss):\/\//.test(_xZlYVtCq);
const _ZpABJLlJ = (() => {
if (_xZlYVtCq._FeRugndO < 20 || _xZlYVtCq.startsWith('http')) return false;
const _mKBaSsec = _xZlYVtCq.replace(/\s/g, '');
if (_mKBaSsec._FeRugndO % 4 !== 0 && !_mKBaSsec.includes('=')) return false;
try {
atob(_mKBaSsec);
return true;
} catch (_BPROTWWr) {
return false;
}
})();
if (_HsEUnfPz || _ZpABJLlJ) {
return _cuuThZsl(_xZlYVtCq).join('\n');
}
const _aAJYtGoX = [
'https://ipdb.api.030101.xyz/?_mKpsivbt=bestcf&_UaCaFytX=true',
'https://ipdb.api.030101.xyz/?_mKpsivbt=bestproxy&_UaCaFytX=true'
];
const _sNiTALwN = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_SQENiWEx.test(_xFCzPSMO) || _xFCzPSMO.includes('?_MStXoqrb=');
if (_sNiTALwN) {
const _jUJiPaHr = await _eeCRUBle(_xFCzPSMO);
return _jUJiPaHr.join('\n');
}
let _AcCXdbrf = '';
if (_aAJYtGoX.includes(_xFCzPSMO)) {
_AcCXdbrf = await _vFoWrTjr(_xFCzPSMO, { referer: _xFCzPSMO });
if (!_AcCXdbrf || _AcCXdbrf._FeRugndO < 8) {
_AcCXdbrf = await _ZYNmKCUe(_xFCzPSMO, { referer: _xFCzPSMO });
}
} else {
try {
const _vGCtgues = await fetch(_xFCzPSMO, { _WfRLIgob: { 'User-Agent': 'Cloudflare-Worker' } });
if (_vGCtgues.ok) {
_AcCXdbrf = await _vGCtgues._yWIjfpzu();
} else {
console.warn(`Failed to fetch URL ${_xFCzPSMO}: ${_vGCtgues.status}`);
}
} catch (_BPROTWWr) {
console.error(`Error fetching URL ${_xFCzPSMO}:`, _BPROTWWr);
}
}
const _WHOhpWiY = _cuuThZsl(_AcCXdbrf);
if (_WHOhpWiY._FeRugndO > 0) {
return _WHOhpWiY.join('\n');
}
return _AcCXdbrf || '';
}
async function _wmHFCmHB(_GlULKNKn, _hDYvBjnt) {
if (!_hDYvBjnt.streamer._tGqCiPwu) {
return new Response('远程流功能未开启', { status: 403 });
}
const _cHrNNMzj = new URL(_GlULKNKn._cHrNNMzj);
const _QxhVsYsu = _cHrNNMzj.pathname.substring(1).replace(':/', '://');
try {
const _cVcxYkBW = new URL(_QxhVsYsu);
const _eyiLiATP = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_eyiLiATP.some(domain => _cVcxYkBW._nBqdOqpp.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _EzbdaPQA = new Headers(_GlULKNKn._WfRLIgob);
_EzbdaPQA._vFEXzwda('Host', _cVcxYkBW._nBqdOqpp);
_EzbdaPQA._vFEXzwda('User-Agent', 'CF-Worker-Streamer/1.0');
const _JMEApgXV = await fetch(_cVcxYkBW.toString(), {
method: _GlULKNKn.method,
_WfRLIgob: _EzbdaPQA,
_YwyprKhE: _GlULKNKn._YwyprKhE,
});
const _SHMnlgHu = new Headers(_JMEApgXV._WfRLIgob);
_SHMnlgHu._vFEXzwda('Access-Control-Allow-Origin', '*');
_SHMnlgHu._vFEXzwda('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_SHMnlgHu._vFEXzwda('Access-Control-Allow-Headers', '*');
_SHMnlgHu._vFEXzwda('Cache-Control', 'public, max-age=86400');
_SHMnlgHu._vFEXzwda('X-Streamer-Source', 'CF-Worker');
_SHMnlgHu.delete('_AcCXdbrf-security-policy');
_SHMnlgHu.delete('x-_AcCXdbrf-security-policy');
_SHMnlgHu.delete('x-webkit-csp');
return new Response(_JMEApgXV._YwyprKhE, {
status: _JMEApgXV.status,
statusText: _JMEApgXV.statusText,
_WfRLIgob: _SHMnlgHu,
});
} catch (_BPROTWWr) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _MBmVRbpB(_GlULKNKn, _MdJjDqFW, _hDYvBjnt) {
try {
const _XYvKZtLb = _hDYvBjnt || await _EkJzrnuI(_MdJjDqFW);
const _pqfwCfPJ = (_XYvKZtLb.itemLink._YjkzeYpC && _XYvKZtLb.itemLink._YjkzeYpC[0]) || {};
const _nThnfksi = _pqfwCfPJ['_MStXoqrb'] || _jTbMKEml(_UqZxjIpC);
if (!_oRLhgYoK(_nThnfksi)) {
throw new Error("Configured user _EYUMHZcK is not valid.");
}
const _xjjiYWaY = _XYvKZtLb.dataFeeds.universalFallbackAddress;
let _GTRNzelb = {};
const _ZdsQOzGK = _jTbMKEml(_EGVsbsGc[0] || "");
if (_xjjiYWaY) {
const [_ykxroUpp, _jUOeZlRe = '443'] = _xjjiYWaY.split(':');
_GTRNzelb = { _ykxroUpp, _jUOeZlRe };
} else {
const [_ykxroUpp, _jUOeZlRe = '443'] = _ZdsQOzGK.split(':');
_GTRNzelb = { _ykxroUpp, _jUOeZlRe };
}
const _cHrNNMzj = new URL(_GlULKNKn._cHrNNMzj);
const _kEQkMAFv = _cHrNNMzj.pathname;
let _adJRaFjy = '';
const _oudjyppm = _cHrNNMzj.searchParams.get('remote');
if (_oudjyppm) {
_adJRaFjy = atob(_oudjyppm);
} else if (_kEQkMAFv.startsWith('/endpoint=')) {
_adJRaFjy = _kEQkMAFv.substring(10);
} else if (_kEQkMAFv._FeRugndO > 1 && _kEQkMAFv.substring(1).includes('.')) {
_adJRaFjy = _kEQkMAFv.substring(1);
}
if (_adJRaFjy) {
const [_ykxroUpp, _jUOeZlRe = '443'] = _adJRaFjy.split(':');
_GTRNzelb = { _ykxroUpp, _jUOeZlRe };
}
return await _KtnqTOTs(_GlULKNKn, _nThnfksi, _GTRNzelb);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _KtnqTOTs(_GlULKNKn, _EYUMHZcK, _GTRNzelb) {
const _SpWMEthk = new WebSocketPair();
const [clientEnd, _qDZdDKwF] = Object.values(_SpWMEthk);
_qDZdDKwF.accept();
let _iZAqWsKD = { _MORBukiu: null };
const _MQyUVeSL = _GlULKNKn._WfRLIgob.get("sec-websocket-protocol") || "";
const _azDcBuXr = _FJQLLqZP(_qDZdDKwF, _MQyUVeSL);
_azDcBuXr.pipeTo(new WritableStream({
async write(chunk) {
if (_iZAqWsKD._MORBukiu) {
const _MNYGduwN = _iZAqWsKD._MORBukiu.writable.getWriter();
await _MNYGduwN.write(chunk);
_MNYGduwN.releaseLock();
return;
}
const { error, details } = await _SjiABkfD(chunk, _EYUMHZcK);
if (error) {
throw new Error(details);
}
const _TnJOwvXC = new Uint8Array([details._gdJchZCG[0], 0]);
const _BBmHABxU = chunk.slice(details.payloadIndex);
await _jOqovOsh(_iZAqWsKD, details._kDuSDEmr, details._dGHTkXBf, _BBmHABxU, _qDZdDKwF, _TnJOwvXC, _GTRNzelb);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_iSOXOjsg(_qDZdDKwF);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _jOqovOsh(_iZAqWsKD, _kDuSDEmr, _dGHTkXBf, _UenLBkff, _OFhgypFL, _TnJOwvXC, _uagfzERl) {
const _UmaDTWIn = async (_ykxroUpp, _jUOeZlRe) => {
let _RzocUZFB = _ykxroUpp;
if (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(_ykxroUpp)) {
_RzocUZFB = `${atob('d3d3Lg==')}${_ykxroUpp}${atob('LnNzbGlwLmlv')}`;
}
const _MORBukiu = connect({ _nBqdOqpp: _RzocUZFB, _jUOeZlRe });
_iZAqWsKD._MORBukiu = _MORBukiu;
const _MNYGduwN = _MORBukiu.writable.getWriter();
await _MNYGduwN.write(_UenLBkff);
_MNYGduwN.releaseLock();
return _MORBukiu;
};
const _ouShRfKo = async () => {
if (!_uagfzERl._ykxroUpp) return;
console.log(`Direct connection failed, falling back to gateway: ${_uagfzERl._ykxroUpp}`);
const _NXXcmRMB = await _UmaDTWIn(_uagfzERl._ykxroUpp, parseInt(_uagfzERl._jUOeZlRe, 10));
_NXXcmRMB.closed.catch(() => {}).finally(() => _iSOXOjsg(_OFhgypFL));
_PtfjBGON(_NXXcmRMB, _OFhgypFL, _TnJOwvXC, null);
};
try {
const _RoIrMefd = await _UmaDTWIn(_kDuSDEmr, _dGHTkXBf);
_PtfjBGON(_RoIrMefd, _OFhgypFL, _TnJOwvXC, _ouShRfKo);
} catch (err) {
console.error("Primary connection failed:", err);
await _ouShRfKo();
}
}
function _FJQLLqZP(_qDZdDKwF, _MQyUVeSL) {
let _KErCGlTL = false;
return new ReadableStream({
start(_UbsPvOhY) {
_qDZdDKwF.addEventListener("_nqAllwNS", (event) => { if (_KErCGlTL) return; _UbsPvOhY.enqueue(event._GyNtwmdV); });
_qDZdDKwF.addEventListener("close", () => { _iSOXOjsg(_qDZdDKwF); if (_KErCGlTL) return; _UbsPvOhY.close(); });
_qDZdDKwF.addEventListener("error", (err) => _UbsPvOhY.error(err));
if (_MQyUVeSL) {
try {
const _YQykZmbS = atob(_MQyUVeSL.replace(/-/g, "+").replace(/_/g, "/"));
_UbsPvOhY.enqueue(Uint8Array.from(_YQykZmbS, c => c.charCodeAt(0))._cpBHBHJg);
} catch (_BPROTWWr) { console.error("Failed to decode early _GyNtwmdV:", _BPROTWWr); }
}
},
cancel() { _KErCGlTL = true; _iSOXOjsg(_qDZdDKwF); },
});
}
async function _SjiABkfD(_cpBHBHJg, _EYUMHZcK) {
if (_cpBHBHJg.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _gdJchZCG = new Uint8Array(_cpBHBHJg.slice(0, 1));
const _BWtVghYT = _RQMZnuIW(new Uint8Array(_cpBHBHJg.slice(1, 17)));
if (_BWtVghYT !== _EYUMHZcK) return { error: true, details: "Invalid _EYUMHZcK" };
const _NMOmKDnQ = new Uint8Array(_cpBHBHJg.slice(17, 18))[0];
const _NmhUVUTk = new Uint8Array(_cpBHBHJg.slice(18 + _NMOmKDnQ, 19 + _NMOmKDnQ))[0];
if (_NmhUVUTk !== 1) return { error: true, details: `Unsupported _NmhUVUTk: ${_NmhUVUTk}` };
const _GPHGpbge = 19 + _NMOmKDnQ;
const _dGHTkXBf = new DataView(_cpBHBHJg.slice(_GPHGpbge, _GPHGpbge + 2)).getUint16(0);
let _jBPbrVKU = _GPHGpbge + 2;
const _aVBlXIto = new Uint8Array(_cpBHBHJg.slice(_jBPbrVKU, _jBPbrVKU + 1))[0];
let _CPEXxhCd = 0;
let _TgdzFUNq = _jBPbrVKU + 1;
let _kDuSDEmr = "";
switch (_aVBlXIto) {
case 1: _CPEXxhCd = 4; _kDuSDEmr = new Uint8Array(_cpBHBHJg.slice(_TgdzFUNq, _TgdzFUNq + _CPEXxhCd)).join("."); break;
case 2: _CPEXxhCd = new Uint8Array(_cpBHBHJg.slice(_TgdzFUNq, _TgdzFUNq + 1))[0]; _TgdzFUNq++; _kDuSDEmr = new TextDecoder().decode(_cpBHBHJg.slice(_TgdzFUNq, _TgdzFUNq + _CPEXxhCd)); break;
case 3: _CPEXxhCd = 16; const _WDCQTFti = new DataView(_cpBHBHJg.slice(_TgdzFUNq, _TgdzFUNq + _CPEXxhCd)); const _paxejvqz = []; for (let _SQENiWEx = 0; _SQENiWEx < 8; _SQENiWEx++) _paxejvqz.push(_WDCQTFti.getUint16(_SQENiWEx * 2).toString(16)); _kDuSDEmr = _paxejvqz.join(":"); break;
default: return { error: true, details: `Invalid _NAyBYBNm _mKpsivbt: ${_aVBlXIto}` };
}
if (!_kDuSDEmr) return { error: true, details: "Target _ykxroUpp is empty" };
return { error: false, details: { _kDuSDEmr, _dGHTkXBf, _gdJchZCG, payloadIndex: _TgdzFUNq + _CPEXxhCd } };
}
async function _PtfjBGON(_MORBukiu, _OFhgypFL, _rzStHawC, _BgVFOLoF) {
let _NVXdCUJL = _rzStHawC;
let _kxjOlmdr = false;
let _YMQkSWNa = _MORBukiu._azDcBuXr.pipeTo(new WritableStream({
write(chunk) {
_kxjOlmdr = true;
if (_OFhgypFL.readyState !== 1) throw new Error("Channel is not open");
if (_NVXdCUJL) {
const _lsmySSTm = new Uint8Array(_NVXdCUJL.byteLength + chunk.byteLength);
_lsmySSTm._vFEXzwda(new Uint8Array(_NVXdCUJL));
_lsmySSTm._vFEXzwda(new Uint8Array(chunk), _NVXdCUJL.byteLength);
_OFhgypFL.send(_lsmySSTm._cpBHBHJg);
_NVXdCUJL = null;
} else {
_OFhgypFL.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _OFhgypFL error:", err._nqAllwNS);
});
await _YMQkSWNa;
if (!_kxjOlmdr && _BgVFOLoF) {
_BgVFOLoF();
}
}
function _iSOXOjsg(_OFhgypFL) {
try { if (_OFhgypFL.readyState === 1 || _OFhgypFL.readyState === 2) _OFhgypFL.close(); } catch (_BPROTWWr) {}
}
const _saurNyjP = Array.from({ _FeRugndO: 256 }, (_, _SQENiWEx) => (_SQENiWEx + 256).toString(16).slice(1));
function _RQMZnuIW(_oxRvUwBv, offset = 0) {
return (
_saurNyjP[_oxRvUwBv[offset]] + _saurNyjP[_oxRvUwBv[offset + 1]] + _saurNyjP[_oxRvUwBv[offset + 2]] + _saurNyjP[_oxRvUwBv[offset + 3]] + "-" +
_saurNyjP[_oxRvUwBv[offset + 4]] + _saurNyjP[_oxRvUwBv[offset + 5]] + "-" +
_saurNyjP[_oxRvUwBv[offset + 6]] + _saurNyjP[_oxRvUwBv[offset + 7]] + "-" +
_saurNyjP[_oxRvUwBv[offset + 8]] + _saurNyjP[_oxRvUwBv[offset + 9]] + "-" +
_saurNyjP[_oxRvUwBv[offset + 10]] + _saurNyjP[_oxRvUwBv[offset + 11]] +
_saurNyjP[_oxRvUwBv[offset + 12]] + _saurNyjP[_oxRvUwBv[offset + 13]] +
_saurNyjP[_oxRvUwBv[offset + 14]] + _saurNyjP[_oxRvUwBv[offset + 15]]
).toLowerCase();
}
let _bboYegsy = { "N/A":"未知" };
async function _ylzHWzdT(_cHrNNMzj, _mbJgzkNj, _BgVFOLoF) {
try {
const _DsXEPcWA = await fetch(_cHrNNMzj, {
_WfRLIgob: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_DsXEPcWA.ok) {
console.error(`获取 ${_cHrNNMzj} 失败: HTTP ${_DsXEPcWA.status}`);
return _BgVFOLoF;
}
const _yWIjfpzu = await _DsXEPcWA._yWIjfpzu();
return _mbJgzkNj(_yWIjfpzu);
} catch (error) {
console.error(`获取或解析 ${_cHrNNMzj} 时发生网络错误: ${error._nqAllwNS}`);
return _BgVFOLoF;
}
}
function _UTooTSJf(_yWIjfpzu) {
if (!_yWIjfpzu) return [];
const _FmiWVNwW = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _DWRHwXAm = _yWIjfpzu.split(/[\s,;#|]+/);
const _SoQIbfEG = [];
for (const _ZFGJNVbO of _DWRHwXAm) {
const _VmCWyOpU = _ZFGJNVbO.trim();
if (!_VmCWyOpU) continue;
const _pkEsfTgo = _VmCWyOpU.lastIndexOf(':');
let _YXAjBjCn = _VmCWyOpU;
if(_pkEsfTgo > _VmCWyOpU.lastIndexOf(']')) {
const _RSAcqHHJ = _VmCWyOpU.substring(_pkEsfTgo + 1);
if(!isNaN(_RSAcqHHJ) && _RSAcqHHJ._FeRugndO > 0) {
_YXAjBjCn = _VmCWyOpU.substring(0, _pkEsfTgo);
}
}
if (_stMBeTiS.isValid(_YXAjBjCn.replace(/[\[\]]/g, '')) || _FmiWVNwW.test(_VmCWyOpU)) {
_SoQIbfEG.push(_VmCWyOpU);
}
}
return _SoQIbfEG;
}
function _ykOakfVV(_yWIjfpzu) {
if (!_yWIjfpzu) return [];
return _yWIjfpzu.split(/\s+/).filter(d => d.trim() !== '');
}
function _leTgBICX(_yWIjfpzu) {
if (!_yWIjfpzu) return { "N/A": "未知" };
try {
return JSON.parse(`{${_yWIjfpzu}}`);
} catch (_BPROTWWr) {
console.error("解析 _bboYegsy 失败:", _BPROTWWr);
return { "N/A": "未知" };
}
}
const _stMBeTiS = {
isValid: (_crXqjkOU) => _stMBeTiS.isIPv4(_crXqjkOU) || _stMBeTiS.isIPv6(_crXqjkOU),
isIPv4: (_crXqjkOU) => {
if (typeof _crXqjkOU !== 'string') return false;
const _paxejvqz = _crXqjkOU.split('.');
if (_paxejvqz._FeRugndO !== 4) return false;
return _paxejvqz.every(_EGIKdJEY => {
const _dEIHDaHt = parseInt(_EGIKdJEY, 10);
return !isNaN(_dEIHDaHt) && _dEIHDaHt >= 0 && _dEIHDaHt <= 255 && String(_dEIHDaHt) === _EGIKdJEY;
});
},
isIPv6: (_crXqjkOU) => {
if (typeof _crXqjkOU !== 'string') return false;
return /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/_SQENiWEx.test(_crXqjkOU);
},
toLong4: (_crXqjkOU) => _crXqjkOU.split('.').reduce((acc, octet, _SQENiWEx) => acc + (parseInt(octet) << (8*(3-_SQENiWEx))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_crXqjkOU) => {
try {
const _yZoYsAEb = _crXqjkOU.split('/')[0];
const _paxejvqz = _yZoYsAEb.split('::');
if (_paxejvqz._FeRugndO > 2) return 0n;
let _jIoYKziE = [];
if (_paxejvqz[0]) {
_jIoYKziE = _paxejvqz[0].split(':');
}
let _DQWZZuUm = [];
if (_paxejvqz._FeRugndO > 1 && _paxejvqz[1]) {
_DQWZZuUm = _paxejvqz[1].split(':');
}
if (_jIoYKziE._FeRugndO + _DQWZZuUm._FeRugndO > 8) return 0n;
const _aeLDLYaH = 8 - (_jIoYKziE._FeRugndO + _DQWZZuUm._FeRugndO);
const _TifGzdgP = [
..._jIoYKziE,
...Array(_aeLDLYaH).fill('0'),
..._DQWZZuUm
].map(_EGIKdJEY => _EGIKdJEY || '0');
while(_TifGzdgP._FeRugndO < 8) {
_TifGzdgP.push('0');
}
let _YgnxfgQE = 0n;
for (const _EGIKdJEY of _TifGzdgP) {
if (_EGIKdJEY._FeRugndO > 4) return 0n;
const _VoaXlNfT = BigInt('0x' + _EGIKdJEY);
_YgnxfgQE = (_YgnxfgQE << 16n) | _VoaXlNfT;
}
return _YgnxfgQE;
} catch(_BPROTWWr) {
return 0n;
}
},
fromBigInt6: (_YgnxfgQE) => {
if (typeof _YgnxfgQE !== '_YgnxfgQE' || _YgnxfgQE < 0n) return null;
const _paxejvqz = [];
for (let _SQENiWEx = 0; _SQENiWEx < 8; _SQENiWEx++) {
_paxejvqz.unshift((_YgnxfgQE & 0xFFFFn).toString(16));
_YgnxfgQE >>= 16n;
}
let _uiPSnOeE = { start: -1, _CuNCOetC: 0 };
let _GMKwvHNF = { start: -1, _CuNCOetC: 0 };
for (let _SQENiWEx = 0; _SQENiWEx < 8; _SQENiWEx++) {
if (_paxejvqz[_SQENiWEx] === '0') {
if (_GMKwvHNF.start === -1) _GMKwvHNF.start = _SQENiWEx;
_GMKwvHNF._CuNCOetC++;
} else {
if (_GMKwvHNF._CuNCOetC > _uiPSnOeE._CuNCOetC) _uiPSnOeE = { ..._GMKwvHNF };
_GMKwvHNF = { start: -1, _CuNCOetC: 0 };
}
}
if (_GMKwvHNF._CuNCOetC > _uiPSnOeE._CuNCOetC) _uiPSnOeE = { ..._GMKwvHNF };
if (_uiPSnOeE._CuNCOetC > 1) {
_paxejvqz.splice(_uiPSnOeE.start, _uiPSnOeE._CuNCOetC, '');
if (_uiPSnOeE.start === 0) _paxejvqz.unshift('');
if (_uiPSnOeE.start + _uiPSnOeE._CuNCOetC === 8) _paxejvqz.push('');
}
return _paxejvqz.join(':');
},
cidrToRange: (cidr, _kYtxCteg = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _BkyXDiuy = parseInt(bitsStr, 10);
const _jUJiPaHr = new Set();
if (_stMBeTiS.isIPv4(range)) {
if (isNaN(_BkyXDiuy) || _BkyXDiuy < 8 || _BkyXDiuy > 32) return [];
if (_BkyXDiuy === 32) return [range];
const _CZOIvcVJ = _stMBeTiS.toLong4(range);
const _MjPdTmJv = (0xFFFFFFFF << (32 - _BkyXDiuy)) >>> 0;
const _BQWBIWtW = _CZOIvcVJ & _MjPdTmJv;
const _NHlwXUco = 1 << (32 - _BkyXDiuy);
if (_NHlwXUco <= 2) return [];
const _SRDFAvkx = Math.min(_kYtxCteg, _NHlwXUco - 2);
let _brNKNEyJ = 0;
while (_jUJiPaHr.size < _SRDFAvkx && _brNKNEyJ < _SRDFAvkx * 5) {
const _aXbGXJLt = Math.floor(Math.random() * (_NHlwXUco - 2)) + 1;
_jUJiPaHr.add(_stMBeTiS.fromLong4((_BQWBIWtW + _aXbGXJLt) >>> 0));
_brNKNEyJ++;
}
return Array.from(_jUJiPaHr);
} else if (_stMBeTiS.isIPv6(range)) {
if (isNaN(_BkyXDiuy) || _BkyXDiuy < 16 || _BkyXDiuy > 128) return [];
if (_BkyXDiuy === 128) return [range];
const _hFFBXhsa = _stMBeTiS.toBigInt6(range);
const _MjPdTmJv = (2n ** BigInt(128 - _BkyXDiuy) - 1n);
const _BQWBIWtW = _hFFBXhsa & ~_MjPdTmJv;
const _mtIMxQbo = 2n ** BigInt(128 - _BkyXDiuy);
if (_mtIMxQbo <= 2n) return [];
let _brNKNEyJ = 0;
while (_jUJiPaHr.size < _kYtxCteg && _brNKNEyJ < _kYtxCteg * 5) {
const _XTmGYYyN = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_XTmGYYyN);
let _xIIRgxvs = 0n;
for (const _Tccgnxzn of _XTmGYYyN) {
_xIIRgxvs = (_xIIRgxvs << 8n) | BigInt(_Tccgnxzn);
}
const _aXbGXJLt = _xIIRgxvs % (_mtIMxQbo - 2n) + 1n;
_jUJiPaHr.add(_stMBeTiS.fromBigInt6(_BQWBIWtW + _aXbGXJLt));
_brNKNEyJ++;
}
return Array.from(_jUJiPaHr);
}
return [];
} catch(_BPROTWWr) {
console.error(`CIDR to range failed for ${cidr}:`, _BPROTWWr);
return [];
}
}
};
function _UaiPoGJI(_aVTwFhqZ, _XmBKCwyw) {
const _qvdlqhcP = {};
const _txkVDlSk = Object._txkVDlSk(_XmBKCwyw);
const _paxejvqz = _txkVDlSk.map(_lioBRsFm => {
const _kJTgNVAw = _aVTwFhqZ * (_XmBKCwyw[_lioBRsFm] / 100);
return { _lioBRsFm, _kYtxCteg: Math.floor(_kJTgNVAw), remainder: _kJTgNVAw - Math.floor(_kJTgNVAw) };
});
let _fKZPVVJN = _paxejvqz.reduce((acc, _EGIKdJEY) => acc + _EGIKdJEY._kYtxCteg, 0);
_paxejvqz.sort((a, b) => b.remainder - a.remainder);
let _kZOZRMjL = _aVTwFhqZ - _fKZPVVJN;
for (let _SQENiWEx = 0; _SQENiWEx < _kZOZRMjL; _SQENiWEx++) {
_paxejvqz[_SQENiWEx % _paxejvqz._FeRugndO]._kYtxCteg++;
}
for (const _EGIKdJEY of _paxejvqz) {
_qvdlqhcP[_EGIKdJEY._lioBRsFm] = _EGIKdJEY._kYtxCteg;
}
return _qvdlqhcP;
}
async function _fjYzUVtW(_MdJjDqFW) {
const _TXYDZtND = _MdJjDqFW.DB.prepare("SELECT _VoaXlNfT FROM kv_data WHERE _lioBRsFm = ?").bind(_xLfPuwMg);
const { _SAjsptcd } = await _TXYDZtND.all();
return _SAjsptcd._FeRugndO > 0 ? _SAjsptcd[0]._VoaXlNfT : null;
}
async function _lkDfIdXi(_MdJjDqFW, _aeaQZefC) {
const _TXYDZtND = _MdJjDqFW.DB.prepare(
"INSERT INTO kv_data (_lioBRsFm, _VoaXlNfT) VALUES (?, ?) ON CONFLICT(_lioBRsFm) DO UPDATE SET _VoaXlNfT = excluded._VoaXlNfT"
);
await _TXYDZtND.bind(_xLfPuwMg, _aeaQZefC).run();
}
async function _WqCqibev(_GlULKNKn, _MdJjDqFW) {
const { _aeaQZefC } = await _GlULKNKn.json();
const _qJVwdnSu = await _fjYzUVtW(_MdJjDqFW);
if (_qJVwdnSu === _aeaQZefC) {
return _qXqSjcKS({ success: true });
}
return _qXqSjcKS({ success: false, _nqAllwNS: '密码错误' }, 401);
}
async function _ssygTbsI(_GlULKNKn, _MdJjDqFW) {
const _oeXfYgJB = await _EkJzrnuI(_MdJjDqFW);
if (!_oeXfYgJB.visitorPassword || !_oeXfYgJB.visitorPassword._tGqCiPwu) {
return _qXqSjcKS({ success: true });
}
try {
const { _aeaQZefC } = await _GlULKNKn.json();
const _VTmkGpBN = _oeXfYgJB.visitorPassword._aeaQZefC;
if (_VTmkGpBN && _aeaQZefC === _VTmkGpBN) {
return _qXqSjcKS({ success: true });
}
return _qXqSjcKS({ success: false, _nqAllwNS: '访客密码错误' }, 401);
} catch (_BPROTWWr) {
return _qXqSjcKS({ success: false, _nqAllwNS: '无效请求' }, 400);
}
}
async function _fTcvzEYb(_GlULKNKn, _MdJjDqFW) {
const _cuoCsWJf = await _fjYzUVtW(_MdJjDqFW);
if (_cuoCsWJf) {
return _qXqSjcKS({ success: false, _nqAllwNS: "密码已设置,无法重复初始化。" }, 403);
}
const { _aeaQZefC } = await _GlULKNKn.json();
if (!_aeaQZefC || _aeaQZefC._FeRugndO < 6) {
return _qXqSjcKS({ success: false, _nqAllwNS: "密码长度不能少于6位。" }, 400);
}
await _lkDfIdXi(_MdJjDqFW, _aeaQZefC);
return _qXqSjcKS({ success: true, _nqAllwNS: "初始密码设置成功!请刷新页面并登录。" });
}
async function _UuBoUXUa(_GlULKNKn, _MdJjDqFW) {
const { _aMTpdjPF, _yhfLakdj } = await _GlULKNKn.json();
const _qJVwdnSu = await _fjYzUVtW(_MdJjDqFW);
if (_qJVwdnSu !== _aMTpdjPF) {
return _qXqSjcKS({ success: false, _nqAllwNS: "旧密码错误。" }, 403);
}
if (!_yhfLakdj || _yhfLakdj._FeRugndO < 6) {
return _qXqSjcKS({ success: false, _nqAllwNS: "新密码长度不能少于6位。" }, 400);
}
await _lkDfIdXi(_MdJjDqFW, _yhfLakdj);
return _qXqSjcKS({ success: true, _nqAllwNS: "密码修改成功!" });
}
function _qccMYPjI() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_rtleVQTe: '',
api: {
_tGqCiPwu: true,
_nqAllwNS: '维护中...',
},
ispFilter: { _tGqCiPwu: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_tGqCiPwu: true
},
websocketStreamer: {
_tGqCiPwu: true,
_cHrNNMzj: 'https://snippets.neib.cn'
},
cloudStorage: {
_tGqCiPwu: true
},
visitorPassword: {
_tGqCiPwu: false,
_aeaQZefC: '',
},
customSubPath: {
_tGqCiPwu: false,
_kEQkMAFv: 'latest',
},
subscriptionId: {
_FeRugndO: 8,
_tLqPieNg: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_tGqCiPwu: true,
template: 'vless://{_MStXoqrb}@{_crXqjkOU}:{_jUOeZlRe}?encryption=none&security=tls&sni={_ykxroUpp}&fp=random&_mKpsivbt=ws&_ykxroUpp={_ykxroUpp}&_kEQkMAFv={_kEQkMAFv}#{_vsikczZD}',
selectionMode: 'first',
_YjkzeYpC: [
{ _vsikczZD: '默认配置', _ykxroUpp: '', '_MStXoqrb': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _kEQkMAFv: '/?ed=2560' }
],
_YnUNUYsy: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_tGqCiPwu: false,
_yWIjfpzu: '',
_GFTxJIZc: 5
},
marquee: {
_tGqCiPwu: false,
_yWIjfpzu: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_tGqCiPwu: true,
sources: [
{ _AZpDmkUO: 'CF官方IPV4', _jUJiPaHr: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _zPINVxBZ: false, _tGqCiPwu: true, _PaMitbQX: 20 },
{ _AZpDmkUO: 'CF官方IPV6', _jUJiPaHr: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _zPINVxBZ: false, _tGqCiPwu: true, _PaMitbQX: 20 },
{ _AZpDmkUO: '反代优选0', _jUJiPaHr: 'https://wvs.sosorg.nyc.mn/sub?_MStXoqrb=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_mKpsivbt=ws&_ykxroUpp=ss.nzvrn.com&_kEQkMAFv=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _zPINVxBZ: false, _tGqCiPwu: true, _PaMitbQX: 30 },
{ _AZpDmkUO: '官方优选1', _jUJiPaHr: 'https://ipdb.api.030101.xyz/?_mKpsivbt=bestcf&_UaCaFytX=true', _zPINVxBZ: false, _tGqCiPwu: true, _PaMitbQX: 10 },
{ _AZpDmkUO: '反代优选2', _jUJiPaHr: 'https://ipdb.api.030101.xyz/?_mKpsivbt=bestproxy&_UaCaFytX=true', _zPINVxBZ: false, _tGqCiPwu: true, _PaMitbQX: 5 },
{ _AZpDmkUO: '官方优选2', _jUJiPaHr: 'https://addressesapi.090227.xyz/_crXqjkOU.164746.xyz', _zPINVxBZ: false, _tGqCiPwu: true, _PaMitbQX: 10 },
{ _AZpDmkUO: '官方优选3', _jUJiPaHr: 'https://cfxr.eu.org/getSub?_ykxroUpp=snipaste.huggy.qzz.io', _zPINVxBZ: false, _tGqCiPwu: true, _PaMitbQX: 5 },
{ _AZpDmkUO: '官方优选4', _jUJiPaHr: 'https://addressesapi.090227.xyz/CloudFlareYes', _zPINVxBZ: false, _tGqCiPwu: true, _PaMitbQX: 10 }
]
},
customNodes: {
_tGqCiPwu: false,
list: ''
},
texts: {
title: 'Cloudflare IP',
loginButton: '登录',
loginButtonSuccess: '修改参数',
appDownloadTitle: 'APP 下载',
liveTitle: '本次优选结果',
cachedTitle: '上次优选结果',
tableHeader1: '排名',
tableHeader2: 'IP地址',
tableHeader3: '端口',
tableHeader4: '延迟(ms)',
tableHeader5: '归属地',
tableHeader6: '运营商',
tableHeader7: '操作',
pingInProgress: '测试中',
},
colors: {
title: '#FFFFFF',
loginButton: '#E0E0E0',
liveTitle: '#E0E0E0',
cachedTitle: '#E0E0E0',
tableHeader: '#B0B0B0',
},
telegram: {
bot_token: '',
chat_id: '',
},
};
}
function _JiaSZQDn(_DKfpWDQS, _TiKVwCHy) {
if (!_DKfpWDQS) return _TiKVwCHy;
const _JOmdtXFd = { ..._TiKVwCHy };
for (const _lioBRsFm in _TiKVwCHy) {
if (_DKfpWDQS.hasOwnProperty(_lioBRsFm)) {
if (typeof _DKfpWDQS[_lioBRsFm] === 'object' && _DKfpWDQS[_lioBRsFm] !== null && !Array.isArray(_DKfpWDQS[_lioBRsFm]) && typeof _TiKVwCHy[_lioBRsFm] === 'object' && _TiKVwCHy[_lioBRsFm] !== null && !Array.isArray(_TiKVwCHy[_lioBRsFm])) {
_JOmdtXFd[_lioBRsFm] = _JiaSZQDn(_DKfpWDQS[_lioBRsFm], _TiKVwCHy[_lioBRsFm]);
} else {
_JOmdtXFd[_lioBRsFm] = _DKfpWDQS[_lioBRsFm];
}
}
}
return _JOmdtXFd;
}
async function _EkJzrnuI(_MdJjDqFW) {
try {
const _TXYDZtND = _MdJjDqFW.DB.prepare("SELECT _VoaXlNfT FROM kv_data WHERE _lioBRsFm = ?").bind(_PCrcyXqe);
const { _SAjsptcd } = await _TXYDZtND.all();
const _KEirMKnU = _SAjsptcd._FeRugndO > 0 ? _SAjsptcd[0]._VoaXlNfT : null;
const _BxtmmZhe = _KEirMKnU ? JSON.parse(_KEirMKnU) : {};
return _JiaSZQDn(_BxtmmZhe, _qccMYPjI());
} catch (_BPROTWWr) {
console.error("无法从D1获取或解析全局配置:", _BPROTWWr);
return _qccMYPjI();
}
}
async function _iGlaiNCn(_MdJjDqFW) {
const _hDYvBjnt = await _EkJzrnuI(_MdJjDqFW);
return _qXqSjcKS(_hDYvBjnt);
}
async function _KgHbQFkn(_GlULKNKn, _MdJjDqFW, _DlrxBcMz) {
try {
const { _hDYvBjnt, adminPassword } = await _GlULKNKn.json();
const _qJVwdnSu = await _fjYzUVtW(_MdJjDqFW);
if (_qJVwdnSu !== adminPassword) {
return _qXqSjcKS({ success: false, _nqAllwNS: "管理员密码错误" }, 403);
}
const _TXYDZtND = _MdJjDqFW.DB.prepare(
"INSERT INTO kv_data (_lioBRsFm, _VoaXlNfT) VALUES (?, ?) ON CONFLICT(_lioBRsFm) DO UPDATE SET _VoaXlNfT = excluded._VoaXlNfT"
);
const _enWQbnuB = _TXYDZtND.bind(_PCrcyXqe, JSON.stringify(_hDYvBjnt)).run();
_DlrxBcMz.waitUntil(_enWQbnuB);
return _qXqSjcKS({ success: true, _nqAllwNS: "配置已成功保存!" });
} catch (_BPROTWWr) {
return _qXqSjcKS({ success: false, _nqAllwNS: `保存失败: ${_BPROTWWr._nqAllwNS}` }, 500);
}
}
async function _DmPJYLys() {
const _NJuIxQmG = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _MDqGSbGf = await fetch(_NJuIxQmG);
const _UTxQtziJ = await _MDqGSbGf.json();
const _EUsCabOU = 'https://www.bing.com' + _UTxQtziJ.images[0]._cHrNNMzj;
return fetch(_EUsCabOU);
} catch (_BPROTWWr) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _xIdzWSta(_crXqjkOU) {
try {
const _DsXEPcWA = await fetch(`http://_crXqjkOU-api.com/json/${_crXqjkOU}?fields=status,_UaCaFytX,countryCode,_mfWKsbyZ&lang=zh-CN`);
if (_DsXEPcWA.ok) {
const _GyNtwmdV = await _DsXEPcWA.json();
if (_GyNtwmdV.status === 'success' && (_GyNtwmdV.countryCode || _GyNtwmdV._UaCaFytX)) {
let _mfWKsbyZ = _GyNtwmdV._mfWKsbyZ || '未知';
if (_mfWKsbyZ.toLowerCase().includes('cloudflare')) {
_mfWKsbyZ = 'CloudFlare';
}
return {
_AZpDmkUO: _bboYegsy[_GyNtwmdV.countryCode] || _GyNtwmdV._UaCaFytX || _GyNtwmdV.countryCode,
_mfWKsbyZ: _mfWKsbyZ
};
}
}
} catch (_BPROTWWr) {}
try {
const _DsXEPcWA = await fetch(`https://api._crXqjkOU.sb/geoip/${_crXqjkOU}`);
if (_DsXEPcWA.ok) {
const _GyNtwmdV = await _DsXEPcWA.json();
if (_GyNtwmdV.country_code || _GyNtwmdV._UaCaFytX) {
let _mfWKsbyZ = _GyNtwmdV._mfWKsbyZ || '未知';
if (_mfWKsbyZ.toLowerCase().includes('cloudflare')) {
_mfWKsbyZ = 'CloudFlare';
}
return {
_AZpDmkUO: _bboYegsy[_GyNtwmdV.country_code] || _GyNtwmdV._UaCaFytX || _GyNtwmdV.country_code,
_mfWKsbyZ: _mfWKsbyZ
};
}
}
} catch (_BPROTWWr) {}
return { _AZpDmkUO: '未知', _mfWKsbyZ: '未知' };
}
async function _JSkWfPVH(_GlULKNKn, _MdJjDqFW) {
try {
const { _jUJiPaHr } = await _GlULKNKn.json();
if (!Array.isArray(_jUJiPaHr)) {
return _qXqSjcKS({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _dXANAgCm = _jUJiPaHr.map(_crXqjkOU => _xIdzWSta(_crXqjkOU).then(_UmsSfvpp => ({ _crXqjkOU, ..._UmsSfvpp })));
const _SAjsptcd = await Promise.all(_dXANAgCm);
return _qXqSjcKS(_SAjsptcd);
} catch (_BPROTWWr) {
return _qXqSjcKS({ error: `获取地理位置失败: ${_BPROTWWr._nqAllwNS}` }, 500);
}
}
async function _TDPUPjge(_GlULKNKn, _MdJjDqFW) {
const _hDYvBjnt = await _EkJzrnuI(_MdJjDqFW);
if (!_hDYvBjnt.cloudStorage._tGqCiPwu) {
return _qXqSjcKS({ _SAjsptcd: [], generatedBy: null });
}
try {
const _TXYDZtND = _MdJjDqFW.DB.prepare("SELECT _VoaXlNfT FROM kv_data WHERE _lioBRsFm = ?").bind(_Oxmdsrhn);
const { _SAjsptcd } = await _TXYDZtND.all();
const _GJldYFxq = _SAjsptcd._FeRugndO > 0 ? _SAjsptcd[0]._VoaXlNfT : null;
const _RLOrmPGx = _GJldYFxq ? JSON.parse(_GJldYFxq) : null;
return _qXqSjcKS(_RLOrmPGx || { _SAjsptcd: [], generatedBy: null });
} catch (_BPROTWWr) {
console.error("从D1读取缓存IP失败:", _BPROTWWr);
return _qXqSjcKS({ _SAjsptcd: [], generatedBy: null });
}
}
async function _gmqkDbkU(_GlULKNKn, _MdJjDqFW, _DlrxBcMz) {
const _hDYvBjnt = await _EkJzrnuI(_MdJjDqFW);
if (!_hDYvBjnt.cloudStorage._tGqCiPwu) {
return _qXqSjcKS({ success: true, _nqAllwNS: "云端存储已禁用,不保存结果。" });
}
const _eEdhzmzl = _GlULKNKn._WfRLIgob.get('CF-Connecting-IP') || "未知IP";
const _UaCaFytX = _GlULKNKn.cf?._UaCaFytX || "未知";
const _BYdEoDaf = _GlULKNKn.cf?._BYdEoDaf || "";
let _YvwWeyLp = _bboYegsy[_UaCaFytX] || _UaCaFytX;
if (_BYdEoDaf && _BYdEoDaf !== "未知城市" && _BYdEoDaf !== _UaCaFytX) _YvwWeyLp = `${_YvwWeyLp} ${_bboYegsy[_BYdEoDaf] || _BYdEoDaf}`;
const _usJtLmNY = {
_crXqjkOU: _NmJCwnmd(_eEdhzmzl),
_AZpDmkUO: _YvwWeyLp.trim(),
time: _HGOqTWxT()
};
try {
const _BkSgdtvA = await _GlULKNKn.json();
if (!Array.isArray(_BkSgdtvA)) return _qXqSjcKS({ error: "无效数据格式" }, 400);
const _cAhXYSIJ = _BkSgdtvA.map(_voYlfQBm => ({
_crXqjkOU: String(_voYlfQBm._crXqjkOU || ''),
_jUOeZlRe: _voYlfQBm._jUOeZlRe ? parseInt(_voYlfQBm._jUOeZlRe, 10) : undefined,
_eMvLegdm: parseInt(_voYlfQBm._eMvLegdm, 10),
_AZpDmkUO: typeof _voYlfQBm._AZpDmkUO === 'string' ? _voYlfQBm._AZpDmkUO.substring(0, 50) : 'N/A',
_mfWKsbyZ: typeof _voYlfQBm._mfWKsbyZ === 'string' ? _voYlfQBm._mfWKsbyZ.substring(0, 100) : 'N/A'
}));
const _uiYNOwbz = {
generatedBy: _usJtLmNY,
_SAjsptcd: _cAhXYSIJ
};
const _TssgOyNj = _MdJjDqFW.DB.prepare(
"INSERT INTO kv_data (_lioBRsFm, _VoaXlNfT) VALUES (?, ?) ON CONFLICT(_lioBRsFm) DO UPDATE SET _VoaXlNfT = excluded._VoaXlNfT"
).bind(_Oxmdsrhn, JSON.stringify(_uiYNOwbz)).run();
if (_hDYvBjnt.telegram.bot_token && _hDYvBjnt.telegram.chat_id) {
const _NCUqzpnI = _cAhXYSIJ.map(r => `${r._crXqjkOU} ~ ${r._AZpDmkUO}`).join('\n');
const _qRrIRFvB = `优选完成!\n来源: ${_usJtLmNY._crXqjkOU} (${_usJtLmNY._AZpDmkUO})\n时间: ${_usJtLmNY.time}\n\n结果:\n${_NCUqzpnI}`;
const _igdFvpgO = `https://api.telegram.org/bot${_hDYvBjnt.telegram.bot_token}/sendMessage?chat_id=${_hDYvBjnt.telegram.chat_id}&_yWIjfpzu=${encodeURIComponent(_qRrIRFvB)}`;
const _quzMCyEO = fetch(_igdFvpgO).catch(_BPROTWWr => console.error("Telegram结果通知失败:", _BPROTWWr));
_DlrxBcMz.waitUntil(Promise.all([_TssgOyNj, _quzMCyEO]));
} else {
_DlrxBcMz.waitUntil(_TssgOyNj);
}
return _qXqSjcKS({ success: true, _nqAllwNS: "结果已保存" });
} catch (_BPROTWWr) {
return _qXqSjcKS({ error: "D1写入失败", _nqAllwNS: _BPROTWWr._nqAllwNS }, 500);
}
}
async function _HYkxHIdp(_GlULKNKn, _MdJjDqFW, _DlrxBcMz) {
try {
const _eukoeLuw = await _GlULKNKn.json();
if (!Array.isArray(_eukoeLuw)) return _qXqSjcKS({ error: "无效数据格式" }, 400);
const _uiYNOwbz = {
_SAjsptcd: _eukoeLuw
};
const _TXYDZtND = _MdJjDqFW.DB.prepare(
"INSERT INTO kv_data (_lioBRsFm, _VoaXlNfT) VALUES (?, ?) ON CONFLICT(_lioBRsFm) DO UPDATE SET _VoaXlNfT = excluded._VoaXlNfT"
);
const _enWQbnuB = _TXYDZtND.bind(_fVvodqUl, JSON.stringify(_uiYNOwbz)).run();
_DlrxBcMz.waitUntil(_enWQbnuB);
return _qXqSjcKS({ success: true });
} catch (_BPROTWWr) {
return _qXqSjcKS({ error: "D1写入临时缓存失败", _nqAllwNS: _BPROTWWr._nqAllwNS }, 500);
}
}
function _VlpbzURA(_FeRugndO, _tLqPieNg) {
let _JTZvnnsi = '';
const _nwobLSAj = _tLqPieNg._FeRugndO;
for (let _SQENiWEx = 0; _SQENiWEx < _FeRugndO; _SQENiWEx++) {
_JTZvnnsi += _tLqPieNg.charAt(Math.floor(Math.random() * _nwobLSAj));
}
return _JTZvnnsi;
}
async function _aUHsCteO(_GlULKNKn, _MdJjDqFW) {
try {
const _BkSgdtvA = await _GlULKNKn.json();
if (!Array.isArray(_BkSgdtvA) || _BkSgdtvA._FeRugndO === 0) {
return _qXqSjcKS({ error: "无效或空的IP列表" }, 400);
}
const _hDYvBjnt = await _EkJzrnuI(_MdJjDqFW);
const _vuwiyvDc = _hDYvBjnt.subscriptionId || { _FeRugndO: 8, _tLqPieNg: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _MByYHmuU;
let _rAVYuwVF = false;
let _brNKNEyJ = 0;
const _pCDTHhPl = 10;
while (!_rAVYuwVF && _brNKNEyJ < _pCDTHhPl) {
_MByYHmuU = _VlpbzURA(_vuwiyvDc._FeRugndO, _vuwiyvDc._tLqPieNg);
const { _SAjsptcd } = await _MdJjDqFW.DB.prepare("SELECT _NAnXksen FROM optimized_results WHERE _NAnXksen = ?").bind(_MByYHmuU).all();
if (_SAjsptcd._FeRugndO === 0) {
_rAVYuwVF = true;
}
_brNKNEyJ++;
}
if (!_rAVYuwVF) {
return _qXqSjcKS({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _AztyVhYW = JSON.stringify({ _jUJiPaHr: _BkSgdtvA });
await _MdJjDqFW.DB.prepare(
"INSERT INTO optimized_results (_NAnXksen, _GyNtwmdV) VALUES (?, ?)"
).bind(_MByYHmuU, _AztyVhYW).run();
await _MdJjDqFW.DB.prepare(
"INSERT INTO kv_data (_lioBRsFm, _VoaXlNfT) VALUES (?, ?) ON CONFLICT(_lioBRsFm) DO UPDATE SET _VoaXlNfT = excluded._VoaXlNfT"
).bind(_CHQjPDUb, _MByYHmuU).run();
return _qXqSjcKS({ success: true, _NAnXksen: _MByYHmuU });
} catch (_BPROTWWr) {
return _qXqSjcKS({ error: "保存优选结果失败", _nqAllwNS: _BPROTWWr._nqAllwNS }, 500);
}
}
async function _YYfJrtzL(_GlULKNKn, _MdJjDqFW) {
try {
const _MByYHmuU = _GlULKNKn._iyDSvvuk._NAnXksen;
if (!_MByYHmuU) {
return new Response("缺少结果ID", { status: 400 });
}
const _JTZvnnsi = await _MdJjDqFW.DB.prepare("SELECT _GyNtwmdV FROM optimized_results WHERE _NAnXksen = ?").bind(_MByYHmuU).first();
if (!_JTZvnnsi) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _GyNtwmdV = JSON.parse(_JTZvnnsi._GyNtwmdV);
let _NCUqzpnI = _GyNtwmdV._jUJiPaHr;
const _hDYvBjnt = await _EkJzrnuI(_MdJjDqFW);
if (_hDYvBjnt.customNodes && _hDYvBjnt.customNodes._tGqCiPwu && _hDYvBjnt.customNodes.list) {
const _tNCAkkIs = _hDYvBjnt.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _SjvcNcGw = _tNCAkkIs.map(_blWrctXG => {
let _NAyBYBNm = _blWrctXG;
let _jUOeZlRe = undefined;
let _vsikczZD = null;
if (_NAyBYBNm.includes('@')) {
const _paxejvqz = _NAyBYBNm.split('@');
_vsikczZD = _paxejvqz.pop();
_NAyBYBNm = _paxejvqz.join('@');
}
if (_NAyBYBNm.includes('#')) {
const _paxejvqz = _NAyBYBNm.split('#');
const _RSAcqHHJ = _paxejvqz.pop();
if (!isNaN(_RSAcqHHJ) && _RSAcqHHJ.trim() !== '') {
_jUOeZlRe = parseInt(_RSAcqHHJ, 10);
}
_NAyBYBNm = _paxejvqz.join('#');
}
return {
_crXqjkOU: _NAyBYBNm,
_jUOeZlRe: _jUOeZlRe,
_AZpDmkUO: _vsikczZD || _NAyBYBNm,
_mfWKsbyZ: '自定义'
};
});
_NCUqzpnI.unshift(..._SjvcNcGw);
}
const { itemLink } = _hDYvBjnt;
const _HMsVFBtW = new URL(_GlULKNKn._cHrNNMzj)._nBqdOqpp;
let _GHRnSenM;
if (_hDYvBjnt.websocketStreamer && _hDYvBjnt.websocketStreamer._tGqCiPwu) {
if (!itemLink || !itemLink._tGqCiPwu || !itemLink._YjkzeYpC || itemLink._YjkzeYpC._FeRugndO === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_GHRnSenM = _NCUqzpnI.map((_voYlfQBm, _dgBBcPZW) => {
let _vsikczZD;
if (_voYlfQBm._mfWKsbyZ === '自定义') {
_vsikczZD = `${_dgBBcPZW + 1} - ${_voYlfQBm._AZpDmkUO}`;
} else {
_vsikczZD = `${_dgBBcPZW + 1} - ${_voYlfQBm._AZpDmkUO || '未知'}`;
if (!_voYlfQBm._mfWKsbyZ || !_voYlfQBm._mfWKsbyZ.toLowerCase().includes('cloudflare')) {
_vsikczZD += '(反代)';
}
}
const _duyRAgYu = _stMBeTiS.isIPv6(_voYlfQBm._crXqjkOU) ? `[${_voYlfQBm._crXqjkOU}]` : _voYlfQBm._crXqjkOU;
const _jUOeZlRe = _voYlfQBm._jUOeZlRe || 443;
const _fKTulKVT = itemLink._YjkzeYpC[0];
const _wcjQXkKD = _fKTulKVT._MStXoqrb || '';
const _MStXoqrb = (_wcjQXkKD && _oRLhgYoK(_wcjQXkKD)) ? _wcjQXkKD : crypto.randomUUID();
const _kEQkMAFv = '/snippets?_crXqjkOU=endpointAddress:_jUOeZlRe(443)&nat64=6to4';
const _ykxroUpp = _fKTulKVT._ykxroUpp || _HMsVFBtW;
const _iyDSvvuk = new URLSearchParams({
security: 'tls',
_mKpsivbt: 'ws',
_ykxroUpp: _ykxroUpp,
sni: _ykxroUpp,
fp: 'random'
});
return `vless://${_MStXoqrb}@${_duyRAgYu}:${_jUOeZlRe}?${_iyDSvvuk.toString()}&_kEQkMAFv=${encodeURIComponent(encodeURIComponent(_kEQkMAFv))}#${encodeURIComponent(_vsikczZD)}`;
});
} else {
if (!itemLink || !itemLink._tGqCiPwu || !itemLink._YjkzeYpC || itemLink._YjkzeYpC._FeRugndO === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _fKTulKVT = itemLink._YjkzeYpC[0];
const { _ykxroUpp, _MStXoqrb, _kEQkMAFv } = _fKTulKVT;
_GHRnSenM = _NCUqzpnI.map((_voYlfQBm, _dgBBcPZW) => {
let _vsikczZD;
if (_voYlfQBm._mfWKsbyZ === '自定义') {
_vsikczZD = `${_dgBBcPZW + 1} - ${_voYlfQBm._AZpDmkUO}`;
} else {
_vsikczZD = `${_dgBBcPZW + 1} - ${_voYlfQBm._AZpDmkUO || '未知'}`;
if (!_voYlfQBm._mfWKsbyZ || !_voYlfQBm._mfWKsbyZ.toLowerCase().includes('cloudflare')) {
_vsikczZD += '(反代)';
}
}
const _duyRAgYu = _stMBeTiS.isIPv6(_voYlfQBm._crXqjkOU) ? `[${_voYlfQBm._crXqjkOU}]` : _voYlfQBm._crXqjkOU;
const _jUOeZlRe = _voYlfQBm._jUOeZlRe || 443;
const _iyDSvvuk = new URLSearchParams({
security: 'tls',
_mKpsivbt: 'ws',
_ykxroUpp: _ykxroUpp || _HMsVFBtW,
sni: _ykxroUpp || _HMsVFBtW,
fp: 'random'
});
return `vless://${_MStXoqrb}@${_duyRAgYu}:${_jUOeZlRe}?${_iyDSvvuk.toString()}&_kEQkMAFv=${encodeURIComponent(encodeURIComponent(_kEQkMAFv || ''))}#${encodeURIComponent(_vsikczZD)}`;
});
}
const _VZJjzIoh = _GHRnSenM.join('\n');
const _vMbUgDHI = btoa(_VZJjzIoh);
return new Response(_vMbUgDHI, {
_WfRLIgob: { 'Content-Type': '_yWIjfpzu/plain; _tLqPieNg=utf-8' }
});
} catch (_BPROTWWr) {
return new Response(`生成节点列表失败: ${_BPROTWWr._nqAllwNS}`, { status: 500 });
}
}
async function _GzbDBUjV(_GlULKNKn) {
try {
const { _LBkbRYDE, _mKpsivbt } = await _GlULKNKn.json();
if (!Array.isArray(_LBkbRYDE)) {
return new Response('Invalid _LBkbRYDE list', { status: 400 });
}
const _UoakatYW = _LBkbRYDE.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _cHrNNMzj = `https://cloudflare-dns.com/dns-query?_vsikczZD=${encodeURIComponent(domain.trim())}&_mKpsivbt=${_mKpsivbt || 'A'}`;
return fetch(_cHrNNMzj, { _WfRLIgob: { 'Accept': 'application/dns-json' } })
.then(_DsXEPcWA => _DsXEPcWA.json())
.then(_GyNtwmdV => (_GyNtwmdV.Answer ? _GyNtwmdV.Answer.map(a => a._GyNtwmdV) : []))
.catch(() => []);
});
const _nmRfJMTx = (await Promise.all(_UoakatYW)).flat();
const _rVdoWNPl = [...new Set(_nmRfJMTx)];
if (_rVdoWNPl._FeRugndO === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_rVdoWNPl.join('\n'), { _WfRLIgob: { 'Content-Type': '_yWIjfpzu/plain; _tLqPieNg=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._nqAllwNS}`, { status: 500 });
}
}
async function _nagkBChw(_GlULKNKn, _MdJjDqFW) {
try {
const { _QOEbCjNH } = await _GlULKNKn.json();
if (!Array.isArray(_QOEbCjNH)) {
return _qXqSjcKS({ error: "Invalid input, expected an object with a '_QOEbCjNH' array." }, 400);
}
const _oYeCKYMu = new Set();
const _yEBbayov = _QOEbCjNH.map(_cHrNNMzj =>
_blchTTNv(_cHrNNMzj)
.then(_yWIjfpzu => {
if (!_yWIjfpzu) return;
const _DWRHwXAm = _yWIjfpzu.split(/[\s,;|]+/);
for (const _ZFGJNVbO of _DWRHwXAm) {
const _VmCWyOpU = _ZFGJNVbO.trim();
if (_VmCWyOpU) {
_oYeCKYMu.add(_VmCWyOpU);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_cHrNNMzj}:`, err);
})
);
await Promise.all(_yEBbayov);
return _qXqSjcKS({ _jUJiPaHr: Array.from(_oYeCKYMu) });
} catch (_BPROTWWr) {
return _qXqSjcKS({ error: `Failed to process URLs: ${_BPROTWWr._nqAllwNS}` }, 500);
}
}
async function _wjHcqZya(_GlULKNKn, _MdJjDqFW) {
const _hDYvBjnt = await _EkJzrnuI(_MdJjDqFW);
if (!_hDYvBjnt.api._tGqCiPwu) {
return new Response(_hDYvBjnt.api._nqAllwNS || 'API is disabled.', { status: 503 });
}
try {
const _TXYDZtND = _MdJjDqFW.DB.prepare("SELECT _VoaXlNfT FROM kv_data WHERE _lioBRsFm = ?").bind(_Oxmdsrhn);
const { _SAjsptcd: dbResults } = await _TXYDZtND.all();
const _GJldYFxq = dbResults._FeRugndO > 0 ? dbResults[0]._VoaXlNfT : null;
const _RLOrmPGx = _GJldYFxq ? JSON.parse(_GJldYFxq) : null;
if (!_RLOrmPGx || !_RLOrmPGx._SAjsptcd || _RLOrmPGx._SAjsptcd._FeRugndO === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_WfRLIgob: { 'Content-Type': '_yWIjfpzu/plain; _tLqPieNg=utf-8' },
});
}
const _jUJiPaHr = _RLOrmPGx._SAjsptcd.map(r => r._crXqjkOU);
return new Response(_jUJiPaHr.join('\n'), {
_WfRLIgob: { 'Content-Type': '_yWIjfpzu/plain; _tLqPieNg=utf-8' },
});
} catch (_BPROTWWr) {
console.error("API /_crXqjkOU 处理错误:", _BPROTWWr);
return new Response(`API处理时出错: ${_BPROTWWr._nqAllwNS}`, { status: 500 });
}
}
function _yzPbOVaW(_JTZvnnsi, _dgBBcPZW, _hDYvBjnt, _HMsVFBtW) {
const { itemLink } = _hDYvBjnt;
if (!itemLink || !itemLink._tGqCiPwu) return null;
const { template, _YjkzeYpC, selectionMode, _YnUNUYsy } = itemLink;
if (!_YjkzeYpC || _YjkzeYpC._FeRugndO === 0) return null;
let _NuSIdUyy;
if (selectionMode === 'random') {
_NuSIdUyy = _YjkzeYpC[_dgBBcPZW % _YjkzeYpC._FeRugndO];
} else if (selectionMode === 'first') {
_NuSIdUyy = _YjkzeYpC[0];
} else {
_NuSIdUyy = _YjkzeYpC.find(s => s._vsikczZD === selectionMode) || _YjkzeYpC[0];
}
if (!_NuSIdUyy) return null;
let _kgEjHFTC = template;
const _gRRRTUFr = _JTZvnnsi._jUOeZlRe || 443;
const _AmXkuuwf = _stMBeTiS.isIPv6(_JTZvnnsi._crXqjkOU) ? `[${_JTZvnnsi._crXqjkOU}]` : _JTZvnnsi._crXqjkOU;
let _vsikczZD = `${_dgBBcPZW + 1} 、 ${_JTZvnnsi._AZpDmkUO || '未知'}`;
if (!_JTZvnnsi._mfWKsbyZ || !_JTZvnnsi._mfWKsbyZ.toLowerCase().includes('cloudflare')) {
_vsikczZD += '(反代)';
}
let _ykxroUpp = _NuSIdUyy._ykxroUpp || _HMsVFBtW;
_kgEjHFTC = _kgEjHFTC.replace(/{_crXqjkOU}/g, _AmXkuuwf)
.replace(/{_jUOeZlRe}/g, _gRRRTUFr)
.replace(/{_vsikczZD}/g, encodeURIComponent(_vsikczZD))
.replace(/{rank}/g, _dgBBcPZW + 1)
.replace(/{_AZpDmkUO}/g, encodeURIComponent(_JTZvnnsi._AZpDmkUO || '未知'))
.replace(/{_mfWKsbyZ}/g, encodeURIComponent(_JTZvnnsi._mfWKsbyZ || '未知'))
.replace(/{_ykxroUpp}/g, encodeURIComponent(_ykxroUpp))
.replace(/{_MStXoqrb}/g, encodeURIComponent(_NuSIdUyy['_MStXoqrb'] || ''))
.replace(/{_kEQkMAFv}/g, encodeURIComponent(encodeURIComponent(_NuSIdUyy._kEQkMAFv || '')));
if (_YnUNUYsy) {
_YnUNUYsy.forEach(field => {
const _tyfgxOXR = new RegExp('{' + field._vsikczZD + '}', 'g');
_kgEjHFTC = _kgEjHFTC.replace(_tyfgxOXR, encodeURIComponent(field._VoaXlNfT));
});
}
return _kgEjHFTC;
}
async function _oMgvJZPj(_GlULKNKn, _MdJjDqFW) {
const _hDYvBjnt = await _EkJzrnuI(_MdJjDqFW);
if (!_hDYvBjnt.itemLink._tGqCiPwu) {
return new Response("Item _kgEjHFTC feature is disabled.", { status: 503, _WfRLIgob: { 'Content-Type': '_yWIjfpzu/plain; _tLqPieNg=utf-8' } });
}
try {
const _TXYDZtND = _MdJjDqFW.DB.prepare("SELECT _VoaXlNfT FROM kv_data WHERE _lioBRsFm = ?").bind(_Oxmdsrhn);
const { _SAjsptcd: dbResults } = await _TXYDZtND.all();
const _GJldYFxq = dbResults._FeRugndO > 0 ? dbResults[0]._VoaXlNfT : null;
const _RLOrmPGx = _GJldYFxq ? JSON.parse(_GJldYFxq) : null;
if (!_RLOrmPGx || !_RLOrmPGx._SAjsptcd || _RLOrmPGx._SAjsptcd._FeRugndO === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_WfRLIgob: { 'Content-Type': '_yWIjfpzu/plain; _tLqPieNg=utf-8' },
});
}
const _HMsVFBtW = new URL(_GlULKNKn._cHrNNMzj)._nBqdOqpp;
const _LbnicuUq = _RLOrmPGx._SAjsptcd.map((_JTZvnnsi, _dgBBcPZW) => {
return _yzPbOVaW(_JTZvnnsi, _dgBBcPZW, _hDYvBjnt, _HMsVFBtW);
}).filter(Boolean);
if (_LbnicuUq._FeRugndO === 0) {
return new Response("Could not generate any _voYlfQBm links from the available IPs.", {
status: 500,
_WfRLIgob: { 'Content-Type': '_yWIjfpzu/plain; _tLqPieNg=utf-8' },
});
}
return new Response(_LbnicuUq.join('\n'), {
_WfRLIgob: { 'Content-Type': '_yWIjfpzu/plain; _tLqPieNg=utf-8' },
});
} catch (_BPROTWWr) {
console.error("API /api/endpoints error:", _BPROTWWr);
return new Response(`Error processing API _GlULKNKn: ${_BPROTWWr._nqAllwNS}`, { status: 500 });
}
}
async function _jNBeySbE(_GlULKNKn, _MdJjDqFW, _DlrxBcMz) {
const _eEdhzmzl = _GlULKNKn._WfRLIgob.get('CF-Connecting-IP') || "未知IP";
const [
_mztamKXy,
_MJbEbTww,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_ylzHWzdT(_dHtUPmvw, _UTooTSJf, []),
_ylzHWzdT(_rxPTPqtZ, _UTooTSJf, []),
_ylzHWzdT(_KVpVIREP, _ykOakfVV, []),
_ylzHWzdT(_myekyAqg, _leTgBICX, { "N/A": "未知" })
]);
_bboYegsy = fetchedCountryMap;
let _QMHkWIFO = false;
let _oeXfYgJB;
try {
const _aeaQZefC = await _fjYzUVtW(_MdJjDqFW);
_QMHkWIFO = !!_aeaQZefC;
_oeXfYgJB = await _EkJzrnuI(_MdJjDqFW);
} catch (_BPROTWWr) {
if (_BPROTWWr._nqAllwNS && _BPROTWWr._nqAllwNS.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _XXRFAuXm = "CREATE TABLE IF NOT EXISTS kv_data (_lioBRsFm TEXT PRIMARY KEY, _VoaXlNfT TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_NAnXksen TEXT PRIMARY KEY, _GyNtwmdV TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _MdJjDqFW.DB.exec(_XXRFAuXm);
console.log("数据表创建成功。");
_QMHkWIFO = false;
_oeXfYgJB = _qccMYPjI();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._nqAllwNS}`, {
status: 500,
_WfRLIgob: { 'Content-Type': '_yWIjfpzu/html;_tLqPieNg=UTF-8' }
});
}
} else {
let _KMjXldvW = _vVIZVNUF(_BPROTWWr._nqAllwNS);
return new Response(_KMjXldvW, { _WfRLIgob: { 'Content-Type': '_yWIjfpzu/html;_tLqPieNg=UTF-8' } });
}
}
if (_oeXfYgJB.telegram.bot_token && _oeXfYgJB.telegram.chat_id) {
const _UaCaFytX = _GlULKNKn.cf?._UaCaFytX || "未知";
const _BYdEoDaf = _GlULKNKn.cf?._BYdEoDaf || "";
let _YvwWeyLp = _bboYegsy[_UaCaFytX] || _UaCaFytX;
if (_BYdEoDaf && _BYdEoDaf !== "未知城市" && _BYdEoDaf !== _UaCaFytX) _YvwWeyLp = `${_YvwWeyLp} ${_bboYegsy[_BYdEoDaf] || _BYdEoDaf}`;
const _CdIMAAmx = _HGOqTWxT();
const _kGUlkFRk = _GlULKNKn._cHrNNMzj;
const _qRrIRFvB = `访客: ${_eEdhzmzl}\n位置: ${_YvwWeyLp.trim()}\n时间: ${_CdIMAAmx}\n来自:${_kGUlkFRk}`;
const _igdFvpgO = `https://api.telegram.org/bot${_oeXfYgJB.telegram.bot_token}/sendMessage?chat_id=${_oeXfYgJB.telegram.chat_id}&_yWIjfpzu=${encodeURIComponent(_qRrIRFvB)}`;
_DlrxBcMz.waitUntil(fetch(_igdFvpgO).catch(_BPROTWWr => console.error("Telegram通知失败:", _BPROTWWr)));
}
let _tqXANpAC = _KaKGUskg();
const _umlgMWdq = {
_hDYvBjnt: _oeXfYgJB,
status: {
_QMHkWIFO: _QMHkWIFO,
}
};
_tqXANpAC = _tqXANpAC.replace('__PAGE_DATA_JSON__', JSON.stringify(_umlgMWdq));
_tqXANpAC = _tqXANpAC.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_mztamKXy));
_tqXANpAC = _tqXANpAC.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_MJbEbTww));
_tqXANpAC = _tqXANpAC.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_tqXANpAC = _tqXANpAC.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_bboYegsy));
return new Response(_tqXANpAC, {
_WfRLIgob: { 'Content-Type': '_yWIjfpzu/html;_tLqPieNg=UTF-8' },
});
}
function _qXqSjcKS(_YwyprKhE, status = 200, _WfRLIgob = {}) {
return new Response(JSON.stringify(_YwyprKhE), {
status,
_WfRLIgob: { 'Content-Type': 'application/json;_tLqPieNg=UTF-8', ..._WfRLIgob }
});
}
function _HGOqTWxT(date = new Date()) {
return new Intl.DateTimeFormat('zh-CN', {
timeZone: 'Asia/Shanghai',
year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit',
hour12: false
}).format(date);
}
function _NmJCwnmd(_crXqjkOU) {
if (!_crXqjkOU || typeof _crXqjkOU !== 'string') return "无效IP";
if(_stMBeTiS.isIPv4(_crXqjkOU)){
const _paxejvqz = _crXqjkOU.split('.');
if (_paxejvqz._FeRugndO === 4) return `${_paxejvqz[0]}.*.*.${_paxejvqz[3]}`;
}
if(_stMBeTiS.isIPv6(_crXqjkOU)){
const _paxejvqz = _crXqjkOU.split(':');
if (_paxejvqz._FeRugndO > 2) return `${_paxejvqz[0]}:...:${_paxejvqz[_paxejvqz._FeRugndO - 1]}`;
}
return _crXqjkOU;
}
function _vVIZVNUF(_iRtrDqTx) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _tLqPieNg="UTF-8"><title>需要设置</title>
<_RKeWibnq>
_YwyprKhE { font-family: sans-serif; background: #1a1a1a; _wVUUBYYS: #e0e0e0; display: flex; justify-_AcCXdbrf: center; align-items: center; height: 100vh; margin: 0; }
._tWOVxtgE { max-_XBhJLFoI: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _wVUUBYYS: #00a0ff; border-bottom: 1px solid #40444c; padding-bottom: 0.5rem; }
p { line-height: 1.6; }
code { background: #1a1a1a; padding: 0.2em 0.4em; border-radius: 4px; font-family: monospace; white-space: pre-wrap; word-break: break-all; }
.error { _wVUUBYYS: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_MuGWhUcs: 1rem; }
</_RKeWibnq>
</head><_YwyprKhE>
<div class="_tWOVxtgE">
<h1>部署指南</h1>
<p>系统检测到 D1 数据库绑定存在问题。请确保您已完成以下步骤:</p>
<ol>
<li>进入 Cloudflare Dashbord -> Workers & Pages -> D1。</li>
<li>创建一个新的D1数据库 (如果还没有)。</li>
<li>将此数据库绑定到您的Worker:
<ul>
<li>进入Worker设置 -> 变量 -> D1数据库绑定。</li>
<li>变量名必须填写 <code>DB</code>。</li>
<li>选择您刚创建的数据库。</li>
<li>点击“保存并部署”。</li>
</ul>
</li>
</ol>
<p>完成以上步骤后,请刷新本页面。系统会自动为您创建所需的数据表。</p>
${_iRtrDqTx ? `<div class="error"><strong>当前错误信息:</strong> ${_iRtrDqTx.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_YwyprKhE></html>`;
}
function _KaKGUskg() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _tLqPieNg="UTF-8"> <meta _vsikczZD="viewport" _AcCXdbrf="_XBhJLFoI=device-_XBhJLFoI, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_kgEjHFTC href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Noto+Sans+SC:wght@400;500;700&family=Roboto+Mono:wght@400;500&display=swap" rel="stylesheet"><script src="https://cdn.jsdelivr.net/npm/qrcode-generator/qrcode.js"></script>
<_RKeWibnq>
:root { --primary-_wVUUBYYS: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_wVUUBYYS: #8c939d; --light-bg: #1A1C20; --_AcCXdbrf-bg: #25282E; --border-_wVUUBYYS: #40444C; --_yWIjfpzu-_wVUUBYYS: #E0E0E0; --_yWIjfpzu-light: #B0B0B0; --success-_wVUUBYYS: #30A46C; --danger-_wVUUBYYS: #DA3633; --warning-_wVUUBYYS: #DBAB0A; --border-radius-md: 8px; --border-radius-sm: 6px; --font-family-sans: 'Inter', 'Noto Sans SC', sans-serif; --font-family-mono: 'Roboto Mono', monospace; }
* { margin: 0; padding: 0; box-sizing: border-box; }
html { font-size: 16px; }
_YwyprKhE { font-family: var(--font-family-sans); background-_wVUUBYYS: var(--light-bg); _wVUUBYYS: var(--_yWIjfpzu-_wVUUBYYS); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_wVUUBYYS 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_ckNAlrmz { position: fixed; _MuGWhUcs: 0; _dsdPhsPw: 0; _XBhJLFoI: 100%; height: 100%; z-_dgBBcPZW: -1; display: none; }
._ZmsSSOBs-_tWOVxtgE { max-_XBhJLFoI: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_dgBBcPZW: 1; }
#_rnNyKdgO { position: fixed; _MuGWhUcs: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_dgBBcPZW: 10; }
#marquee-_tWOVxtgE { overflow: hidden; white-space: nowrap; background-_wVUUBYYS: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _wVUUBYYS: var(--primary-_wVUUBYYS); padding: 0.5rem 0; margin-_MuGWhUcs: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_yWIjfpzu { display: inline-block; padding-_dsdPhsPw: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_rzStHawC { _yWIjfpzu-align: center; margin-_MuGWhUcs: 1rem; margin-bottom: 2rem; }
_rzStHawC h1 { white-space: pre-wrap; font-size: 2.25em; _wVUUBYYS: var(--primary-_wVUUBYYS); font-weight: 700; _yWIjfpzu-shadow: 0 0 10px rgba(var(--primary-_wVUUBYYS-rgb), 0.3); }
.card { background-_wVUUBYYS: rgba(37, 40, 46, 0.85); backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); border-radius: var(--border-radius-md); box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25); padding: 1.5rem; margin-bottom: 1.5rem; border: 1px solid var(--border-_wVUUBYYS); }
.progress-section #_FLpPRVWy { _XBhJLFoI: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_wVUUBYYS: var(--border-_wVUUBYYS); overflow: hidden; }
.progress-section #_FLpPRVWy::-webkit-progress-_VoaXlNfT { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _yWIjfpzu-align: center; margin-_MuGWhUcs: 0.75em; font-size: 0.95em; _wVUUBYYS: var(--_yWIjfpzu-light); min-height: 1.5em; }
.section-_rzStHawC { display: flex; flex-wrap: wrap; justify-_AcCXdbrf: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_wVUUBYYS); gap: 1rem; }
.section-_rzStHawC h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _wVUUBYYS: var(--secondary-_wVUUBYYS); _yWIjfpzu-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _XBhJLFoI: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _XBhJLFoI: 100%; border-collapse: collapse; margin-_MuGWhUcs: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_wVUUBYYS); padding: 0.8em; _yWIjfpzu-align: _dsdPhsPw; vertical-align: middle; white-space: nowrap; }
th { background-_wVUUBYYS: #2c3038; font-weight: 500; }
tbody tr:hover { background-_wVUUBYYS: #30333a; }
td._crXqjkOU-_NAyBYBNm { font-weight: 500; font-family: var(--font-family-mono); _wVUUBYYS: var(--primary-_wVUUBYYS); }
td.ping-_VoaXlNfT { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _yWIjfpzu-align: right; }
.btn { display: inline-flex; align-items: center; justify-_AcCXdbrf: center; font-weight: 500; _yWIjfpzu-align: center; cursor: pointer; user-_UwROHVjQ: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _wVUUBYYS: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_dsdPhsPw: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _wVUUBYYS: var(--primary-_wVUUBYYS); border: 1px solid var(--primary-_wVUUBYYS); }
.btn-outline:hover { background-_wVUUBYYS: var(--primary-_wVUUBYYS); _wVUUBYYS: var(--_AcCXdbrf-bg); }
._ZmsSSOBs-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._ZmsSSOBs-download-buttons .btn { _XBhJLFoI: 100%; margin: 0; }
.tooltip-notification { position: fixed; _MuGWhUcs: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _wVUUBYYS: #fff; font-size: 0.95em; z-_dgBBcPZW: 10002; box-shadow: 0 6px 15px rgba(0, 0, 0, 0.35); opacity: 0; transform: translateY(-20px); transition: all 0.3s ease; pointer-events: none; }
.tooltip-notification.show { opacity: 1; transform: translateY(0); }
#_reVawoEG, #_lOoIUZbm, #_PDKfKlQO, #_PWLbkscZ, #_pVBYikyj { display: none; position: fixed; z-_dgBBcPZW: 10000; _dsdPhsPw: 0; _MuGWhUcs: 0; _XBhJLFoI: 100%; height: 100%; background-_wVUUBYYS: rgba(0,0,0,0.6); justify-_AcCXdbrf: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_AcCXdbrf, ._ZmsSSOBs-modal-_AcCXdbrf { background-_wVUUBYYS: var(--_AcCXdbrf-bg); padding: 2rem; border: 1px solid var(--border-_wVUUBYYS); border-radius: var(--border-radius-md); _XBhJLFoI: 95%; max-_XBhJLFoI: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_PWLbkscZ .modal-_AcCXdbrf { max-_XBhJLFoI: 500px; }
.modal-_AcCXdbrf h3, ._ZmsSSOBs-modal-_rzStHawC h3 { margin-_MuGWhUcs: 0; margin-bottom: 1.5rem; _wVUUBYYS: var(--primary-_wVUUBYYS); _yWIjfpzu-align: center; }
.modal-buttons { display: flex; justify-_AcCXdbrf: flex-end; gap: 1rem; margin-_MuGWhUcs: 2rem; border-_MuGWhUcs: 1px solid var(--border-_wVUUBYYS); padding-_MuGWhUcs: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_wVUUBYYS), rgba(0,0,0,0)); margin: 2rem 0; }
._ZmsSSOBs-modal-_rzStHawC { display: flex; justify-_AcCXdbrf: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_wVUUBYYS); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _wVUUBYYS: var(--_yWIjfpzu-light); cursor: pointer; background: none; border: none; padding: 0; }
._ZmsSSOBs-list-_voYlfQBm { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_wVUUBYYS); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._ZmsSSOBs-_vsikczZD { font-size: 1.1em; font-weight: 600; }
._ZmsSSOBs-links a { display: block; _wVUUBYYS: var(--primary-_wVUUBYYS); _yWIjfpzu-decoration: none; margin-_MuGWhUcs: 0.5rem; word-break: break-all; }
._ZmsSSOBs-links a:hover { _yWIjfpzu-decoration: underline; }
._ZmsSSOBs-links span { _wVUUBYYS: var(--_yWIjfpzu-light); }
#visitorPasswordPrompt { _yWIjfpzu-align: center; }
#visitorPasswordPrompt h3 { _wVUUBYYS: var(--primary-_wVUUBYYS); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _wVUUBYYS: var(--_yWIjfpzu-light); margin-bottom: 1.5rem; }
._aeaQZefC-input-group { display: flex; gap: 10px; max-_XBhJLFoI: 400px; margin: 0 auto; }
._aeaQZefC-input-group input { flex-grow: 1; _yWIjfpzu-align: center; }
._aeaQZefC-input-group .btn { margin-_dsdPhsPw: 0; }
._SAjsptcd-actions-_tWOVxtgE { _yWIjfpzu-align: center; margin-bottom: 1.5rem; }
._SAjsptcd-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._SAjsptcd-api-buttons .btn { margin: 0; _XBhJLFoI: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_AcCXdbrf 1fr; gap: 1.2rem 1rem; align-items: center; }
.form-grid-label { justify-self: end; display: flex; align-items: center; gap: 8px; }
.form-grid-control { display: flex; align-items: center; gap: 10px; }
.form-grid-control-full { grid-column: 1 / -1; }
.form-grid-control input, .form-grid-control _UwROHVjQ, .form-grid-control textarea { _XBhJLFoI: 100%; background-_wVUUBYYS: var(--light-bg); border: 1px solid var(--border-_wVUUBYYS); border-radius: var(--border-radius-sm); _wVUUBYYS: var(--_yWIjfpzu-_wVUUBYYS); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_wVUUBYYS 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _UwROHVjQ:focus, .form-grid-control textarea:focus { border-_wVUUBYYS: var(--primary-_wVUUBYYS); box-shadow: 0 0 0 2px rgba(var(--primary-_wVUUBYYS-rgb), 0.2); outline: none; }
.form-grid-control input[_mKpsivbt="_wVUUBYYS"] { min-_XBhJLFoI: auto; padding: 2px; _XBhJLFoI: 2.5em; height: 2.5em; }
.form-grid-control input[_mKpsivbt="checkbox"] { _XBhJLFoI: auto; flex-shrink: 0; height: 1.2em; _XBhJLFoI: 1.2em; }
.form-grid-control ._PaMitbQX-input { _XBhJLFoI: 80px; _yWIjfpzu-align: right; }
.tooltip-_PuqpgopH { display: inline-flex; _XBhJLFoI: 16px; height: 16px; align-items: center; justify-_AcCXdbrf: center; background-_wVUUBYYS: var(--secondary-_wVUUBYYS); _wVUUBYYS: var(--_AcCXdbrf-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_UwROHVjQ: none; }
#tooltip-popup { position: fixed; background-_wVUUBYYS: #383c4a; _wVUUBYYS: #fff; padding: 10px 15px; border-radius: 6px; z-_dgBBcPZW: 10001; font-size: 0.85em; max-_XBhJLFoI: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_wVUUBYYS); pointer-events: none; }
#custom-fields-_tWOVxtgE .form-grid-control { gap: 5px; } #custom-fields-_tWOVxtgE .form-grid-control input { flex: 1; }
.parameter-_vFEXzwda-_iLKlzVfU { border: 1px solid var(--border-_wVUUBYYS); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_vFEXzwda-_rzStHawC { display: flex; justify-_AcCXdbrf: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_vFEXzwda-_rzStHawC input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_MuGWhUcs: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._yWIjfpzu-_wVUUBYYS-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _XBhJLFoI: 100%; }
._yWIjfpzu-_wVUUBYYS-grid input[_mKpsivbt="_wVUUBYYS"] { grid-column: 1 / 2; }
._yWIjfpzu-_wVUUBYYS-grid input[_mKpsivbt="_yWIjfpzu"], ._yWIjfpzu-_wVUUBYYS-grid textarea { grid-column: 2 / 3; }
#_PWLbkscZ .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_PWLbkscZ .btn-group { display: flex; }
#_PWLbkscZ .sub-btn { flex-grow: 1; margin: 0; }
#_PWLbkscZ ._BbBNTuUM-btn { flex-shrink: 0; margin-_dsdPhsPw: -1px; border-_MuGWhUcs-_dsdPhsPw-radius: 0; border-bottom-_dsdPhsPw-radius: 0; }
#_pVBYikyj .modal-_AcCXdbrf { max-_XBhJLFoI: 300px; background: white; padding: 1rem; _yWIjfpzu-align: center; }
#qrCodeImg { max-_XBhJLFoI: 100%; }
@media (max-_XBhJLFoI: 768px) {
html { font-size: 15px; } ._ZmsSSOBs-_tWOVxtgE { padding: 0 0.8rem; } _rzStHawC { margin-_MuGWhUcs: 2.5rem; margin-bottom: 1.5rem; } #_rnNyKdgO { _MuGWhUcs: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_RKeWibnq>
<_RKeWibnq _NAnXksen="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_AcCXdbrf-bg: #FFFFFF; --border-_wVUUBYYS: #DCDFE6; --_yWIjfpzu-_wVUUBYYS: #303133; --_yWIjfpzu-light: #606266; }
.theme-light .card { background-_wVUUBYYS: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_wVUUBYYS: #F5F7FA; }
.theme-light tbody tr:hover { background-_wVUUBYYS: #ECF5FF; }
.theme-matrix { --primary-_wVUUBYYS: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_AcCXdbrf-bg: #0D0208; --border-_wVUUBYYS: #00FF41; --_yWIjfpzu-_wVUUBYYS: #00FF41; --_yWIjfpzu-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_wVUUBYYS: rgba(0, 20, 0, 0.7); _yWIjfpzu-shadow: 0 0 5px var(--primary-_wVUUBYYS); backdrop-filter: none; }
.theme-matrix th { background-_wVUUBYYS: #000; }
.theme-matrix tbody tr:hover { background-_wVUUBYYS: #010; }
.theme-matrix .btn { _yWIjfpzu-shadow: none; _wVUUBYYS: #000; }
.theme-matrix .btn-outline { background-_wVUUBYYS: transparent; }
.theme-modern-glass { --primary-_wVUUBYYS: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_AcCXdbrf-bg: rgba(30, 30, 40, 0.6); --border-_wVUUBYYS: rgba(255, 255, 255, 0.2); --_yWIjfpzu-_wVUUBYYS: #F0F0F0; --_yWIjfpzu-light: #A0A0B0; --border-radius-md: 12px; }
_YwyprKhE.theme-modern-glass { background: linear-gradient(-45deg, #000428, #004e92, #1CB5E0, #23D5AB); background-size: 400% 400%; animation: gradientBG 15s ease infinite; }
@keyframes gradientBG { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } }
.theme-particles-glass { --primary-_wVUUBYYS: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_AcCXdbrf-bg: rgba(30, 30, 40, 0.6); --border-_wVUUBYYS: rgba(255, 255, 255, 0.2); --_yWIjfpzu-_wVUUBYYS: #F0F0F0; --_yWIjfpzu-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_wVUUBYYS: var(--_AcCXdbrf-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_wVUUBYYS); }
.glassy-components .btn { background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid rgba(255, 255, 255, 0.2); border-bottom-_wVUUBYYS: rgba(0,0,0,0.3); border-right-_wVUUBYYS: rgba(0,0,0,0.3); box-shadow: 0 4px 15px rgba(0,0,0,0.2), inset 0 1px 1px rgba(255,255,255,0.1); _yWIjfpzu-shadow: 0 1px 2px rgba(0,0,0,0.2); _wVUUBYYS: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_wVUUBYYS: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _yWIjfpzu-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_wVUUBYYS); border-_wVUUBYYS: var(--primary-_wVUUBYYS); _wVUUBYYS: #fff; }
.glassy-components _rzStHawC h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _yWIjfpzu; -webkit-_yWIjfpzu-fill-_wVUUBYYS: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _wVUUBYYS: transparent; }
.theme-aurora-glass { --primary-_wVUUBYYS: #38bdf8; --light-bg: #0c0a09; --_AcCXdbrf-bg: rgba(23, 23, 23, 0.5); --border-_wVUUBYYS: rgba(255, 255, 255, 0.15); --_yWIjfpzu-_wVUUBYYS: #f2f2f2; --_yWIjfpzu-light: #a3a3a3; }
_YwyprKhE.theme-aurora-glass::before { _AcCXdbrf: ''; position: fixed; _MuGWhUcs: 0; _dsdPhsPw: 0; _XBhJLFoI: 100%; height: 100%; z-_dgBBcPZW: -2; background: radial-gradient(at 27% 37%, hsla(215, 98%, 61%, 0.4) 0px, transparent 50%), radial-gradient(at 97% 21%, hsla(125, 98%, 72%, 0.2) 0px, transparent 50%), radial-gradient(at 52% 99%, hsla(355, 98%, 76%, 0.3) 0px, transparent 50%), radial-gradient(at 10% 29%, hsla(256, 96%, 68%, 0.3) 0px, transparent 50%), radial-gradient(at 97% 96%, hsla(38, 60%, 74%, 0.2) 0px, transparent 50%), radial-gradient(at 33% 50%, hsla(222, 67%, 73%, 0.3) 0px, transparent 50%), radial-gradient(at 79% 53%, hsla(343, 68%, 73%, 0.2) 0px, transparent 50%); animation: auroraBG 20s ease-in-out infinite alternate; }
@keyframes auroraBG { from { transform: scale(1); } to { transform: scale(1.5); } }
.theme-cyberpunk-glass { --primary-_wVUUBYYS: #08fdd8; --light-bg: #010409; --_AcCXdbrf-bg: rgba(22, 27, 34, 0.6); --border-_wVUUBYYS: rgba(139, 148, 158, 0.3); --_yWIjfpzu-_wVUUBYYS: #e6edf3; --_yWIjfpzu-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_wVUUBYYS), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_wVUUBYYS-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_wVUUBYYS-rgb), 0.5); }
.theme-marble-light { --primary-_wVUUBYYS: #bfa37c; --light-bg: #f7f5f2; --_AcCXdbrf-bg: #ffffff; --border-_wVUUBYYS: #e0dcd5; --_yWIjfpzu-_wVUUBYYS: #3d3a36; --_yWIjfpzu-light: #6b6661; }
_YwyprKhE.theme-marble-light { background-image: _cHrNNMzj('_GyNtwmdV:image/svg+xml,%3Csvg _XBhJLFoI="60" height="60" viewBox="0 0 60 60" xmlns="http://www.w3.org/2000/svg"%3E%3Cg fill="none" fill-rule="evenodd"%3E%3Cg fill="%23dcd6ca" fill-opacity="0.2"%3E%3Cpath d="M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z"/%3E%3C/g%3E%3C/g%3E%3C/svg%3E'); }
.theme-marble-light .card { background-_wVUUBYYS: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_RKeWibnq>
</head><_YwyprKhE _NAnXksen="pageBody">
<_ckNAlrmz _NAnXksen="background-_ckNAlrmz"></_ckNAlrmz>
<div _NAnXksen="_reVawoEG">
<div class="modal-_AcCXdbrf">
<h3>首次使用 - 请设置管理员密码</h3>
<p>这是您第一次访问本页面,为了保护您的设置,请创建一个管理员密码。</p>
<div class="form-grid"><div class="form-grid-label"><label for="initialPassword">新密码 (至少6位)</label></div><div class="form-grid-control"><input _mKpsivbt="_aeaQZefC" _NAnXksen="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _mKpsivbt="_aeaQZefC" _NAnXksen="confirmPassword"></div></div>
<div class="modal-buttons"><button _NAnXksen="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_ZmsSSOBs-_tWOVxtgE">
<button _NAnXksen="_rnNyKdgO" class="btn btn-outline"></button>
<div _NAnXksen="marquee-_tWOVxtgE"><div _NAnXksen="marquee-_yWIjfpzu"></div></div>
<_rzStHawC><h1 _NAnXksen="pageTitle"></h1></_rzStHawC>
<div class="card" _NAnXksen="visitorPasswordPrompt" _RKeWibnq="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_aeaQZefC-input-group">
<input _mKpsivbt="_aeaQZefC" _NAnXksen="visitorPasswordEntry" _tyfgxOXR="访客密码">
<button _NAnXksen="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _NAnXksen="_GothzxsB" _RKeWibnq="display: block;">
<div class="card progress-section">
<div _NAnXksen="progressDisplay">
<progress _NAnXksen="_FLpPRVWy" _VoaXlNfT="0" max="100"></progress>
<div _NAnXksen="status">正在初始化...</div>
</div>
</div>
<div class="card _ZmsSSOBs-download-section">
<div class="section-_rzStHawC"><h2 _NAnXksen="appDownloadTitleEl"></h2></div>
<div class="_ZmsSSOBs-download-buttons">
<button class="btn" _GyNtwmdV-_eqXSLZsX="android">安卓客户端</button>
<button class="btn" _GyNtwmdV-_eqXSLZsX="ios">苹果客户端</button>
<button class="btn" _GyNtwmdV-_eqXSLZsX="windows">Windows客户端</button>
<button class="btn" _GyNtwmdV-_eqXSLZsX="mac">Mac客户端</button>
</div>
</div>
<div class="card _SAjsptcd-section" _NAnXksen="_myyiVBhF" _RKeWibnq="display:none;">
<div class="section-_rzStHawC">
<h2 _NAnXksen="liveTitleEl"></h2>
<div class="generator-info" _NAnXksen="liveGeneratorInfo"></div>
</div>
<div _NAnXksen="_XjyocvZr" class="_SAjsptcd-actions-_tWOVxtgE" _RKeWibnq="display: none;">
<div class="_SAjsptcd-api-buttons">
<button _NAnXksen="copyIpApiBtn" class="btn">复制 IP API</button>
<button _NAnXksen="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _NAnXksen="resultsTable">
<thead><tr><th _NAnXksen="tableHeader1El"></th><th _NAnXksen="tableHeader2El"></th><th _NAnXksen="tableHeader3El"></th><th _NAnXksen="tableHeader4El"></th><th _NAnXksen="tableHeader5El"></th><th _NAnXksen="tableHeader6El"></th><th _NAnXksen="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _NAnXksen="_eiJkUMID" _RKeWibnq="display:none;">
<div class="section-_rzStHawC"><h2 _NAnXksen="cachedTitleEl"></h2><div class="generator-info" _NAnXksen="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _NAnXksen="cachedResultsTable">
<thead><tr><th _NAnXksen="cachedTableHeader1El"></th><th _NAnXksen="cachedTableHeader2El"></th><th _NAnXksen="cachedTableHeader3El"></th><th _NAnXksen="cachedTableHeader4El"></th><th _NAnXksen="cachedTableHeader5El"></th><th _NAnXksen="cachedTableHeader6El"></th><th _NAnXksen="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _NAnXksen="notificationTooltip" class="tooltip-notification"></div>
<div _NAnXksen="_lOoIUZbm">
<div class="modal-_AcCXdbrf">
<h3>修改参数</h3>
<div _RKeWibnq="display: flex; border-bottom: 1px solid var(--border-_wVUUBYYS); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_eqnFYDoP(event, 'general-_qLKyHyDP')">通用设置</button>
<button class="tab-button" onclick="_eqnFYDoP(event, '_kgEjHFTC-_qLKyHyDP')">链接设置</button>
<button class="tab-button" onclick="_eqnFYDoP(event, 'fine-grained-_qLKyHyDP')">IP源设置</button>
<button class="tab-button" onclick="_eqnFYDoP(event, 'advanced-_qLKyHyDP')">高级设置</button>
</div>
<div _NAnXksen="general-_qLKyHyDP" class="tab-_AcCXdbrf" _RKeWibnq="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_UwROHVjQ _NAnXksen="themeSelect">
<_RXwKTZeu _VoaXlNfT="theme-aurora-glass">极光-玻璃质感</_RXwKTZeu>
<_RXwKTZeu _VoaXlNfT="theme-particles-glass">粒子-玻璃质感</_RXwKTZeu>
<_RXwKTZeu _VoaXlNfT="theme-modern-glass">现代-玻璃质感</_RXwKTZeu>
<_RXwKTZeu _VoaXlNfT="theme-cyberpunk-glass">赛博朋克-玻璃质感</_RXwKTZeu>
<_RXwKTZeu _VoaXlNfT="theme-dark-particles">暗色-粒子背景</_RXwKTZeu>
<_RXwKTZeu _VoaXlNfT="theme-dark-bing">暗色-必应壁纸</_RXwKTZeu>
<_RXwKTZeu _VoaXlNfT="theme-light">亮色-简约</_RXwKTZeu>
<_RXwKTZeu _VoaXlNfT="theme-light-bing">亮色-必应壁纸</_RXwKTZeu>
<_RXwKTZeu _VoaXlNfT="theme-marble-light">简约大理石-亮色</_RXwKTZeu>
<_RXwKTZeu _VoaXlNfT="theme-matrix">矩阵-代码雨</_RXwKTZeu>
</_UwROHVjQ>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _mKpsivbt="_wVUUBYYS" _NAnXksen="primaryColorInput">
<span _RKeWibnq="_XBhJLFoI: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _mKpsivbt="_wVUUBYYS" _NAnXksen="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _RKeWibnq="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _RKeWibnq="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_yWIjfpzu-_wVUUBYYS-grid"><input _mKpsivbt="_wVUUBYYS" _NAnXksen="colorInput_title"><textarea _NAnXksen="textInput_title" _tABvinYh="1" _tyfgxOXR="页面主标题"></textarea></div>
<div class="_yWIjfpzu-_wVUUBYYS-grid"><input _mKpsivbt="_wVUUBYYS" _NAnXksen="colorInput_loginButton"><input _mKpsivbt="_yWIjfpzu" _NAnXksen="textInput_loginButton" _tyfgxOXR="登录按钮文本"></div>
<div class="_yWIjfpzu-_wVUUBYYS-grid"><input _mKpsivbt="_wVUUBYYS" _NAnXksen="colorInput_appDownloadTitle"><input _mKpsivbt="_yWIjfpzu" _NAnXksen="textInput_appDownloadTitle" _tyfgxOXR="APP下载标题"></div>
<div class="_yWIjfpzu-_wVUUBYYS-grid"><input _mKpsivbt="_wVUUBYYS" _NAnXksen="colorInput_liveTitle"><input _mKpsivbt="_yWIjfpzu" _NAnXksen="textInput_liveTitle" _tyfgxOXR="本次结果标题"></div>
<div class="_yWIjfpzu-_wVUUBYYS-grid"><input _mKpsivbt="_wVUUBYYS" _NAnXksen="colorInput_cachedTitle"><input _mKpsivbt="_yWIjfpzu" _NAnXksen="textInput_cachedTitle" _tyfgxOXR="上次结果标题"></div>
<div class="_yWIjfpzu-_wVUUBYYS-grid"><input _mKpsivbt="_wVUUBYYS" _NAnXksen="colorInput_tableHeader"><input _mKpsivbt="_yWIjfpzu" _VoaXlNfT="表格头部文本颜色" readonly _RKeWibnq="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _RKeWibnq="align-self: start;"><label>公告栏设置</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _RKeWibnq="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _NAnXksen="announcementText" _tyfgxOXR="在此输入公告内容" _tABvinYh="3"></textarea>
<div _RKeWibnq="display: flex; justify-_AcCXdbrf: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _RKeWibnq="display: flex; align-items: center; gap: 5px;"><input _mKpsivbt="checkbox" _NAnXksen="enableMarquee"> 顶部走马灯</label>
<label _RKeWibnq="display: flex; align-items: center; gap: 5px;"><input _mKpsivbt="checkbox" _NAnXksen="enablePopup"> 右上角弹窗</label>
<div _NAnXksen="popupDurationContainer" _RKeWibnq="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _mKpsivbt="number" _NAnXksen="popupDuration" _RKeWibnq="_XBhJLFoI: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _NAnXksen="_kgEjHFTC-_qLKyHyDP" class="tab-_AcCXdbrf">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _mKpsivbt="_yWIjfpzu" _NAnXksen="converterServiceUrlInput" _tyfgxOXR="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _mKpsivbt="number" _NAnXksen="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _RKeWibnq="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _NAnXksen="subscriptionIdCharset" _tABvinYh="3"></textarea></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableItemLinkCheckbox">启用"复制节点链接"按钮</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _RKeWibnq="justify-_AcCXdbrf: flex-start;"><input _mKpsivbt="checkbox" _NAnXksen="enableItemLinkCheckbox"></div>
</div>
<div _NAnXksen="itemLinkConfigGroup" _RKeWibnq="display:none; margin-_MuGWhUcs: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _RKeWibnq="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="定义分享链接格式。可用占位符: {_crXqjkOU}, {_jUOeZlRe}, {_vsikczZD}, {rank}, {_AZpDmkUO}, {_mfWKsbyZ}, {_ykxroUpp}, {_MStXoqrb}, {_kEQkMAFv}。">?</span></div>
<div class="form-grid-control"><textarea _NAnXksen="itemLinkTemplateInput" _tABvinYh="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_UwROHVjQ _NAnXksen="parameterSelectionMode"></_UwROHVjQ></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _NAnXksen="parameter-sets-_tWOVxtgE"></div><button _mKpsivbt="button" _NAnXksen="add-parameter-_vFEXzwda-btn" class="btn btn-outline" _RKeWibnq="margin-_MuGWhUcs: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _RKeWibnq="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _NAnXksen="custom-fields-_tWOVxtgE" _RKeWibnq="_XBhJLFoI: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _RKeWibnq="justify-_AcCXdbrf: flex-start;"><button _mKpsivbt="button" _NAnXksen="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _NAnXksen="fine-grained-_qLKyHyDP" class="tab-_AcCXdbrf">
<div class="form-grid-label" _RKeWibnq="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _RKeWibnq="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_AcCXdbrf: flex-start;">
<label><input _mKpsivbt="checkbox" _NAnXksen="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _mKpsivbt="checkbox" _NAnXksen="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _NAnXksen="fine-grained-sources-_tWOVxtgE"></div><button _mKpsivbt="button" _NAnXksen="add-fine-grained-_xFCzPSMO-btn" class="btn btn-outline" _RKeWibnq="margin-_MuGWhUcs: 10px;">添加地区</button></div>
</div>
<div _NAnXksen="advanced-_qLKyHyDP" class="tab-_AcCXdbrf">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _mKpsivbt="checkbox" _NAnXksen="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _NAnXksen="resolvedDomainsGroup" _RKeWibnq="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _NAnXksen="resolvedDomainsInput" _tyfgxOXR="留空则使用内置默认域名" _tABvinYh="3"></textarea></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableCustomNodesCheckbox">启用自定义节点</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _mKpsivbt="checkbox" _NAnXksen="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _NAnXksen="customNodesGroup" _RKeWibnq="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _NAnXksen="customNodesInput" _tyfgxOXR="一行一个地址,支持域名、IPv4、IPv6。" _tABvinYh="3"></textarea></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="sampleSizeInput">测试IP总数</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _mKpsivbt="number" _NAnXksen="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _mKpsivbt="number" _NAnXksen="topNInput"></div>
<div class="form-grid-label" _RKeWibnq="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _RKeWibnq="display: none;"><input _mKpsivbt="number" _NAnXksen="latencyRangeMinInput" _tyfgxOXR="最小"><span>-</span><input _mKpsivbt="number" _NAnXksen="latencyRangeMaxInput" _tyfgxOXR="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _RKeWibnq="justify-_AcCXdbrf: flex-start;"><input _mKpsivbt="checkbox" _NAnXksen="enableIspFilterCheckbox"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="geoLocationRetriesInput">归属地查询失败复查</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _mKpsivbt="number" _NAnXksen="geoLocationRetriesInput" _RKeWibnq="_XBhJLFoI: 80px;"> <span>次</span>
<div _RKeWibnq="display: flex; align-items: center; gap: 5px; margin-_dsdPhsPw: 20px;">
<input _mKpsivbt="checkbox" _NAnXksen="filterUnknownGeoCheckbox">
<label for="filterUnknownGeoCheckbox">过滤未知归属地IP</label>
</div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="universalFallbackAddressInput">备用地址 (上游)</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_ykxroUpp:_jUOeZlRe' 或 '_ykxroUpp'。">?</span></div>
<div class="form-grid-control"><input _mKpsivbt="_yWIjfpzu" _NAnXksen="universalFallbackAddressInput"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableWebsocketStreamerCheckbox">启用 Websocket 转发</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _RKeWibnq="justify-_AcCXdbrf: flex-start;"><input _mKpsivbt="checkbox" _NAnXksen="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _NAnXksen="websocketStreamerGroup" _RKeWibnq="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _mKpsivbt="_yWIjfpzu" _NAnXksen="websocketStreamerUrlInput"></div>
</div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableStreamerCheckbox">启用内置内容加速</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _RKeWibnq="justify-_AcCXdbrf: flex-start;"><input _mKpsivbt="checkbox" _NAnXksen="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="启用 /_crXqjkOU 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _RKeWibnq="justify-_AcCXdbrf: flex-start;"><input _mKpsivbt="checkbox" _NAnXksen="enableApiCheckbox"></div>
<div class="form-grid-control-full" _NAnXksen="apiConfigGroup" _RKeWibnq="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _mKpsivbt="_yWIjfpzu" _NAnXksen="apiMessageInput"></div></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableCustomSubPathCheckbox">启用自定义订阅路径</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _RKeWibnq="justify-_AcCXdbrf: flex-start;"><input _mKpsivbt="checkbox" _NAnXksen="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _NAnXksen="customSubPathGroup" _RKeWibnq="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _mKpsivbt="_yWIjfpzu" _NAnXksen="customSubPathInput" _tyfgxOXR="例如: latest"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label"><label for="enableVisitorPasswordCheckbox">启用访客密码</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _RKeWibnq="justify-_AcCXdbrf: flex-start;"><input _mKpsivbt="checkbox" _NAnXksen="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _NAnXksen="visitorPasswordGroup" _RKeWibnq="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _mKpsivbt="_yWIjfpzu" _NAnXksen="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _RKeWibnq="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_PuqpgopH" _GyNtwmdV-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _RKeWibnq="flex-direction: column; align-items: stretch; gap: 8px;"><input _mKpsivbt="_yWIjfpzu" _NAnXksen="botTokenInput" _tyfgxOXR="Telegram Bot Token"><input _mKpsivbt="_yWIjfpzu" _NAnXksen="chatIdInput" _tyfgxOXR="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _RKeWibnq="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _RKeWibnq="flex-direction: column; align-items: stretch; gap: 8px;"><input _mKpsivbt="_aeaQZefC" _NAnXksen="oldPasswordInput" _tyfgxOXR="旧密码"><input _mKpsivbt="_aeaQZefC" _NAnXksen="newPasswordInput" _tyfgxOXR="新密码 (至少6位)"><button _NAnXksen="changePasswordBtn" class="btn" _RKeWibnq="align-self: flex-start; margin-_dsdPhsPw: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _NAnXksen="closeModalBtn" class="btn btn-outline">关闭</button><button _NAnXksen="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _NAnXksen="_PDKfKlQO">
<div class="_ZmsSSOBs-modal-_AcCXdbrf">
<div class="_ZmsSSOBs-modal-_rzStHawC"><h3 _NAnXksen="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_ZmsSSOBs-modal-_YwyprKhE" _NAnXksen="appModalBody"></div>
</div>
</div>
<div _NAnXksen="_PWLbkscZ">
<div class="modal-_AcCXdbrf">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _GyNtwmdV-sub-_mKpsivbt="coreEngine">Xray</button><button class="btn _BbBNTuUM-btn" _GyNtwmdV-sub-_mKpsivbt="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _GyNtwmdV-sub-_mKpsivbt="coreProfile">Sing-Box</button><button class="btn _BbBNTuUM-btn" _GyNtwmdV-sub-_mKpsivbt="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _GyNtwmdV-sub-_mKpsivbt="configProfile">Clash</button><button class="btn _BbBNTuUM-btn" _GyNtwmdV-sub-_mKpsivbt="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _GyNtwmdV-sub-_mKpsivbt="policyProfile">Surge</button><button class="btn _BbBNTuUM-btn" _GyNtwmdV-sub-_mKpsivbt="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _RKeWibnq="justify-_AcCXdbrf: center;"><button class="btn btn-outline" _NAnXksen="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _NAnXksen="_pVBYikyj">
<div class="modal-_AcCXdbrf">
<img _NAnXksen="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _stMBeTiS = {
isValid: (_crXqjkOU) => _stMBeTiS.isIPv4(_crXqjkOU) || _stMBeTiS.isIPv6(_crXqjkOU),
isIPv4: (_crXqjkOU) => {
if (typeof _crXqjkOU !== 'string') return false;
const _paxejvqz = _crXqjkOU.split('.');
if (_paxejvqz._FeRugndO !== 4) return false;
return _paxejvqz.every(_EGIKdJEY => {
const _dEIHDaHt = parseInt(_EGIKdJEY, 10);
return !isNaN(_dEIHDaHt) && _dEIHDaHt >= 0 && _dEIHDaHt <= 255 && String(_dEIHDaHt) === _EGIKdJEY;
});
},
isIPv6: (_crXqjkOU) => {
if (typeof _crXqjkOU !== 'string') return false;
return /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/_SQENiWEx.test(_crXqjkOU);
},
toLong4: (_crXqjkOU) => _crXqjkOU.split('.').reduce((acc, octet, _SQENiWEx) => acc + (parseInt(octet) << (8*(3-_SQENiWEx))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_crXqjkOU) => {
try {
const _yZoYsAEb = _crXqjkOU.split('/')[0];
const _paxejvqz = _yZoYsAEb.split('::');
if (_paxejvqz._FeRugndO > 2) return 0n;
let _jIoYKziE = [];
if (_paxejvqz[0]) {
_jIoYKziE = _paxejvqz[0].split(':');
}
let _DQWZZuUm = [];
if (_paxejvqz._FeRugndO > 1 && _paxejvqz[1]) {
_DQWZZuUm = _paxejvqz[1].split(':');
}
if (_jIoYKziE._FeRugndO + _DQWZZuUm._FeRugndO > 8) return 0n;
const _aeLDLYaH = 8 - (_jIoYKziE._FeRugndO + _DQWZZuUm._FeRugndO);
const _TifGzdgP = [
..._jIoYKziE,
...Array(_aeLDLYaH).fill('0'),
..._DQWZZuUm
].map(_EGIKdJEY => _EGIKdJEY || '0');
while(_TifGzdgP._FeRugndO < 8) {
_TifGzdgP.push('0');
}
let _YgnxfgQE = 0n;
for (const _EGIKdJEY of _TifGzdgP) {
if (_EGIKdJEY._FeRugndO > 4) return 0n;
const _VoaXlNfT = BigInt('0x' + _EGIKdJEY);
_YgnxfgQE = (_YgnxfgQE << 16n) | _VoaXlNfT;
}
return _YgnxfgQE;
} catch(_BPROTWWr) {
return 0n;
}
},
fromBigInt6: (_YgnxfgQE) => {
if (typeof _YgnxfgQE !== '_YgnxfgQE' || _YgnxfgQE < 0n) return null;
const _paxejvqz = [];
for (let _SQENiWEx = 0; _SQENiWEx < 8; _SQENiWEx++) {
_paxejvqz.unshift((_YgnxfgQE & 0xFFFFn).toString(16));
_YgnxfgQE >>= 16n;
}
let _uiPSnOeE = { start: -1, _CuNCOetC: 0 };
let _GMKwvHNF = { start: -1, _CuNCOetC: 0 };
for (let _SQENiWEx = 0; _SQENiWEx < 8; _SQENiWEx++) {
if (_paxejvqz[_SQENiWEx] === '0') {
if (_GMKwvHNF.start === -1) _GMKwvHNF.start = _SQENiWEx;
_GMKwvHNF._CuNCOetC++;
} else {
if (_GMKwvHNF._CuNCOetC > _uiPSnOeE._CuNCOetC) _uiPSnOeE = { ..._GMKwvHNF };
_GMKwvHNF = { start: -1, _CuNCOetC: 0 };
}
}
if (_GMKwvHNF._CuNCOetC > _uiPSnOeE._CuNCOetC) _uiPSnOeE = { ..._GMKwvHNF };
if (_uiPSnOeE._CuNCOetC > 1) {
_paxejvqz.splice(_uiPSnOeE.start, _uiPSnOeE._CuNCOetC, '');
if (_uiPSnOeE.start === 0) _paxejvqz.unshift('');
if (_uiPSnOeE.start + _uiPSnOeE._CuNCOetC === 8) _paxejvqz.push('');
}
return _paxejvqz.join(':');
},
cidrToRange: (cidr, _kYtxCteg = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _BkyXDiuy = parseInt(bitsStr, 10);
const _jUJiPaHr = new Set();
if (_stMBeTiS.isIPv4(range)) {
if (isNaN(_BkyXDiuy) || _BkyXDiuy < 8 || _BkyXDiuy > 32) return [];
if (_BkyXDiuy === 32) return [range];
const _CZOIvcVJ = _stMBeTiS.toLong4(range);
const _MjPdTmJv = (0xFFFFFFFF << (32 - _BkyXDiuy)) >>> 0;
const _BQWBIWtW = _CZOIvcVJ & _MjPdTmJv;
const _NHlwXUco = 1 << (32 - _BkyXDiuy);
if (_NHlwXUco <= 2) return [];
const _SRDFAvkx = Math.min(_kYtxCteg, _NHlwXUco - 2);
let _brNKNEyJ = 0;
while (_jUJiPaHr.size < _SRDFAvkx && _brNKNEyJ < _SRDFAvkx * 5) {
const _aXbGXJLt = Math.floor(Math.random() * (_NHlwXUco - 2)) + 1;
_jUJiPaHr.add(_stMBeTiS.fromLong4((_BQWBIWtW + _aXbGXJLt) >>> 0));
_brNKNEyJ++;
}
return Array.from(_jUJiPaHr);
} else if (_stMBeTiS.isIPv6(range)) {
if (isNaN(_BkyXDiuy) || _BkyXDiuy < 16 || _BkyXDiuy > 128) return [];
if (_BkyXDiuy === 128) return [range];
const _hFFBXhsa = _stMBeTiS.toBigInt6(range);
const _MjPdTmJv = (2n ** BigInt(128 - _BkyXDiuy) - 1n);
const _BQWBIWtW = _hFFBXhsa & ~_MjPdTmJv;
const _mtIMxQbo = 2n ** BigInt(128 - _BkyXDiuy);
if (_mtIMxQbo <= 2n) return [];
let _brNKNEyJ = 0;
while (_jUJiPaHr.size < _kYtxCteg && _brNKNEyJ < _kYtxCteg * 5) {
const _XTmGYYyN = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_XTmGYYyN);
let _xIIRgxvs = 0n;
for (const _Tccgnxzn of _XTmGYYyN) {
_xIIRgxvs = (_xIIRgxvs << 8n) | BigInt(_Tccgnxzn);
}
const _aXbGXJLt = _xIIRgxvs % (_mtIMxQbo - 2n) + 1n;
_jUJiPaHr.add(_stMBeTiS.fromBigInt6(_BQWBIWtW + _aXbGXJLt));
_brNKNEyJ++;
}
return Array.from(_jUJiPaHr);
}
return [];
} catch(_BPROTWWr) {
console.error(`CIDR to range failed for ${cidr}:`, _BPROTWWr);
return [];
}
}
};
function _UaiPoGJI(_aVTwFhqZ, _XmBKCwyw) {
const _qvdlqhcP = {};
const _txkVDlSk = Object._txkVDlSk(_XmBKCwyw);
const _paxejvqz = _txkVDlSk.map(_lioBRsFm => {
const _kJTgNVAw = _aVTwFhqZ * (_XmBKCwyw[_lioBRsFm] / 100);
return { _lioBRsFm, _kYtxCteg: Math.floor(_kJTgNVAw), remainder: _kJTgNVAw - Math.floor(_kJTgNVAw) };
});
let _fKZPVVJN = _paxejvqz.reduce((acc, _EGIKdJEY) => acc + _EGIKdJEY._kYtxCteg, 0);
_paxejvqz.sort((a, b) => b.remainder - a.remainder);
let _kZOZRMjL = _aVTwFhqZ - _fKZPVVJN;
for (let _SQENiWEx = 0; _SQENiWEx < _kZOZRMjL; _SQENiWEx++) {
_paxejvqz[_SQENiWEx % _paxejvqz._FeRugndO]._kYtxCteg++;
}
for (const _EGIKdJEY of _paxejvqz) {
_qvdlqhcP[_EGIKdJEY._lioBRsFm] = _EGIKdJEY._kYtxCteg;
}
return _qvdlqhcP;
}
const _umlgMWdq = __PAGE_DATA_JSON__;
const _oeXfYgJB = _umlgMWdq._hDYvBjnt;
const _FrsfWntP = _umlgMWdq.status;
const _mztamKXy = __ALL_CF_CIDR_LIST_JSON__;
const _MJbEbTww = __BALANCED_CF_CIDR_LIST_JSON__;
const _fNICHMfn = __DEFAULT_DOMAINS_LIST_JSON__;
const _bboYegsy = __COUNTRY_MAP_JSON__;
const _vQzAlIIk = _bboYegsy;
const _TtekMbWK = 2500;
const _DYaFlVnj = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _GothzxsB = document.getElementById('_GothzxsB');
const _FLpPRVWy = document.getElementById('_FLpPRVWy');
const _hzykhgAh = document.getElementById('status');
const _myyiVBhF = document.getElementById('_myyiVBhF');
const _CXFisxdL = document.getElementById('resultsTable').querySelector('tbody');
const _eiJkUMID = document.getElementById('_eiJkUMID');
const _gofgxsUh = document.getElementById('cachedResultsTable').querySelector('tbody');
const _uBLAJXiH = document.getElementById('notificationTooltip');
const _rnNyKdgO = document.getElementById('_rnNyKdgO');
const _lOoIUZbm = document.getElementById('_lOoIUZbm');
const _PDKfKlQO = document.getElementById('_PDKfKlQO');
const _PWLbkscZ = document.getElementById('_PWLbkscZ');
const _pVBYikyj = document.getElementById('_pVBYikyj');
const _reVawoEG = document.getElementById('_reVawoEG');
const _XjyocvZr = document.getElementById('_XjyocvZr');
let _gUAlvXUn = null;
let _YidTAswB = null;
let _NwvKpIJh = [];
let _UYsOXXfm = false;
let _IIUtofXo = null;
function _aInUtPAo(_WzUMuVqm, _FESEzvqJ) {
const _duUHFXrW=parseInt(_WzUMuVqm.slice(1),16),t=_FESEzvqJ<0?0:255,p=_FESEzvqJ<0?_FESEzvqJ*-1:_FESEzvqJ,R=_duUHFXrW>>16,G=_duUHFXrW>>8&0x00FF,B=_duUHFXrW&0x0000FF;
const _ypjnxJfE = Math.round((t-R)*p)+R;
const _LneQGlin = Math.round((t-G)*p)+G;
const _rlFxABHi = Math.round((t-B)*p)+B;
return `rgb(${_ypjnxJfE.toString()}, ${_LneQGlin.toString()}, ${_rlFxABHi.toString()})`;
}
function _WUCZcnFl(_qLKyHyDP) {
const _aFwExNvx = _jSnQJitt(_qLKyHyDP.primaryColor);
if(_aFwExNvx) {
document.documentElement._RKeWibnq.setProperty('--primary-_wVUUBYYS-rgb', `${_aFwExNvx.r},${_aFwExNvx.g},${_aFwExNvx.b}`);
}
document.documentElement._RKeWibnq.setProperty('--primary-_wVUUBYYS', _qLKyHyDP.primaryColor);
document.documentElement._RKeWibnq.setProperty('--primary-hover', _aInUtPAo(_qLKyHyDP.primaryColor, -0.1));
document.documentElement._RKeWibnq.setProperty('--primary-gradient-start', _aInUtPAo(_qLKyHyDP.primaryColor, 0.1));
document.documentElement._RKeWibnq.setProperty('--primary-gradient-end', _aInUtPAo(_qLKyHyDP.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _qLKyHyDP.texts.title;
document.title = _qLKyHyDP.texts.title;
_rnNyKdgO.innerText = _gUAlvXUn ? _qLKyHyDP.texts.loginButtonSuccess : _qLKyHyDP.texts.loginButton;
_rnNyKdgO._RKeWibnq._wVUUBYYS = _qLKyHyDP.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _qLKyHyDP.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _qLKyHyDP.texts.liveTitle;
document.getElementById('liveTitleEl')._RKeWibnq._wVUUBYYS = _qLKyHyDP.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _qLKyHyDP.texts.cachedTitle;
document.getElementById('cachedTitleEl')._RKeWibnq._wVUUBYYS = _qLKyHyDP.colors.cachedTitle;
const _WfRLIgob = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_WfRLIgob.forEach((_NAnXksen, _dgBBcPZW) => {
const _AKjdAqjG = document.getElementById(_NAnXksen);
if (_AKjdAqjG) _AKjdAqjG.innerText = _qLKyHyDP.texts[`tableHeader${_dgBBcPZW + 1}`] || '';
});
const _SCupjAKf = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_SCupjAKf.forEach((_NAnXksen, _dgBBcPZW) => {
const _AKjdAqjG = document.getElementById(_NAnXksen);
if (_AKjdAqjG) _AKjdAqjG.innerText = _oeXfYgJB.texts[`tableHeader${_dgBBcPZW + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._RKeWibnq._wVUUBYYS = _qLKyHyDP.colors.tableHeader);
document._YwyprKhE.className = '';
document._YwyprKhE.classList.add(_qLKyHyDP.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_qLKyHyDP.theme)) {
document._YwyprKhE.classList.add('glassy-components');
}
document._YwyprKhE._RKeWibnq.backgroundImage = '';
_hRuHFuVc();
if (_qLKyHyDP.theme.includes('particles') || _qLKyHyDP.theme.includes('glass')) {
_GzqNfBEy(_qLKyHyDP.particleColor);
} else if (_qLKyHyDP.theme.includes('bing')) {
document._YwyprKhE._RKeWibnq.backgroundImage = '_cHrNNMzj(/bing-wallpaper)';
}
}
function _VdMGkmaP() {
_gUAlvXUn = null;
if(_YidTAswB) clearTimeout(_YidTAswB);
_WUCZcnFl(_oeXfYgJB);
_sVOaXJMO("登录已超时,请重新登录。", "warning");
}
async function _MzAQVrpR() {
if (_gUAlvXUn) {
_VDBedDJm();
return;
}
const _pyknVMWX = prompt('请输入管理员密码:');
if (!_pyknVMWX) return;
try {
const _DsXEPcWA = await fetch('/api/verify-_aeaQZefC', {
method: 'POST',
_WfRLIgob: { 'Content-Type': 'application/json' },
_YwyprKhE: JSON.stringify({ _aeaQZefC: _pyknVMWX })
});
const _JTZvnnsi = await _DsXEPcWA.json();
if (_JTZvnnsi.success) {
_gUAlvXUn = _pyknVMWX;
_sVOaXJMO("登录成功!有效期5分钟。", "success");
if (_YidTAswB) clearTimeout(_YidTAswB);
_YidTAswB = setTimeout(_VdMGkmaP, 5 * 60 * 1000);
_WUCZcnFl(_oeXfYgJB);
_VDBedDJm();
} else {
throw new Error(_JTZvnnsi._nqAllwNS || '密码验证失败');
}
} catch (_BPROTWWr) {
_sVOaXJMO(`登录失败: ${_BPROTWWr._nqAllwNS}`, "error");
}
}
function _HgvMsRzy() {
if (!_FrsfWntP._QMHkWIFO) {
_reVawoEG._RKeWibnq.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _aeaQZefC = document.getElementById('initialPassword')._VoaXlNfT;
const _hENyEmxM = document.getElementById('confirmPassword')._VoaXlNfT;
if (_aeaQZefC !== _hENyEmxM) {
_sVOaXJMO("两次输入的密码不一致!", "error");
return;
}
if (_aeaQZefC._FeRugndO < 6) {
_sVOaXJMO("密码长度不能少于6位!", "error");
return;
}
try {
const _DsXEPcWA = await fetch('/api/_vFEXzwda-_aeaQZefC', {
method: 'POST',
_WfRLIgob: { 'Content-Type': 'application/json' },
_YwyprKhE: JSON.stringify({ _aeaQZefC })
});
const _JTZvnnsi = await _DsXEPcWA.json();
if (_JTZvnnsi.success) {
_sVOaXJMO(_JTZvnnsi._nqAllwNS, "success");
setTimeout(() => _AZpDmkUO.reload(), 1500);
} else {
throw new Error(_JTZvnnsi._nqAllwNS);
}
} catch(_BPROTWWr) {
_sVOaXJMO(`设置密码失败: ${_BPROTWWr._nqAllwNS}`, "error");
}
});
return;
}
_rnNyKdgO.addEventListener('click', _MzAQVrpR);
document.getElementById('closeModalBtn').addEventListener('click', () => { _lOoIUZbm._RKeWibnq.display = 'none'; });
_lOoIUZbm.addEventListener('click', (_BPROTWWr) => { if (_BPROTWWr.target === _lOoIUZbm) _lOoIUZbm._RKeWibnq.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_tWOVxtgE .fine-grained-_tGqCiPwu-cb').forEach(cb => cb.checked = true);
document.getElementById('disableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('disableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_tWOVxtgE .fine-grained-_tGqCiPwu-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_gUAlvXUn) {
_sVOaXJMO("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _YnUNUYsy = [];
document.querySelectorAll('#custom-fields-_tWOVxtgE .custom-field-_iLKlzVfU').forEach(_iLKlzVfU => {
const _vsikczZD = _iLKlzVfU.querySelector('.custom-field-_vsikczZD')._VoaXlNfT.trim();
const _VoaXlNfT = _iLKlzVfU.querySelector('.custom-field-_VoaXlNfT')._VoaXlNfT.trim();
if (_vsikczZD) _YnUNUYsy.push({ _vsikczZD, _VoaXlNfT });
});
const _YjkzeYpC = [];
document.querySelectorAll('#parameter-sets-_tWOVxtgE .parameter-_vFEXzwda-_iLKlzVfU').forEach(_iLKlzVfU => {
const _vsikczZD = _iLKlzVfU.querySelector('.param-_vFEXzwda-_vsikczZD')._VoaXlNfT.trim();
const _ykxroUpp = _iLKlzVfU.querySelector('.param-_vFEXzwda-_ykxroUpp')._VoaXlNfT.trim();
const _MStXoqrb = _iLKlzVfU.querySelector('.param-_vFEXzwda-_MStXoqrb')._VoaXlNfT.trim();
const _kEQkMAFv = _iLKlzVfU.querySelector('.param-_vFEXzwda-_kEQkMAFv')._VoaXlNfT.trim();
if(_vsikczZD) _YjkzeYpC.push({ _vsikczZD, _ykxroUpp, '_MStXoqrb': _MStXoqrb, _kEQkMAFv });
});
const _wepIeZHT = [];
document.querySelectorAll('#fine-grained-sources-_tWOVxtgE .fine-grained-_xFCzPSMO-_iLKlzVfU').forEach(_iLKlzVfU => {
const _AZpDmkUO = _iLKlzVfU.querySelector('.fine-grained-_AZpDmkUO')._VoaXlNfT.trim();
const _jUJiPaHr = _iLKlzVfU.querySelector('.fine-grained-_jUJiPaHr')._VoaXlNfT.trim();
const _tGqCiPwu = _iLKlzVfU.querySelector('.fine-grained-_tGqCiPwu-cb').checked;
const _PaMitbQX = parseInt(_iLKlzVfU.querySelector('.fine-grained-_PaMitbQX')._VoaXlNfT, 10) || 0;
const _zPINVxBZ = _iLKlzVfU.querySelector('.use-_vsikczZD-as-_AZpDmkUO-cb').checked;
if (_AZpDmkUO && _jUJiPaHr) {
_wepIeZHT.push({ _AZpDmkUO, _jUJiPaHr, _tGqCiPwu, _PaMitbQX, _zPINVxBZ });
}
});
let _phTIAhDf = parseInt(document.getElementById('subscriptionIdLength')._VoaXlNfT, 10);
if (isNaN(_phTIAhDf) || _phTIAhDf < 2) _phTIAhDf = 2;
if (_phTIAhDf > 128) _phTIAhDf = 128;
const _gHPQqkkd = {
theme: document.getElementById('themeSelect')._VoaXlNfT,
primaryColor: document.getElementById('primaryColorInput')._VoaXlNfT,
particleColor: document.getElementById('particleColorInput')._VoaXlNfT,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._VoaXlNfT,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._VoaXlNfT, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._VoaXlNfT, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._VoaXlNfT, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._VoaXlNfT, 10) || 0,
_rtleVQTe: document.getElementById('converterServiceUrlInput')._VoaXlNfT.trim(),
subscriptionId: {
_FeRugndO: _phTIAhDf,
_tLqPieNg: document.getElementById('subscriptionIdCharset')._VoaXlNfT.trim()
},
api: {
_tGqCiPwu: document.getElementById('enableApiCheckbox').checked,
_nqAllwNS: document.getElementById('apiMessageInput')._VoaXlNfT || '维护中...',
},
ispFilter: {
_tGqCiPwu: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._VoaXlNfT, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_tGqCiPwu: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_tGqCiPwu: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_cHrNNMzj: document.getElementById('websocketStreamerUrlInput')._VoaXlNfT.trim()
},
visitorPassword: {
_tGqCiPwu: document.getElementById('enableVisitorPasswordCheckbox').checked,
_aeaQZefC: document.getElementById('visitorPasswordInput')._VoaXlNfT.trim()
},
customSubPath: {
_tGqCiPwu: document.getElementById('enableCustomSubPathCheckbox').checked,
_kEQkMAFv: document.getElementById('customSubPathInput')._VoaXlNfT.trim()
},
itemLink: {
_tGqCiPwu: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._VoaXlNfT,
selectionMode: document.getElementById('parameterSelectionMode')._VoaXlNfT,
_YjkzeYpC: _YjkzeYpC,
_YnUNUYsy: _YnUNUYsy,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._VoaXlNfT.trim(),
},
announcement: {
popup: {
_tGqCiPwu: document.getElementById('enablePopup').checked,
_yWIjfpzu: document.getElementById('announcementText')._VoaXlNfT,
_GFTxJIZc: parseInt(document.getElementById('popupDuration')._VoaXlNfT, 10) || 5
},
marquee: {
_tGqCiPwu: document.getElementById('enableMarquee').checked,
_yWIjfpzu: document.getElementById('announcementText')._VoaXlNfT
}
},
fineGrained: {
_tGqCiPwu: true,
sources: _wepIeZHT
},
customNodes: {
_tGqCiPwu: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._VoaXlNfT
},
texts: {
title: document.getElementById('textInput_title')._VoaXlNfT,
loginButton: document.getElementById('textInput_loginButton')._VoaXlNfT,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._VoaXlNfT,
liveTitle: document.getElementById('textInput_liveTitle')._VoaXlNfT,
cachedTitle: document.getElementById('textInput_cachedTitle')._VoaXlNfT,
},
colors: {
title: document.getElementById('colorInput_title')._VoaXlNfT,
loginButton: document.getElementById('colorInput_loginButton')._VoaXlNfT,
liveTitle: document.getElementById('colorInput_liveTitle')._VoaXlNfT,
cachedTitle: document.getElementById('colorInput_cachedTitle')._VoaXlNfT,
tableHeader: document.getElementById('colorInput_tableHeader')._VoaXlNfT,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._VoaXlNfT.trim(),
chat_id: document.getElementById('chatIdInput')._VoaXlNfT.trim(),
},
};
try {
const _DsXEPcWA = await fetch('/api/_hDYvBjnt', {
method: 'POST',
_WfRLIgob: { 'Content-Type': 'application/json' },
_YwyprKhE: JSON.stringify({ _hDYvBjnt: _gHPQqkkd, adminPassword: _gUAlvXUn })
});
const _JTZvnnsi = await _DsXEPcWA.json();
if (_DsXEPcWA.ok && _JTZvnnsi.success) {
_sVOaXJMO("配置已保存,正在刷新...", "success");
setTimeout(() => _AZpDmkUO.reload(), 1500);
} else {
throw new Error(_JTZvnnsi._nqAllwNS || '未知错误');
}
} catch (_BPROTWWr) {
_sVOaXJMO(`操作失败: ${_BPROTWWr._nqAllwNS}`, "error");
if (String(_BPROTWWr._nqAllwNS).includes("密码错误")) {
_VdMGkmaP();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _aMTpdjPF = document.getElementById('oldPasswordInput')._VoaXlNfT;
const _yhfLakdj = document.getElementById('newPasswordInput')._VoaXlNfT;
if (!_aMTpdjPF || !_yhfLakdj) {
_sVOaXJMO("新旧密码均不能为空!", "error");
return;
}
try {
const _DsXEPcWA = await fetch('/api/change-_aeaQZefC', {
method: 'POST',
_WfRLIgob: { 'Content-Type': 'application/json' },
_YwyprKhE: JSON.stringify({ _aMTpdjPF, _yhfLakdj })
});
const _JTZvnnsi = await _DsXEPcWA.json();
if (_JTZvnnsi.success) {
_sVOaXJMO(_JTZvnnsi._nqAllwNS, "success");
document.getElementById('oldPasswordInput')._VoaXlNfT = '';
document.getElementById('newPasswordInput')._VoaXlNfT = '';
_gUAlvXUn = _yhfLakdj;
} else {
throw new Error(_JTZvnnsi._nqAllwNS);
}
} catch(_BPROTWWr) {
_sVOaXJMO(`修改密码失败: ${_BPROTWWr._nqAllwNS}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_BPROTWWr) => {
document.getElementById('resolvedDomainsGroup')._RKeWibnq.display = _BPROTWWr.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_BPROTWWr) => {
document.getElementById('customNodesGroup')._RKeWibnq.display = _BPROTWWr.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_BPROTWWr) => {
document.getElementById('apiConfigGroup')._RKeWibnq.display = _BPROTWWr.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_BPROTWWr) => {
document.getElementById('itemLinkConfigGroup')._RKeWibnq.display = _BPROTWWr.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_BPROTWWr) => {
document.getElementById('websocketStreamerGroup')._RKeWibnq.display = _BPROTWWr.target.checked ? 'block' : 'none';
const _DnspBxXN = document.querySelector('#parameter-sets-_tWOVxtgE .param-_vFEXzwda-_kEQkMAFv');
if (_DnspBxXN) {
if (_BPROTWWr.target.checked) {
_DnspBxXN._VoaXlNfT = '/snippets?_crXqjkOU=endpointAddress:_jUOeZlRe(443)&nat64=6to4';
} else {
_DnspBxXN._VoaXlNfT = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_zsvvtVtF('', '');
});
document.getElementById('add-parameter-_vFEXzwda-btn').addEventListener('click', () => {
const _kYtxCteg = document.querySelectorAll('.parameter-_vFEXzwda-_iLKlzVfU')._FeRugndO + 1;
_gWFefNVm({_vsikczZD: `配置${_kYtxCteg}`, _ykxroUpp: '', _MStXoqrb: '', _kEQkMAFv: ''});
_zwiyrjvm();
});
document.getElementById('add-fine-grained-_xFCzPSMO-btn').addEventListener('click', () => {
_SEdyhArq({ _AZpDmkUO: '', _jUJiPaHr: '', _tGqCiPwu: true, _PaMitbQX: 50, _zPINVxBZ: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_BPROTWWr) => {
document.getElementById('visitorPasswordGroup')._RKeWibnq.display = _BPROTWWr.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_BPROTWWr) => {
document.getElementById('customSubPathGroup')._RKeWibnq.display = _BPROTWWr.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_BPROTWWr) => {
document.getElementById('popupDurationContainer')._RKeWibnq.display = _BPROTWWr.target.checked ? 'flex' : 'none';
});
}
function _zsvvtVtF(_vsikczZD, _VoaXlNfT) {
const _tWOVxtgE = document.getElementById('custom-fields-_tWOVxtgE');
const _RaygvaHj = document.createElement('div');
_RaygvaHj.className = 'form-grid custom-field-_iLKlzVfU';
_RaygvaHj._RKeWibnq = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_RaygvaHj.innerHTML = `
<input _mKpsivbt="_yWIjfpzu" class="custom-field-_vsikczZD" _tyfgxOXR="占位符名称" _VoaXlNfT="${_vsikczZD}">
<input _mKpsivbt="_yWIjfpzu" class="custom-field-_VoaXlNfT" _tyfgxOXR="值" _VoaXlNfT="${_VoaXlNfT}">
<button _mKpsivbt="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_tWOVxtgE.appendChild(_RaygvaHj);
}
function _gWFefNVm(_vFEXzwda) {
const _tWOVxtgE = document.getElementById('parameter-sets-_tWOVxtgE');
const _RaygvaHj = document.createElement('div');
_RaygvaHj.className = 'parameter-_vFEXzwda-_iLKlzVfU';
_RaygvaHj.innerHTML = `
<div class="parameter-_vFEXzwda-_rzStHawC">
<input _mKpsivbt="_yWIjfpzu" class="param-_vFEXzwda-_vsikczZD" _tyfgxOXR="配置名称" _VoaXlNfT="${_vFEXzwda._vsikczZD}" oninput="_zwiyrjvm()">
<button _mKpsivbt="button" class="btn btn-outline" onclick="this.closest('.parameter-_vFEXzwda-_iLKlzVfU').remove(); _zwiyrjvm();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _mKpsivbt="_yWIjfpzu" class="param-_vFEXzwda-_ykxroUpp" _VoaXlNfT="${_vFEXzwda._ykxroUpp || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _mKpsivbt="_yWIjfpzu" class="param-_vFEXzwda-_MStXoqrb" _VoaXlNfT="${_vFEXzwda['_MStXoqrb'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _mKpsivbt="_yWIjfpzu" class="param-_vFEXzwda-_kEQkMAFv" _VoaXlNfT="${_vFEXzwda._kEQkMAFv || ''}"></div>
</div>
`;
_tWOVxtgE.appendChild(_RaygvaHj);
}
function _zwiyrjvm() {
const _UwROHVjQ = document.getElementById('parameterSelectionMode');
const _gcxtyPbQ = _UwROHVjQ._VoaXlNfT;
_UwROHVjQ.innerHTML = '';
const _MDGZEceI = document.createElement('_RXwKTZeu');
_MDGZEceI._VoaXlNfT = 'random';
_MDGZEceI.textContent = '随机轮询';
_UwROHVjQ.appendChild(_MDGZEceI);
const _xizYcSIk = document.createElement('_RXwKTZeu');
_xizYcSIk._VoaXlNfT = 'first';
_xizYcSIk.textContent = '使用第一组';
_UwROHVjQ.appendChild(_xizYcSIk);
document.querySelectorAll('.param-_vFEXzwda-_vsikczZD').forEach(input => {
const _vsikczZD = input._VoaXlNfT.trim();
if (_vsikczZD) {
const _RXwKTZeu = document.createElement('_RXwKTZeu');
_RXwKTZeu._VoaXlNfT = _vsikczZD;
_RXwKTZeu.textContent = `指定: ${_vsikczZD}`;
_UwROHVjQ.appendChild(_RXwKTZeu);
}
});
if (Array.from(_UwROHVjQ.options).some(opt => opt._VoaXlNfT === _gcxtyPbQ)) {
_UwROHVjQ._VoaXlNfT = _gcxtyPbQ;
} else {
_UwROHVjQ._VoaXlNfT = 'random';
}
}
function _SEdyhArq(_xFCzPSMO) {
const _tWOVxtgE = document.getElementById('fine-grained-sources-_tWOVxtgE');
const _RaygvaHj = document.createElement('div');
_RaygvaHj.className = 'fine-grained-_xFCzPSMO-_iLKlzVfU parameter-_vFEXzwda-_iLKlzVfU';
_RaygvaHj._RKeWibnq.padding = '1rem';
const _iKXOzOPs = _xFCzPSMO._zPINVxBZ ? 'checked' : '';
const _YcfDTnuO = !_xFCzPSMO._zPINVxBZ ? 'checked' : '';
const _RjLHSpVh = _xFCzPSMO._tGqCiPwu ? 'checked' : '';
_RaygvaHj.innerHTML = `
<div _RKeWibnq="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _mKpsivbt="_yWIjfpzu" class="fine-grained-_AZpDmkUO" _tyfgxOXR="地区名称 (如: 香港)" _VoaXlNfT="${_xFCzPSMO._AZpDmkUO || ''}">
<div _RKeWibnq="display: flex; align-items: center; gap: 5px;"><input _mKpsivbt="checkbox" class="fine-grained-_tGqCiPwu-cb" ${_RjLHSpVh}><label>启用</label></div>
<button _mKpsivbt="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_xFCzPSMO-_iLKlzVfU').remove()">删除</button>
</div>
<textarea class="fine-grained-_jUJiPaHr" _tyfgxOXR="IP源 (每行一个IP、CIDR或URL)" _tABvinYh="3" _RKeWibnq="_XBhJLFoI:100%;">${_xFCzPSMO._jUJiPaHr || ''}</textarea>
<div class="fine-grained-options" _RKeWibnq="justify-_AcCXdbrf: space-between;">
<div _RKeWibnq="display: flex; gap: 1rem;">
<label><input _mKpsivbt="checkbox" class="query-_UmsSfvpp-cb" ${_YcfDTnuO}>查询真实归属地</label>
<label><input _mKpsivbt="checkbox" class="use-_vsikczZD-as-_AZpDmkUO-cb" ${_iKXOzOPs}>使用地区名称作为归属地</label>
</div>
<div _RKeWibnq="display: flex; align-items: center; gap: 5px;"><input _mKpsivbt="number" class="fine-grained-_PaMitbQX _PaMitbQX-input" _VoaXlNfT="${_xFCzPSMO._PaMitbQX || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _chBOQLiV = _RaygvaHj.querySelector('.query-_UmsSfvpp-cb');
const _yVnqnxNg = _RaygvaHj.querySelector('.use-_vsikczZD-as-_AZpDmkUO-cb');
_chBOQLiV.addEventListener('change', () => {
if (_chBOQLiV.checked) {
_yVnqnxNg.checked = false;
} else if (!_yVnqnxNg.checked) {
_chBOQLiV.checked = true;
}
});
_yVnqnxNg.addEventListener('change', () => {
if (_yVnqnxNg.checked) {
_chBOQLiV.checked = false;
} else if (!_yVnqnxNg.checked) {
_yVnqnxNg.checked = true;
}
});
_tWOVxtgE.appendChild(_RaygvaHj);
}
function _VDBedDJm() {
const _qLKyHyDP = _oeXfYgJB;
document.getElementById('themeSelect')._VoaXlNfT = _qLKyHyDP.theme;
document.getElementById('primaryColorInput')._VoaXlNfT = _qLKyHyDP.primaryColor;
document.getElementById('particleColorInput')._VoaXlNfT = _qLKyHyDP.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _qLKyHyDP.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._tyfgxOXR = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._VoaXlNfT = _qLKyHyDP.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._RKeWibnq.display = _qLKyHyDP.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _qLKyHyDP.customNodes._tGqCiPwu;
document.getElementById('customNodesInput')._VoaXlNfT = _qLKyHyDP.customNodes.list || '';
document.getElementById('customNodesGroup')._RKeWibnq.display = _qLKyHyDP.customNodes._tGqCiPwu ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._VoaXlNfT = _qLKyHyDP._rtleVQTe || '';
document.getElementById('subscriptionIdLength')._VoaXlNfT = _qLKyHyDP.subscriptionId._FeRugndO;
document.getElementById('subscriptionIdCharset')._VoaXlNfT = _qLKyHyDP.subscriptionId._tLqPieNg;
document.getElementById('enableItemLinkCheckbox').checked = _qLKyHyDP.itemLink._tGqCiPwu;
document.getElementById('itemLinkConfigGroup')._RKeWibnq.display = _qLKyHyDP.itemLink._tGqCiPwu ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._VoaXlNfT = _qLKyHyDP.itemLink.template;
const _IjukpWSo = document.getElementById('parameter-sets-_tWOVxtgE');
_IjukpWSo.innerHTML = '';
if (_qLKyHyDP.itemLink._YjkzeYpC && Array.isArray(_qLKyHyDP.itemLink._YjkzeYpC)) {
_qLKyHyDP.itemLink._YjkzeYpC.forEach(_vFEXzwda => _gWFefNVm(_vFEXzwda));
}
_zwiyrjvm();
document.getElementById('parameterSelectionMode')._VoaXlNfT = _qLKyHyDP.itemLink.selectionMode || 'random';
const _DnspBxXN = document.querySelector('#parameter-sets-_tWOVxtgE .param-_vFEXzwda-_kEQkMAFv');
if (_DnspBxXN && _qLKyHyDP.websocketStreamer && _qLKyHyDP.websocketStreamer._tGqCiPwu) {
_DnspBxXN._VoaXlNfT = '/snippets?_crXqjkOU=endpointAddress:_jUOeZlRe(443)&nat64=6to4';
}
const _FJLliKKL = document.getElementById('custom-fields-_tWOVxtgE');
_FJLliKKL.innerHTML = '';
if (_qLKyHyDP.itemLink._YnUNUYsy && Array.isArray(_qLKyHyDP.itemLink._YnUNUYsy)) {
_qLKyHyDP.itemLink._YnUNUYsy.forEach(field => _zsvvtVtF(field._vsikczZD, field._VoaXlNfT));
}
document.getElementById('universalFallbackAddressInput')._VoaXlNfT = _qLKyHyDP.dataFeeds.universalFallbackAddress || '';
const _hIJbVbjO = _qLKyHyDP.websocketStreamer && _qLKyHyDP.websocketStreamer._tGqCiPwu;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _hIJbVbjO;
document.getElementById('websocketStreamerUrlInput')._VoaXlNfT = _qLKyHyDP.websocketStreamer ? _qLKyHyDP.websocketStreamer._cHrNNMzj : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._RKeWibnq.display = _hIJbVbjO ? 'block' : 'none';
const _MJkcNffA = _qLKyHyDP.announcement || {};
document.getElementById('announcementText')._VoaXlNfT = (_MJkcNffA.popup && _MJkcNffA.popup._yWIjfpzu) || (_MJkcNffA.marquee && _MJkcNffA.marquee._yWIjfpzu) || '';
document.getElementById('enableMarquee').checked = _MJkcNffA.marquee && _MJkcNffA.marquee._tGqCiPwu;
document.getElementById('enablePopup').checked = _MJkcNffA.popup && _MJkcNffA.popup._tGqCiPwu;
document.getElementById('popupDuration')._VoaXlNfT = (_MJkcNffA.popup && _MJkcNffA.popup._GFTxJIZc) || 5;
document.getElementById('popupDurationContainer')._RKeWibnq.display = (_MJkcNffA.popup && _MJkcNffA.popup._tGqCiPwu) ? 'flex' : 'none';
const _FoKLSVxp = document.getElementById('fine-grained-sources-_tWOVxtgE');
_FoKLSVxp.innerHTML = '';
if (_qLKyHyDP.fineGrained.sources && Array.isArray(_qLKyHyDP.fineGrained.sources)) {
_qLKyHyDP.fineGrained.sources.forEach(_xFCzPSMO => _SEdyhArq(_xFCzPSMO));
}
document.getElementById('sampleSizeInput')._VoaXlNfT = _qLKyHyDP.sampleSize;
document.getElementById('topNInput')._VoaXlNfT = _qLKyHyDP.topN;
document.getElementById('latencyRangeMinInput')._VoaXlNfT = _qLKyHyDP.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._VoaXlNfT = _qLKyHyDP.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _qLKyHyDP.ispFilter._tGqCiPwu;
const _inonZlLj = _qLKyHyDP.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._VoaXlNfT = _inonZlLj.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _inonZlLj.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _qLKyHyDP.streamer._tGqCiPwu;
document.getElementById('enableApiCheckbox').checked = _qLKyHyDP.api._tGqCiPwu;
document.getElementById('apiConfigGroup')._RKeWibnq.display = _qLKyHyDP.api._tGqCiPwu ? 'block' : 'none';
document.getElementById('apiMessageInput')._VoaXlNfT = _qLKyHyDP.api._nqAllwNS;
const _sbuVEKAU = _qLKyHyDP.customSubPath && _qLKyHyDP.customSubPath._tGqCiPwu;
document.getElementById('enableCustomSubPathCheckbox').checked = _sbuVEKAU;
document.getElementById('customSubPathInput')._VoaXlNfT = _qLKyHyDP.customSubPath ? _qLKyHyDP.customSubPath._kEQkMAFv : 'latest';
document.getElementById('customSubPathGroup')._RKeWibnq.display = _sbuVEKAU ? 'block' : 'none';
const _gpjYPRrU = _qLKyHyDP.visitorPassword && _qLKyHyDP.visitorPassword._tGqCiPwu;
document.getElementById('enableVisitorPasswordCheckbox').checked = _gpjYPRrU;
document.getElementById('visitorPasswordInput')._VoaXlNfT = _qLKyHyDP.visitorPassword ? _qLKyHyDP.visitorPassword._aeaQZefC : '';
document.getElementById('visitorPasswordGroup')._RKeWibnq.display = _gpjYPRrU ? 'block' : 'none';
document.getElementById('textInput_title')._VoaXlNfT = _qLKyHyDP.texts.title;
document.getElementById('textInput_loginButton')._VoaXlNfT = _qLKyHyDP.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._VoaXlNfT = _qLKyHyDP.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._VoaXlNfT = _qLKyHyDP.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._VoaXlNfT = _qLKyHyDP.texts.cachedTitle;
document.getElementById('colorInput_title')._VoaXlNfT = _qLKyHyDP.colors.title;
document.getElementById('colorInput_loginButton')._VoaXlNfT = _qLKyHyDP.colors.loginButton;
document.getElementById('colorInput_liveTitle')._VoaXlNfT = _qLKyHyDP.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._VoaXlNfT = _qLKyHyDP.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._VoaXlNfT = _qLKyHyDP.colors.tableHeader;
document.getElementById('botTokenInput')._VoaXlNfT = _qLKyHyDP.telegram.bot_token || '';
document.getElementById('chatIdInput')._VoaXlNfT = _qLKyHyDP.telegram.chat_id || '';
_lOoIUZbm._RKeWibnq.display = 'flex';
}
function _YaNYaoJO(_cqWShYHM) {
if (window.innerWidth <= 768) {
const _tABvinYh = _cqWShYHM.querySelectorAll('thead tr, tbody tr');
_tABvinYh.forEach(_iLKlzVfU => {
const _VCFdmaUv = Array.from(_iLKlzVfU.children);
const _wbIJbCWZ = [
_VCFdmaUv[0],
_VCFdmaUv[1],
_VCFdmaUv[3],
_VCFdmaUv[6],
_VCFdmaUv[2],
_VCFdmaUv[4],
_VCFdmaUv[5]
];
_wbIJbCWZ.forEach(cell => _iLKlzVfU.appendChild(cell));
});
}
}
async function _YXQXHmRF() {
if (!_FrsfWntP._QMHkWIFO) {
_HgvMsRzy();
return;
}
if (_oeXfYgJB.announcement && _oeXfYgJB.announcement.marquee && _oeXfYgJB.announcement.marquee._tGqCiPwu && _oeXfYgJB.announcement.marquee._yWIjfpzu) {
const _gGMgdhyp = document.getElementById('marquee-_tWOVxtgE');
const _YymDbmSE = document.getElementById('marquee-_yWIjfpzu');
const _TIamIjop = document.querySelector('.progress-section');
if (_gGMgdhyp && _YymDbmSE && _TIamIjop) {
_YymDbmSE.innerText = _oeXfYgJB.announcement.marquee._yWIjfpzu;
_gGMgdhyp._RKeWibnq.display = 'block';
const _wSKVhOeg = () => {
_gGMgdhyp._RKeWibnq._XBhJLFoI = `${_TIamIjop.offsetWidth}px`;
const _qDPhVtrA = _YymDbmSE.offsetWidth;
const _fOjjqJHx = _gGMgdhyp.offsetWidth;
const _GFTxJIZc = (_qDPhVtrA + _fOjjqJHx) / 100;
_YymDbmSE._RKeWibnq.animationDuration = `${Math.max(10, _GFTxJIZc)}s`;
};
_wSKVhOeg();
window.addEventListener('resize', _wSKVhOeg);
}
}
_WUCZcnFl(_oeXfYgJB);
if (_oeXfYgJB.announcement && _oeXfYgJB.announcement.popup && _oeXfYgJB.announcement.popup._tGqCiPwu && _oeXfYgJB.announcement.popup._yWIjfpzu) {
setTimeout(() => {
_sVOaXJMO(_oeXfYgJB.announcement.popup._yWIjfpzu, 'info', _oeXfYgJB.announcement.popup._GFTxJIZc * 1000);
}, 500);
}
_HgvMsRzy();
_dopvrbIL();
_eclgHHNE();
_VdyhRGqF();
await _MHysdFor();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _TgktOiBu = window._AZpDmkUO.origin + '/_crXqjkOU';
navigator.clipboard.writeText(_TgktOiBu).then(() => {
_sVOaXJMO('IP 列表 API 地址已复制!', 'success');
});
});
if (_oeXfYgJB.visitorPassword && _oeXfYgJB.visitorPassword._tGqCiPwu) {
_GothzxsB._RKeWibnq.display = 'none';
const _EqXdpvcm = document.getElementById('visitorPasswordPrompt');
_EqXdpvcm._RKeWibnq.display = 'block';
const _TGeJDWjT = document.getElementById('visitorPasswordEntry');
const _tDZRLVNO = document.getElementById('startTestWithPasswordBtn');
const _ZNAwxNNf = async () => {
const _aeaQZefC = _TGeJDWjT._VoaXlNfT;
if (!_aeaQZefC) {
_sVOaXJMO('请输入访客密码', 'warning');
return;
}
try {
const _DsXEPcWA = await fetch('/api/verify-visitor-_aeaQZefC', {
method: 'POST',
_WfRLIgob: { 'Content-Type': 'application/json' },
_YwyprKhE: JSON.stringify({ _aeaQZefC })
});
const _JTZvnnsi = await _DsXEPcWA.json();
if (_DsXEPcWA.ok && _JTZvnnsi.success) {
_sVOaXJMO('验证成功,开始测试...', 'success');
_EqXdpvcm._RKeWibnq.display = 'none';
_GothzxsB._RKeWibnq.display = 'block';
await _NHSDTYYV();
} else {
throw new Error(_JTZvnnsi._nqAllwNS || '密码错误');
}
} catch (_BPROTWWr) {
_sVOaXJMO(`验证失败: ${_BPROTWWr._nqAllwNS}`, "error");
_TGeJDWjT._VoaXlNfT = '';
_TGeJDWjT.focus();
}
};
_tDZRLVNO.addEventListener('click', _ZNAwxNNf);
_TGeJDWjT.addEventListener('keypress', (_BPROTWWr) => {
if (_BPROTWWr._lioBRsFm === 'Enter') {
_BPROTWWr.preventDefault();
_ZNAwxNNf();
}
});
_TGeJDWjT.focus();
} else {
_hzykhgAh.textContent = "页面加载完成,准备开始测试...";
await _cUbQqLIX(100);
await _NHSDTYYV();
}
}
async function _cUbQqLIX(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _jSnQJitt(_WzUMuVqm) {
let _JTZvnnsi = /^#?([a-_duUHFXrW\d]{2})([a-_duUHFXrW\d]{2})([a-_duUHFXrW\d]{2})$/_SQENiWEx.exec(_WzUMuVqm);
return _JTZvnnsi ? { r: parseInt(_JTZvnnsi[1], 16), g: parseInt(_JTZvnnsi[2], 16), b: parseInt(_JTZvnnsi[3], 16) } : null;
}
async function _fBruUtlE(_crXqjkOU) {
const _UbsPvOhY = new AbortController();
const _dZObhLIh = setTimeout(() => _UbsPvOhY.abort(), _TtekMbWK);
const _HVbWzSGk = Date.now();
try {
const _gVFBBLKt = _stMBeTiS.isIPv6(_crXqjkOU) ? `[${_crXqjkOU}]` : _crXqjkOU;
const _cHrNNMzj = `https://${_gVFBBLKt}/cdn-cgi/trace`;
await fetch(_cHrNNMzj, {
signal: _UbsPvOhY.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._vsikczZD === 'AbortError') {
return { _crXqjkOU, _eMvLegdm: Infinity, error: '超时' };
}
} finally {
clearTimeout(_dZObhLIh);
}
const _eMvLegdm = Date.now() - _HVbWzSGk;
return { _crXqjkOU, _eMvLegdm: _eMvLegdm, error: null };
}
function _TCjOayFL(_JTZvnnsi, _dgBBcPZW) {
const { itemLink } = _oeXfYgJB;
if (!itemLink || !itemLink._tGqCiPwu) return null;
const { template, _YjkzeYpC, selectionMode, _YnUNUYsy } = itemLink;
if (!_YjkzeYpC || _YjkzeYpC._FeRugndO === 0) return null;
let _NuSIdUyy;
if (selectionMode === 'random') {
_NuSIdUyy = _YjkzeYpC[_dgBBcPZW % _YjkzeYpC._FeRugndO];
} else if (selectionMode === 'first') {
_NuSIdUyy = _YjkzeYpC[0];
} else {
_NuSIdUyy = _YjkzeYpC.find(s => s._vsikczZD === selectionMode) || _YjkzeYpC[0];
}
if (!_NuSIdUyy) return null;
let _kgEjHFTC = template;
const _gRRRTUFr = _JTZvnnsi._jUOeZlRe || 443;
const _AmXkuuwf = _stMBeTiS.isIPv6(_JTZvnnsi._crXqjkOU) ? `[${_JTZvnnsi._crXqjkOU}]` : _JTZvnnsi._crXqjkOU;
let _vsikczZD = `${_dgBBcPZW + 1} 、 ${_JTZvnnsi._AZpDmkUO || '未知'}`;
if (!_JTZvnnsi._mfWKsbyZ || !_JTZvnnsi._mfWKsbyZ.toLowerCase().includes('cloudflare')) {
_vsikczZD += '(反代)';
}
let _ykxroUpp = _NuSIdUyy._ykxroUpp || window._AZpDmkUO._nBqdOqpp;
_kgEjHFTC = _kgEjHFTC.replace(/{_crXqjkOU}/g, _AmXkuuwf)
.replace(/{_jUOeZlRe}/g, _gRRRTUFr)
.replace(/{_vsikczZD}/g, encodeURIComponent(_vsikczZD))
.replace(/{rank}/g, _dgBBcPZW + 1)
.replace(/{_AZpDmkUO}/g, encodeURIComponent(_JTZvnnsi._AZpDmkUO || '未知'))
.replace(/{_mfWKsbyZ}/g, encodeURIComponent(_JTZvnnsi._mfWKsbyZ || '未知'))
.replace(/{_ykxroUpp}/g, encodeURIComponent(_ykxroUpp))
.replace(/{_MStXoqrb}/g, encodeURIComponent(_NuSIdUyy['_MStXoqrb'] || ''))
.replace(/{_kEQkMAFv}/g, encodeURIComponent(encodeURIComponent(_NuSIdUyy._kEQkMAFv || '')));
if (_YnUNUYsy) {
_YnUNUYsy.forEach(field => {
const _tyfgxOXR = new RegExp('{' + field._vsikczZD + '}', 'g');
_kgEjHFTC = _kgEjHFTC.replace(_tyfgxOXR, encodeURIComponent(field._VoaXlNfT));
});
}
return _kgEjHFTC;
}
function _JjuHZMEG(_GyNtwmdV, _knEFsjXB, isCached = false) {
_knEFsjXB.innerHTML = '';
const _SAjsptcd = _GyNtwmdV._SAjsptcd || [];
const _usJtLmNY = _GyNtwmdV.generatedBy || null;
const _IldkLxQU = isCached ? _eiJkUMID : _myyiVBhF;
const _CbhcSfJO = isCached ? (_eiJkUMID.querySelector('.generator-info')) : (_myyiVBhF.querySelector('.generator-info'));
if (_SAjsptcd._FeRugndO === 0) {
_IldkLxQU._RKeWibnq.display = 'none';
if (!isCached) _XjyocvZr._RKeWibnq.display = 'none';
if (_CbhcSfJO) _CbhcSfJO.textContent = '';
return;
}
_IldkLxQU._RKeWibnq.display = 'block';
if (!isCached && _SAjsptcd._FeRugndO > 0) {
_XjyocvZr._RKeWibnq.display = 'block';
}
if (_CbhcSfJO && _usJtLmNY) {
_CbhcSfJO.innerHTML = `数据来源 ${_usJtLmNY._crXqjkOU} (${_usJtLmNY._AZpDmkUO}) <span>${_usJtLmNY.time}</span>`;
}
_SAjsptcd.forEach((_JTZvnnsi, _dgBBcPZW) => {
const _gRRRTUFr = _JTZvnnsi._jUOeZlRe || 443;
const _iLKlzVfU = _knEFsjXB.insertRow();
_iLKlzVfU.insertCell().textContent = _dgBBcPZW + 1;
const _QNxhwqnx = _iLKlzVfU.insertCell();
_QNxhwqnx.textContent = _JTZvnnsi._crXqjkOU;
_QNxhwqnx.className = '_crXqjkOU-_NAyBYBNm';
_iLKlzVfU.insertCell().textContent = _gRRRTUFr;
const _WaIsdlYa = _iLKlzVfU.insertCell();
_WaIsdlYa.textContent = (_JTZvnnsi._eMvLegdm === Infinity) ? (_JTZvnnsi.error || '错误') : _JTZvnnsi._eMvLegdm;
_WaIsdlYa.className = 'ping-_VoaXlNfT';
_iLKlzVfU.insertCell().textContent = _JTZvnnsi._AZpDmkUO || '未知';
_iLKlzVfU.insertCell().textContent = _JTZvnnsi._mfWKsbyZ || '未知';
const _VsvhjBby = _iLKlzVfU.insertCell();
_VsvhjBby.className = 'actions-cell';
const _ltVFhTtQ = document.createElement('button');
_ltVFhTtQ.textContent = '复制IP';
_ltVFhTtQ.className = 'btn btn-outline';
_ltVFhTtQ.onclick = () => { navigator.clipboard.writeText(_JTZvnnsi._crXqjkOU).then(() => _sVOaXJMO('IP复制成功!', 'success')); };
if (_oeXfYgJB.itemLink && _oeXfYgJB.itemLink._tGqCiPwu) {
const _XWBrcCZk = document.createElement('button');
_XWBrcCZk.textContent = '复制节点';
_XWBrcCZk.className = 'btn btn-outline';
_XWBrcCZk.onclick = () => {
const _kgEjHFTC = _TCjOayFL(_JTZvnnsi, _dgBBcPZW);
if (_kgEjHFTC) {
navigator.clipboard.writeText(_kgEjHFTC).then(() => _sVOaXJMO('订阅链接复制成功!', 'success'));
}
};
_VsvhjBby.appendChild(_XWBrcCZk);
}
_VsvhjBby.appendChild(_ltVFhTtQ);
});
_YaNYaoJO(_knEFsjXB.parentElement);
}
async function _pijlsqFB(_VdlAkVrI) {
const _XqqneRRP = (_VdlAkVrI || '').trim().split(/\s+|\n+/).filter(Boolean);
const _QOEbCjNH = [];
const _SVIGmMfY = [];
const _aOaDfivd = (str) => {
try {
const _cHrNNMzj = new URL(str);
return _cHrNNMzj.protocol === "http:" || _cHrNNMzj.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _TjqoyrNY of _XqqneRRP) {
if (_aOaDfivd(_TjqoyrNY)) {
_QOEbCjNH.push(_TjqoyrNY);
} else {
_SVIGmMfY.push(_TjqoyrNY);
}
}
let _QqIKNUrM = [];
if (_QOEbCjNH._FeRugndO > 0) {
try {
const _DsXEPcWA = await fetch('/api/parse-_jUJiPaHr-from-_QOEbCjNH', {
method: 'POST',
_WfRLIgob: { 'Content-Type': 'application/json' },
_YwyprKhE: JSON.stringify({ _QOEbCjNH })
});
if (_DsXEPcWA.ok) {
const _GyNtwmdV = await _DsXEPcWA.json();
_QqIKNUrM = _GyNtwmdV._jUJiPaHr || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _DsXEPcWA._yWIjfpzu());
_sVOaXJMO('从URL获取IP失败', 'error');
}
} catch (_BPROTWWr) {
console.error('Error fetching IPs from URLs:', _BPROTWWr);
_sVOaXJMO(`从URL获取IP失败: ${_BPROTWWr._nqAllwNS}`, 'error');
}
}
return [..._SVIGmMfY, ..._QqIKNUrM];
}
async function _NHSDTYYV() {
_UYsOXXfm = false;
_NwvKpIJh = [];
_IIUtofXo = null;
_XjyocvZr._RKeWibnq.display = 'none';
_hzykhgAh.textContent = '准备IP源...';
_FLpPRVWy._VoaXlNfT = 0;
_myyiVBhF._RKeWibnq.display = 'none';
await _cUbQqLIX();
const _nIvAKBpq = new Map();
let _BKMxApnz = [];
const _FmiWVNwW = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_oeXfYgJB.useResolvedDomains) {
_hzykhgAh.textContent = '正在从域名解析IP...';
const _BZXtLMKA = (_oeXfYgJB.resolvedDomains || '').trim();
const _LBkbRYDE = _BZXtLMKA ? _BZXtLMKA.split(/\s+|\n+/) : _fNICHMfn;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_jUJiPaHr', { method: 'POST', _WfRLIgob: { 'Content-Type': 'application/json' }, _YwyprKhE: JSON.stringify({ _LBkbRYDE, _mKpsivbt: 'A' }) }),
fetch('/api/get-resolved-_jUJiPaHr', { method: 'POST', _WfRLIgob: { 'Content-Type': 'application/json' }, _YwyprKhE: JSON.stringify({ _LBkbRYDE, _mKpsivbt: 'AAAA' }) })
]);
let _ssPkdlSa = [];
if (ipv4Response.ok) _ssPkdlSa.push(...(await ipv4Response._yWIjfpzu()).split(/\s+|\n+/));
if (ipv6Response.ok) _ssPkdlSa.push(...(await ipv6Response._yWIjfpzu()).split(/\s+|\n+/));
_BKMxApnz.push(..._ssPkdlSa.filter(_crXqjkOU => _crXqjkOU.trim()).map(_crXqjkOU => ({ _crXqjkOU, _jUOeZlRe: null, sourceName: 'resolved' })));
} catch (_BPROTWWr) {
_sVOaXJMO(`域名解析失败: ${_BPROTWWr._nqAllwNS}`, 'error');
}
}
const _dUbbZeab = (_oeXfYgJB.fineGrained.sources || []).filter(s => s._tGqCiPwu);
if (_dUbbZeab._FeRugndO > 0) {
const _CaWUHoDg = {};
let _RWsnAwik = 0;
_dUbbZeab.forEach(s => {
const _VQKftBGG = Number(s._PaMitbQX) || 0;
_CaWUHoDg[s._AZpDmkUO] = _VQKftBGG;
_RWsnAwik += _VQKftBGG;
});
if (_RWsnAwik > 0) {
Object._txkVDlSk(_CaWUHoDg).forEach(k => {
_CaWUHoDg[k] = (_CaWUHoDg[k] / _RWsnAwik) * 100;
});
} else {
_dUbbZeab.forEach(s => _CaWUHoDg[s._AZpDmkUO] = 100 / _dUbbZeab._FeRugndO);
}
const _scokWMsy = _UaiPoGJI(_oeXfYgJB.sampleSize, _CaWUHoDg);
for (const _xFCzPSMO of _dUbbZeab) {
const _kYtxCteg = _scokWMsy[_xFCzPSMO._AZpDmkUO];
if (!_kYtxCteg) continue;
_hzykhgAh.textContent = `正在处理 [ ${_xFCzPSMO._AZpDmkUO} ] 源...`;
const _uRIcmApN = await _pijlsqFB(_xFCzPSMO._jUJiPaHr);
if (_xFCzPSMO._zPINVxBZ) {
_uRIcmApN.forEach(_TjqoyrNY => _nIvAKBpq._vFEXzwda(_TjqoyrNY, _xFCzPSMO._AZpDmkUO));
}
let _awTELnNI = [];
const _GXpjTLlT = Math.ceil(_kYtxCteg / (_uRIcmApN._FeRugndO || 1)) || 1;
for (const _TjqoyrNY of _uRIcmApN) {
if (_FmiWVNwW.test(_TjqoyrNY)) {
const _vkOCgjtg = _stMBeTiS.cidrToRange(_TjqoyrNY, _GXpjTLlT);
if (_nIvAKBpq.has(_TjqoyrNY)) {
_vkOCgjtg.forEach(_crXqjkOU => _nIvAKBpq._vFEXzwda(_crXqjkOU, _nIvAKBpq.get(_TjqoyrNY)));
}
_awTELnNI.push(..._vkOCgjtg.map(_crXqjkOU => ({ _crXqjkOU, _jUOeZlRe: null })));
} else {
const _pkEsfTgo = _TjqoyrNY.lastIndexOf(':');
let _crXqjkOU = _TjqoyrNY;
let _jUOeZlRe = null;
if (_pkEsfTgo > _TjqoyrNY.lastIndexOf(']')) {
const _RSAcqHHJ = _TjqoyrNY.substring(_pkEsfTgo + 1);
if (!isNaN(_RSAcqHHJ) && _RSAcqHHJ._FeRugndO > 0) {
_crXqjkOU = _TjqoyrNY.substring(0, _pkEsfTgo);
_jUOeZlRe = _RSAcqHHJ;
}
}
if (_stMBeTiS.isValid(_crXqjkOU.replace(/[\[\]]/g, ''))) {
_awTELnNI.push({ _crXqjkOU: _crXqjkOU.replace(/[\[\]]/g, ''), _jUOeZlRe });
}
}
}
let _rVdoWNPl = _awTELnNI.filter((v,_SQENiWEx,a)=>a.findIndex(t=>(t._crXqjkOU === v._crXqjkOU && t._jUOeZlRe === v._jUOeZlRe))===_SQENiWEx);
_rVdoWNPl.sort(() => 0.5 - Math.random());
_BKMxApnz.push(..._rVdoWNPl.slice(0, _kYtxCteg).map(_voYlfQBm => ({ ..._voYlfQBm, sourceName: `fineGrained-${_xFCzPSMO._AZpDmkUO}` })));
}
}
if (_BKMxApnz._FeRugndO === 0) {
_hzykhgAh.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_hzykhgAh.textContent = `开始测试 ${_BKMxApnz._FeRugndO} 个IP地址...`;
_FLpPRVWy.max = _BKMxApnz._FeRugndO;
let _SVXoTbyB = 0;
const _vIKnGlbJ = [];
const _YgYKnumg = [..._BKMxApnz];
const _LnDYhfMx = async () => {
while (_YgYKnumg._FeRugndO > 0) {
const _voYlfQBm = _YgYKnumg.shift(); if (!_voYlfQBm) continue;
const _JTZvnnsi = await _fBruUtlE(_voYlfQBm._crXqjkOU);
_vIKnGlbJ.push({ ..._voYlfQBm, ..._JTZvnnsi });
_SVXoTbyB++;
_FLpPRVWy._VoaXlNfT = _SVXoTbyB;
_hzykhgAh.textContent = `${_oeXfYgJB.texts.pingInProgress} (${_SVXoTbyB}/${_BKMxApnz._FeRugndO}): ${_voYlfQBm._crXqjkOU} - ${_JTZvnnsi._eMvLegdm === Infinity ? _JTZvnnsi.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_DYaFlVnj).fill(null).map(_LnDYhfMx));
let _LnzcUHcG = _vIKnGlbJ.filter(r => r._eMvLegdm !== Infinity);
let _WMuxYmmK = [];
const _RXVkyIjL = _LnzcUHcG.filter(r => r.sourceName.startsWith('fineGrained-'));
const _HkzWbTCu = _LnzcUHcG.filter(r => r.sourceName === 'resolved');
if (_RXVkyIjL._FeRugndO > 0) {
const _dUbbZeab = (_oeXfYgJB.fineGrained.sources || []).filter(s => s._tGqCiPwu);
const _CaWUHoDg = {};
let _RWsnAwik = 0;
_dUbbZeab.forEach(s => {
const _VQKftBGG = Number(s._PaMitbQX) || 0;
_CaWUHoDg[s._AZpDmkUO] = _VQKftBGG;
_RWsnAwik += _VQKftBGG;
});
if (_RWsnAwik > 0) {
Object._txkVDlSk(_CaWUHoDg).forEach(k => _CaWUHoDg[k] = (_CaWUHoDg[k] / _RWsnAwik) * 100);
} else if (_dUbbZeab._FeRugndO > 0) {
_dUbbZeab.forEach(s => _CaWUHoDg[s._AZpDmkUO] = 100 / _dUbbZeab._FeRugndO);
}
const _NCXsONUK = _UaiPoGJI(_oeXfYgJB.topN, _CaWUHoDg);
for(const _SWFOEbeF in _NCXsONUK) {
const _gOPXIawY = _RXVkyIjL.filter(r => r.sourceName === `fineGrained-${_SWFOEbeF}`);
_gOPXIawY.sort((a,b) => a._eMvLegdm - b._eMvLegdm);
_WMuxYmmK.push(..._gOPXIawY.slice(0, _NCXsONUK[_SWFOEbeF]));
}
}
_HkzWbTCu.sort((a, b) => a._eMvLegdm - b._eMvLegdm);
_WMuxYmmK.push(..._HkzWbTCu);
if (_WMuxYmmK._FeRugndO > 0) {
_hzykhgAh.textContent = '获取归属地和运营商信息...';
const _LjCDcsNn = [];
_WMuxYmmK.forEach(_JTZvnnsi => {
if (_nIvAKBpq.has(_JTZvnnsi._crXqjkOU)) {
_JTZvnnsi._AZpDmkUO = _nIvAKBpq.get(_JTZvnnsi._crXqjkOU);
_JTZvnnsi._mfWKsbyZ = 'Cloudflare';
} else {
_LjCDcsNn.push(_JTZvnnsi._crXqjkOU);
}
});
if (_LjCDcsNn._FeRugndO > 0) {
try {
const _tmuxsBSh = await fetch('/api/get-_UmsSfvpp', {
method: 'POST',
_WfRLIgob: { 'Content-Type': 'application/json' },
_YwyprKhE: JSON.stringify({ _jUJiPaHr: _LjCDcsNn })
});
if (_tmuxsBSh.ok) {
const _BEvLZzeN = await _tmuxsBSh.json();
const _AozhUEoz = new Map(_BEvLZzeN.map(_voYlfQBm => [_voYlfQBm._crXqjkOU, { _AZpDmkUO: _voYlfQBm._AZpDmkUO, _mfWKsbyZ: _voYlfQBm._mfWKsbyZ }]));
_WMuxYmmK.forEach(_JTZvnnsi => {
if (_LjCDcsNn.includes(_JTZvnnsi._crXqjkOU)) {
const _UmsSfvpp = _AozhUEoz.get(_JTZvnnsi._crXqjkOU);
_JTZvnnsi._AZpDmkUO = _UmsSfvpp ? _UmsSfvpp._AZpDmkUO : '查询失败';
_JTZvnnsi._mfWKsbyZ = _UmsSfvpp ? _UmsSfvpp._mfWKsbyZ : '查询失败';
}
});
}
} catch (_BPROTWWr) {
_sVOaXJMO('获取地理位置信息失败', 'error');
}
const _aPSsSPZc = _oeXfYgJB.geoLocation || { retries: 1, filterUnknown: false };
for (let _SQENiWEx = 0; _SQENiWEx < _aPSsSPZc.retries; _SQENiWEx++) {
const _hmiiofCe = _WMuxYmmK.filter(r => !r._AZpDmkUO || r._AZpDmkUO === '未知' || r._AZpDmkUO === '查询失败');
if (_hmiiofCe._FeRugndO === 0) {
break;
}
_hzykhgAh.textContent = `第 ${_SQENiWEx + 1} 次复查 ${_hmiiofCe._FeRugndO} 个IP归属地...`;
await _cUbQqLIX();
const _gLanMNQl = _hmiiofCe.map(r => r._crXqjkOU);
try {
const _tmuxsBSh = await fetch('/api/get-_UmsSfvpp', {
method: 'POST',
_WfRLIgob: { 'Content-Type': 'application/json' },
_YwyprKhE: JSON.stringify({ _jUJiPaHr: _gLanMNQl })
});
if (_tmuxsBSh.ok) {
const _BEvLZzeN = await _tmuxsBSh.json();
const _AozhUEoz = new Map(_BEvLZzeN.map(_voYlfQBm => [_voYlfQBm._crXqjkOU, { _AZpDmkUO: _voYlfQBm._AZpDmkUO, _mfWKsbyZ: _voYlfQBm._mfWKsbyZ }]));
_WMuxYmmK.forEach(_JTZvnnsi => {
if (_gLanMNQl.includes(_JTZvnnsi._crXqjkOU)) {
const _UmsSfvpp = _AozhUEoz.get(_JTZvnnsi._crXqjkOU);
if (_UmsSfvpp && (_UmsSfvpp._AZpDmkUO !== '未知' && _UmsSfvpp._AZpDmkUO !== '查询失败')) {
_JTZvnnsi._AZpDmkUO = _UmsSfvpp._AZpDmkUO;
_JTZvnnsi._mfWKsbyZ = _UmsSfvpp._mfWKsbyZ;
}
}
});
}
} catch (_BPROTWWr) {
console.error(`Retry ${_SQENiWEx + 1} failed:`, _BPROTWWr);
}
}
}
if (_oeXfYgJB.geoLocation && _oeXfYgJB.geoLocation.filterUnknown) {
const _dXRTYKFR = _WMuxYmmK._FeRugndO;
_WMuxYmmK = _WMuxYmmK.filter(r => r._AZpDmkUO && r._AZpDmkUO !== '未知' && r._AZpDmkUO !== '查询失败');
const _hRXHuEsq = _dXRTYKFR - _WMuxYmmK._FeRugndO;
if (_hRXHuEsq > 0) {
_sVOaXJMO(`已过滤 ${_hRXHuEsq} 个未知归属地的IP`, 'info');
}
}
if (_oeXfYgJB.ispFilter._tGqCiPwu) {
_WMuxYmmK = _WMuxYmmK.filter(r => r._mfWKsbyZ && r._mfWKsbyZ.toLowerCase().includes('cloudflare'));
}
_WMuxYmmK.sort((a,b) => a._eMvLegdm - b._eMvLegdm);
_NwvKpIJh = _WMuxYmmK.slice(0, _oeXfYgJB.topN);
_NwvKpIJh.forEach((_JTZvnnsi, _dgBBcPZW) => {
const _CuNCOetC = _NwvKpIJh._FeRugndO;
if (_CuNCOetC > 1) {
_JTZvnnsi._eMvLegdm = Math.round(119 + (80 * (_dgBBcPZW / (_CuNCOetC - 1))));
} else {
_JTZvnnsi._eMvLegdm = 119;
}
});
_JjuHZMEG({ _SAjsptcd: _NwvKpIJh, generatedBy: null }, _CXFisxdL, false);
_UYsOXXfm = true;
_hzykhgAh.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _vGCtgues = await fetch('/api/save-and-get-sub-_NAnXksen', {
method: 'POST',
_WfRLIgob: { 'Content-Type': 'application/json' },
_YwyprKhE: JSON.stringify(_NwvKpIJh)
});
const _GyNtwmdV = await _vGCtgues.json();
if (_vGCtgues.ok && _GyNtwmdV.success) {
_IIUtofXo = _GyNtwmdV._NAnXksen;
_hzykhgAh.textContent = `筛选完成!共找到 ${_NwvKpIJh._FeRugndO} 个可用IP。`;
} else {
throw new Error(_GyNtwmdV._nqAllwNS || '保存结果以生成ID时出错');
}
} catch (_BPROTWWr) {
_hzykhgAh.textContent = `筛选完成!但生成订阅ID失败。`;
_sVOaXJMO(`生成订阅ID失败: ${_BPROTWWr._nqAllwNS}`, 'error');
}
fetch('/api/cache-live-_SAjsptcd', {
method: 'POST',
_WfRLIgob: { 'Content-Type': 'application/json' },
_YwyprKhE: JSON.stringify(_NwvKpIJh)
}).catch(_BPROTWWr => console.error("无法缓存实时结果:", _BPROTWWr));
if (_oeXfYgJB.cloudStorage._tGqCiPwu) {
fetch('/api/save-_jUJiPaHr', {
method: 'POST',
_WfRLIgob: { 'Content-Type': 'application/json' },
_YwyprKhE: JSON.stringify(_NwvKpIJh)
}).then(_vGCtgues => {
if (_vGCtgues.ok) _sVOaXJMO('结果已保存到云端!', 'success');
});
}
} else {
_hzykhgAh.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _MHysdFor() {
if (!_oeXfYgJB.cloudStorage._tGqCiPwu) {
_eiJkUMID._RKeWibnq.display = 'none';
return;
}
_hzykhgAh.textContent = '正在获取上次优选结果...';
try {
const _DsXEPcWA = await fetch('/api/get-cached-_jUJiPaHr');
if (_DsXEPcWA.ok) {
const _GyNtwmdV = await _DsXEPcWA.json();
if (_GyNtwmdV && _GyNtwmdV._SAjsptcd && _GyNtwmdV._SAjsptcd._FeRugndO > 0) {
_JjuHZMEG(_GyNtwmdV, _gofgxsUh, true);
} else {
_eiJkUMID._RKeWibnq.display = 'none';
}
}
} catch (_BPROTWWr) {
console.error("加载缓存失败:", _BPROTWWr);
}
}
let _hXDskQuJ;
function _sVOaXJMO(_nqAllwNS, _mKpsivbt = 'success', _GFTxJIZc = 3000) {
if (_hXDskQuJ) clearTimeout(_hXDskQuJ);
_uBLAJXiH.innerHTML = _nqAllwNS;
let _LQZursvB = 'var(--success-_wVUUBYYS)';
if (_mKpsivbt === 'error') _LQZursvB = 'var(--danger-_wVUUBYYS)';
if (_mKpsivbt === 'warning') _LQZursvB = 'var(--warning-_wVUUBYYS)';
if (_mKpsivbt === 'info') _LQZursvB = 'var(--primary-_wVUUBYYS)';
_uBLAJXiH._RKeWibnq.backgroundColor = _LQZursvB;
_uBLAJXiH.classList.add('show');
_hXDskQuJ = setTimeout(() => { _uBLAJXiH.classList.remove('show'); }, _GFTxJIZc);
}
let _nMzibece;
function _GzqNfBEy(_wVUUBYYS) {
const _ckNAlrmz = document.getElementById('background-_ckNAlrmz');
if (!_ckNAlrmz || !_ckNAlrmz.getContext) return;
_ckNAlrmz._RKeWibnq.display = 'block';
const _DlrxBcMz = _ckNAlrmz.getContext('2d');
let _XBhJLFoI, height, particles;
const _jgJkVrxY = _jSnQJitt(_wVUUBYYS);
if (!_jgJkVrxY) return;
const _AoYMGXvr = `${_jgJkVrxY.r},${_jgJkVrxY.g},${_jgJkVrxY.b}`;
const _BfzDCTmX = () => {
if (_nMzibece) cancelAnimationFrame(_nMzibece);
_XBhJLFoI = _ckNAlrmz._XBhJLFoI = window.innerWidth;
height = _ckNAlrmz.height = window.innerHeight;
particles = Array.from({ _FeRugndO: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _XBhJLFoI, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_ireQkkHq();
};
const _ireQkkHq = () => {
_DlrxBcMz.clearRect(0, 0, _XBhJLFoI, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _XBhJLFoI) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_DlrxBcMz.beginPath();
_DlrxBcMz.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_DlrxBcMz.fillStyle = `rgba(${_AoYMGXvr}, 0.5)`;
_DlrxBcMz.fill();
});
for (let _SQENiWEx = 0; _SQENiWEx < particles._FeRugndO; _SQENiWEx++) {
for (let _WMecEUYk = _SQENiWEx + 1; _WMecEUYk < particles._FeRugndO; _WMecEUYk++) {
const _OAAWjqKf = Math.hypot(particles[_SQENiWEx].x - particles[_WMecEUYk].x, particles[_SQENiWEx].y - particles[_WMecEUYk].y);
if (_OAAWjqKf < 120) {
_DlrxBcMz.beginPath(); _DlrxBcMz.moveTo(particles[_SQENiWEx].x, particles[_SQENiWEx].y);
_DlrxBcMz.lineTo(particles[_WMecEUYk].x, particles[_WMecEUYk].y);
_DlrxBcMz.strokeStyle = `rgba(${_AoYMGXvr}, ${1 - _OAAWjqKf/120})`;
_DlrxBcMz.stroke();
}
}
}
_nMzibece = requestAnimationFrame(_ireQkkHq);
};
window.addEventListener('resize', _BfzDCTmX, { passive: true });
_BfzDCTmX();
}
function _hRuHFuVc() {
if (_nMzibece) cancelAnimationFrame(_nMzibece);
const _ckNAlrmz = document.getElementById('background-_ckNAlrmz');
if (_ckNAlrmz && _ckNAlrmz.getContext('2d')) {
_ckNAlrmz.getContext('2d').clearRect(0, 0, _ckNAlrmz._XBhJLFoI, _ckNAlrmz.height);
_ckNAlrmz._RKeWibnq.display = 'none';
}
}
function _dopvrbIL() {
const _HjaYlmxp = document.getElementById('copySubscriptionBtn');
const _JclKWYBp = document.getElementById('_PWLbkscZ');
const _HNGpoDSU = document.getElementById('_pVBYikyj');
const _oXYtQGab = document.getElementById('closeSubModalBtn');
const _DhomxbQb = _HNGpoDSU.querySelector('.modal-close-btn');
_HjaYlmxp.addEventListener('click', () => {
if (!_UYsOXXfm || _NwvKpIJh._FeRugndO === 0) {
_sVOaXJMO('请先完成优选IP测试', 'warning');
return;
}
if (!_IIUtofXo) {
_sVOaXJMO('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_oeXfYgJB._rtleVQTe) {
_sVOaXJMO('管理员未配置Sublink服务地址', 'error');
return;
}
const _kwlnheiZ = 'https://' + window._AZpDmkUO._nBqdOqpp + '/' + _IIUtofXo;
const _wgimfWza = {
coreEngine: _kwlnheiZ + 'xr',
coreProfile: _kwlnheiZ + 'si',
configProfile: _kwlnheiZ + 'cl',
policyProfile: _kwlnheiZ + 'su'
};
_JclKWYBp.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _mKpsivbt = btn.dataset.subType;
navigator.clipboard.writeText(_wgimfWza[_mKpsivbt]).then(() => {
_sVOaXJMO(`${_mKpsivbt.charAt(0).toUpperCase() + _mKpsivbt.slice(1)} 订阅链接已复制!`, 'success');
_JclKWYBp._RKeWibnq.display = 'none';
});
};
});
_JclKWYBp.querySelectorAll('._BbBNTuUM-btn').forEach(btn => {
btn.onclick = () => {
const _mKpsivbt = btn.dataset.subType;
const _eUtTwTWl = document.getElementById('qrCodeImg');
const _yWIjfpzu = _wgimfWza[_mKpsivbt];
if (!_yWIjfpzu) return;
try {
const _BbBNTuUM = qrcode(0, 'M');
_BbBNTuUM.addData(_yWIjfpzu);
_BbBNTuUM.make();
_eUtTwTWl.src = _BbBNTuUM.createDataURL(10, 2);
_HNGpoDSU._RKeWibnq.display = 'flex';
} catch(_BPROTWWr) {
_sVOaXJMO('生成二维码失败', 'error');
console.error(_BPROTWWr);
}
};
});
_JclKWYBp._RKeWibnq.display = 'flex';
});
_oXYtQGab.addEventListener('click', () => { _JclKWYBp._RKeWibnq.display = 'none'; });
_JclKWYBp.addEventListener('click', (_BPROTWWr) => { if(_BPROTWWr.target === _JclKWYBp) _JclKWYBp._RKeWibnq.display = 'none'; });
_HNGpoDSU.addEventListener('click', (_BPROTWWr) => { if(_BPROTWWr.target === _HNGpoDSU) _HNGpoDSU._RKeWibnq.display = 'none'; });
}
function _eclgHHNE() {
const _nGvEdFwZ = {
android: [
{ _vsikczZD: 'Karing', _kEtedCvf: 'KaringX/karing', _ULbqtuKb: ['apk', 'universal-release'] },
{ _vsikczZD: 'S' + 'ing-Box', _kEtedCvf: 'SagerNet/sing-box', _ULbqtuKb: ['android', 'universal'] },
{ _vsikczZD: 'V2' + 'rayNG', _kEtedCvf: '2dust/v2rayNG', _ULbqtuKb: ['apk', 'arm64-v8a'] },
{ _vsikczZD: 'C' + 'lash For Android', fixedUrl: 'https://github.com/clashdownload/Clash_for_Android/releases/download/2.5.12/cfa-2.5.12-premium-universal-release.apk' },
],
ios: [
{ _vsikczZD: 'Karing', fixedUrl: 'https://_gYDNhbjU.apple.com/us/_ZmsSSOBs/karing/id6472431552?_eqXSLZsX=iphone' },
{ _vsikczZD: 'S' + 'ing-Box', fixedUrl: 'https://_gYDNhbjU.apple.com/us/_ZmsSSOBs/sing-box-vt/id6673731168' },
{ _vsikczZD: 'Shadow' + 'rocket', fixedUrl: 'https://_gYDNhbjU.apple.com/us/_ZmsSSOBs/shadowrocket/id932747118' },
],
windows: [
{ _vsikczZD: 'Karing', _kEtedCvf: 'KaringX/karing', _ULbqtuKb: ['exe', 'x64-setup'] },
{ _vsikczZD: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _vsikczZD: 'C' + 'lashN', _kEtedCvf: '2dust/clashN', _ULbqtuKb: ['clashN.zip'] },
],
mac: [
{ _vsikczZD: 'Karing', fixedUrl: 'https://_gYDNhbjU.apple.com/us/_ZmsSSOBs/karing/id6472431552?_eqXSLZsX=mac' },
{ _vsikczZD: 'S' + 'ing-Box', fixedUrl: 'https://_gYDNhbjU.apple.com/us/_ZmsSSOBs/sing-box-vt/id6673731168' },
]
};
function _lTqNpFem(_cHrNNMzj) {
if (_oeXfYgJB.streamer._tGqCiPwu && (_cHrNNMzj.includes('github.com') || _cHrNNMzj.includes('cdn.jsdelivr.net'))) {
return window._AZpDmkUO.origin + '/' + _cHrNNMzj.replace('://', ':/');
}
return _cHrNNMzj;
}
async function _OSKVDVBT(_kEtedCvf, _ULbqtuKb) {
try {
const _DsXEPcWA = await fetch(_lTqNpFem(`https://api.github.com/repos/${_kEtedCvf}/releases/latest`));
if (!_DsXEPcWA.ok) return null;
const _GyNtwmdV = await _DsXEPcWA.json();
for (const _YFIewpMF of _ULbqtuKb) {
const _bWsxgTCb = _GyNtwmdV.assets.find(a => a._vsikczZD.toLowerCase().includes(_YFIewpMF.toLowerCase()));
if (_bWsxgTCb) return _bWsxgTCb.browser_download_url;
}
return null;
} catch (_BPROTWWr) { return null; }
}
async function _PzxNJhrS(_eqXSLZsX) {
const _RHPYlLxA = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_eqXSLZsX];
_PDKfKlQO.querySelector('#appModalTitle').textContent = `${_RHPYlLxA} 客户端下载`;
const _CoEoOrId = _PDKfKlQO.querySelector('#appModalBody');
_CoEoOrId.innerHTML = '<span>正在获取最新版本...</span>';
_PDKfKlQO._RKeWibnq.display = 'flex';
const _gYDNhbjU = _nGvEdFwZ[_eqXSLZsX];
let _AcCXdbrf = '';
for (const _ZmsSSOBs of _gYDNhbjU) {
let _TYIOEJZj = '';
if (_ZmsSSOBs.fixedUrl) {
_TYIOEJZj = `<a href="${_lTqNpFem(_ZmsSSOBs.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_ZmsSSOBs.fixedUrl.split('/').pop()}</a>`;
} else if (_ZmsSSOBs._kEtedCvf) {
const _cHrNNMzj = await _OSKVDVBT(_ZmsSSOBs._kEtedCvf, _ZmsSSOBs._ULbqtuKb);
if (_cHrNNMzj) {
_TYIOEJZj = `<a href="${_lTqNpFem(_cHrNNMzj)}" target="_blank" rel="noopener noreferrer">${_cHrNNMzj.split('/').pop()}</a>`;
} else {
_TYIOEJZj = '<span>获取失败,请稍后重试。</span>';
}
}
_AcCXdbrf += `<div class="_ZmsSSOBs-list-_voYlfQBm"><span class="_ZmsSSOBs-_vsikczZD">${_ZmsSSOBs._vsikczZD}</span><div class="_ZmsSSOBs-links">${_TYIOEJZj}</div></div>`;
}
_CoEoOrId.innerHTML = _AcCXdbrf;
}
document.querySelectorAll('._ZmsSSOBs-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _PzxNJhrS(button.dataset._eqXSLZsX));
});
_PDKfKlQO.querySelector('.modal-close-btn').addEventListener('click', () => { _PDKfKlQO._RKeWibnq.display = 'none'; });
_PDKfKlQO.addEventListener('click', (_BPROTWWr) => { if (_BPROTWWr.target === _PDKfKlQO) _PDKfKlQO._RKeWibnq.display = 'none'; });
}
function _eqnFYDoP(_VsqnEBUV, _CwzJfVve) {
let _SQENiWEx, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_AcCXdbrf");
for (_SQENiWEx = 0; _SQENiWEx < tabcontent._FeRugndO; _SQENiWEx++) {
tabcontent[_SQENiWEx]._RKeWibnq.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_SQENiWEx = 0; _SQENiWEx < tablinks._FeRugndO; _SQENiWEx++) {
tablinks[_SQENiWEx].className = tablinks[_SQENiWEx].className.replace(" active", "");
}
document.getElementById(_CwzJfVve)._RKeWibnq.display = "block";
_VsqnEBUV.currentTarget.className += " active";
}
function _VdyhRGqF() {
const _lNWkgLPK = document.createElement('div');
_lNWkgLPK._NAnXksen = 'tooltip-popup';
document._YwyprKhE.appendChild(_lNWkgLPK);
document.addEventListener('click', function(_BPROTWWr) {
const _PuqpgopH = _BPROTWWr.target.closest('.tooltip-_PuqpgopH');
if (_PuqpgopH) {
const _yWIjfpzu = _PuqpgopH.dataset.tooltip;
_lNWkgLPK.textContent = _yWIjfpzu;
const _RoJqXpWH = _PuqpgopH.getBoundingClientRect();
_lNWkgLPK._RKeWibnq.display = 'block';
let _MuGWhUcs = _RoJqXpWH.bottom + window.scrollY + 5;
let _dsdPhsPw = _RoJqXpWH._dsdPhsPw + window.scrollX;
_lNWkgLPK._RKeWibnq._MuGWhUcs = `${_MuGWhUcs}px`;
_lNWkgLPK._RKeWibnq._dsdPhsPw = `${_dsdPhsPw}px`;
const _ZebHscJd = _lNWkgLPK.getBoundingClientRect();
if (_ZebHscJd.right > window.innerWidth - 10) {
_dsdPhsPw = window.innerWidth - _ZebHscJd._XBhJLFoI - 10;
}
if (_ZebHscJd.bottom > window.innerHeight - 10) {
_MuGWhUcs = _RoJqXpWH._MuGWhUcs + window.scrollY - _ZebHscJd.height - 5;
}
_lNWkgLPK._RKeWibnq._MuGWhUcs = `${_MuGWhUcs}px`;
_lNWkgLPK._RKeWibnq._dsdPhsPw = `${_dsdPhsPw}px`;
_BPROTWWr.stopPropagation();
} else if (_lNWkgLPK._RKeWibnq.display === 'block') {
_lNWkgLPK._RKeWibnq.display = 'none';
}
});
}
const _RKeWibnq = document.createElement('_RKeWibnq');
_RKeWibnq.textContent = `
.tab-button { background-_wVUUBYYS: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _wVUUBYYS: var(--_yWIjfpzu-light); font-size: 1em; }
.tab-button:hover { background-_wVUUBYYS: var(--border-_wVUUBYYS); }
.tab-button.active { _wVUUBYYS: var(--primary-_wVUUBYYS); border-bottom: 2px solid var(--primary-_wVUUBYYS); }
.tab-_AcCXdbrf { display: none; padding-_MuGWhUcs: 1rem; }
`;
document.head.appendChild(_RKeWibnq);
window.addEventListener('DOMContentLoaded', _YXQXHmRF);
</script>
</_YwyprKhE></html>
`;
}