import { connect } from "cloudflare:sockets";
const _MjKVAdPj = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _pZcctlMB = ["UpstreamAddress.SG.CMLiussss.net"];
const _XseloBEG = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _MPZknCNB = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _fQxZIhkI = '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 _HwNBkUTg = '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 _UNdagKEu(_jnrUVtWz) {
if (Array.isArray(_jnrUVtWz)) {
try {
return String.fromCharCode.apply(null, _jnrUVtWz);
} catch (_HiEJfbha) {
return '';
}
}
return _jnrUVtWz;
}
function _zuGjTxKW(_TTtmLTmr) {
return /^[0-9a-_CWugqcUY]{8}-[0-9a-_CWugqcUY]{4}-[4][0-9a-_CWugqcUY]{3}-[89ab][0-9a-_CWugqcUY]{3}-[0-9a-_CWugqcUY]{12}$/_RtvzwKWo.test(_TTtmLTmr);
}
const _hsaniIWp = "optimized_ips_v4";
const _PSrONUXk = "global_config_v4";
const _VwvkkZpm = "admin_password_v4";
const _iidZOFTL = "live_results_temp_v1";
const _wjeAhTFT = "latest_sub_id_v1";
export default {
async fetch(_tLOGPavH, _rVPBZubY, _FZZfXetd) {
try {
if (!_rVPBZubY.DB) {
const _ongRfmae = _VCgvLcUo("D1 数据库 'DB' 未绑定。");
return new Response(_ongRfmae, { status: 503, _qbpjcIjc: { 'Content-Type': '_jcPqEnIk/html;_LhAztbqy=UTF-8' }});
}
_FZZfXetd.waitUntil(
_rVPBZubY.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_HCrAOecu TEXT PRIMARY KEY, _jnrUVtWz TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_TTtmLTmr TEXT PRIMARY KEY, _ApMdqruF TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_HiEJfbha => console.error("DB Init Error:", _HiEJfbha._rFvcSSUG))
);
const _UNGfWfpn = new URL(_tLOGPavH._UNGfWfpn);
const _AugvRFpu = _UNGfWfpn.pathname;
const _BmOuMsmF = _tLOGPavH._qbpjcIjc.get("Upgrade");
const _QCBbPTKS = await _fXwqgGZX(_rVPBZubY);
if (_QCBbPTKS.websocketStreamer && _QCBbPTKS.websocketStreamer._jkoNSIvl && _BmOuMsmF && _BmOuMsmF.toLowerCase() === "websocket") {
const _eLQClZQu = _QCBbPTKS.websocketStreamer._UNGfWfpn;
if (_eLQClZQu && _eLQClZQu.trim().startsWith('https://')) {
try {
const _swyVlDQA = new Request(_eLQClZQu.trim() + _UNGfWfpn.pathname + _UNGfWfpn.search, _tLOGPavH);
return await fetch(_swyVlDQA);
} catch (_HiEJfbha) {
return new Response(`Upstream WebSocket gateway failed: ${_HiEJfbha._rFvcSSUG}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_BmOuMsmF && _BmOuMsmF.toLowerCase() === "websocket") {
return await _nXNEhGUM(_tLOGPavH, _rVPBZubY, _QCBbPTKS);
}
const _xwzUAsrm = _AugvRFpu._bHxAOHlM(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_xwzUAsrm) {
const [, _pVBduKzY, typeSuffix] = _xwzUAsrm;
const _YaeXtNFu = _QCBbPTKS._YaeXtNFu;
if (!_YaeXtNFu || _YaeXtNFu.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _qbpjcIjc: { 'Content-Type': '_jcPqEnIk/plain; _LhAztbqy=utf-8' } });
}
const _eJZUCvIU = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _welulduP = _eJZUCvIU[typeSuffix];
const _OCcuwceq = _YaeXtNFu.replace(/\/$/, '');
const _alkdaOZA = `${_UNGfWfpn.origin}/${_pVBduKzY}`;
const _WSeAWPLz = `${_OCcuwceq}/${_welulduP}?_QCBbPTKS=${encodeURIComponent(_alkdaOZA)}`;
try {
const _CiILAgmo = await fetch(_WSeAWPLz, { _qbpjcIjc: { 'User-Agent': _tLOGPavH._qbpjcIjc.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _CRgPocNS = new Headers(_CiILAgmo._qbpjcIjc);
_CRgPocNS._wjpIBrxv('Access-Control-Allow-Origin', '*');
return new Response(_CiILAgmo._ABoGvlkq, { status: _CiILAgmo.status, statusText: _CiILAgmo.statusText, _qbpjcIjc: _CRgPocNS });
} catch (_HiEJfbha) {
return new Response(`获取上游订阅失败: ${_HiEJfbha._rFvcSSUG}`, { status: 502, _qbpjcIjc: { 'Content-Type': '_jcPqEnIk/plain; _LhAztbqy=utf-8' } });
}
}
if (_AugvRFpu.startsWith('/https:/') || _AugvRFpu.startsWith('/http:/')) {
return _AEYMKQRy(_tLOGPavH, _QCBbPTKS);
}
if (_QCBbPTKS.customSubPath && _QCBbPTKS.customSubPath._jkoNSIvl && _QCBbPTKS.customSubPath._AugvRFpu && _AugvRFpu === '/' + _QCBbPTKS.customSubPath._AugvRFpu.trim()) {
const _aUKSVfSl = _rVPBZubY.DB.prepare("SELECT _jnrUVtWz FROM kv_data WHERE _HCrAOecu = ?").bind(_wjeAhTFT);
const { _TyrgygfU } = await _aUKSVfSl.all();
const _sQPtryrk = _TyrgygfU._JddHRFkb > 0 ? _TyrgygfU[0]._jnrUVtWz : null;
if (_sQPtryrk) {
return _yxHarKeV({ _yfvvHyun: { _TTtmLTmr: _sQPtryrk }, _UNGfWfpn: _tLOGPavH._UNGfWfpn }, _rVPBZubY);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _qbpjcIjc: { 'Content-Type': '_jcPqEnIk/plain; _LhAztbqy=utf-8' } });
}
}
const _XvQuWkoA = _AugvRFpu.split('/').filter(Boolean);
if (_XvQuWkoA._JddHRFkb === 1 && !_AugvRFpu.startsWith('/api/')) {
const _pVBduKzY = _XvQuWkoA[0];
return _yxHarKeV({ _yfvvHyun: { _TTtmLTmr: _pVBduKzY }, _UNGfWfpn: _tLOGPavH._UNGfWfpn }, _rVPBZubY);
}
if (_AugvRFpu.startsWith('/api/')) {
if (_AugvRFpu === '/api/_QCBbPTKS' && _tLOGPavH.method === 'POST') return _KAwsSeEC(_tLOGPavH, _rVPBZubY, _FZZfXetd);
if (_AugvRFpu === '/api/_wjpIBrxv-_eCcmnilz') return _dpikAnvx(_tLOGPavH, _rVPBZubY);
if (_AugvRFpu === '/api/change-_eCcmnilz') return _gPfjfgjA(_tLOGPavH, _rVPBZubY);
if (_AugvRFpu === '/api/verify-_eCcmnilz') return _hshPlzis(_tLOGPavH, _rVPBZubY);
if (_AugvRFpu === '/api/verify-visitor-_eCcmnilz' && _tLOGPavH.method === 'POST') return _PfvEezLe(_tLOGPavH, _rVPBZubY);
if (_AugvRFpu === '/api/cache-live-_TyrgygfU' && _tLOGPavH.method === 'POST') return _bpsBaIZq(_tLOGPavH, _rVPBZubY, _FZZfXetd);
if (_AugvRFpu === '/api/get-_zVtrXmGe' && _tLOGPavH.method === 'POST') return _eAetCvBl(_tLOGPavH, _rVPBZubY);
if (_AugvRFpu === '/api/get-cached-_fPcQkudH') return _RyFIrbwM(_tLOGPavH, _rVPBZubY);
if (_AugvRFpu === '/api/save-_fPcQkudH') return _EtXkbxvv(_tLOGPavH, _rVPBZubY, _FZZfXetd);
if (_AugvRFpu === '/api/save-and-get-sub-_TTtmLTmr' && _tLOGPavH.method === 'POST') return _AzTRZdav(_tLOGPavH, _rVPBZubY);
if (_AugvRFpu.startsWith('/api/get-_FiBNkQgP/')) {
const _pVBduKzY = _AugvRFpu.split('/').pop();
return _yxHarKeV({ _yfvvHyun: { _TTtmLTmr: _pVBduKzY }, _UNGfWfpn: _tLOGPavH._UNGfWfpn }, _rVPBZubY);
}
if (_AugvRFpu === '/api/_QCBbPTKS' && _tLOGPavH.method === 'GET') return _FMFEIRfR(_rVPBZubY);
if (_AugvRFpu === '/api/get-resolved-_fPcQkudH') return _LPyKyNPG(_tLOGPavH);
if (_AugvRFpu === '/api/parse-_fPcQkudH-from-_MZjeWHOw' && _tLOGPavH.method === 'POST') return _KDkWBtOS(_tLOGPavH, _rVPBZubY);
if (_AugvRFpu === '/api/endpoints') return _lVRsgTFP(_tLOGPavH, _rVPBZubY);
if (_AugvRFpu === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_AugvRFpu === '/_ropwOTIW') return _zkTsSGdk(_tLOGPavH, _rVPBZubY);
if (_AugvRFpu === '/bing-wallpaper') return _jqoVTvpE();
return _NOvbxGjW(_tLOGPavH, _rVPBZubY, _FZZfXetd);
} catch (err) {
let _HiEJfbha = err;
return new Response(_HiEJfbha.toString(), { status: 500 });
}
}
};
const _JxnQfXyR = { 'Accept': '_jcPqEnIk/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 _hwbyLobV(_UNGfWfpn, _pVWqgVms) {
const _TWYTcqap = await fetch(_UNGfWfpn, { _qbpjcIjc: { ..._JxnQfXyR, 'Referer': _pVWqgVms.referer } });
if (_TWYTcqap.ok) return _TWYTcqap._jcPqEnIk();
return null;
}
async function _UvDwkwlR(_UNGfWfpn, _pVWqgVms) {
const _rbszaYbJ = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_UNGfWfpn)}`;
const _TWYTcqap = await fetch(_rbszaYbJ, { _qbpjcIjc: { ..._JxnQfXyR, 'Referer': _pVWqgVms.referer } });
if (!_TWYTcqap.ok) return null;
const _ABoGvlkq = await _TWYTcqap._jcPqEnIk();
const _bHxAOHlM = _ABoGvlkq._bHxAOHlM(/<pre[^>]*>([\s\S]*?)<\/pre>/_RtvzwKWo);
return _bHxAOHlM && _bHxAOHlM[1] ? _bHxAOHlM[1].replace(/&/g, '&') : null;
}
function _JypTIfhc(_mwHbituu) {
let _odhoOSyj;
try {
_odhoOSyj = atob(_mwHbituu.replace(/\s/g, ''));
} catch (_HiEJfbha) {
_odhoOSyj = _mwHbituu;
}
const _FiBNkQgP = _odhoOSyj.split(/[\s\n\r,]+/).filter(line => line.trim());
const _CZivFeXI = new Set();
const _MtypysXI = /@([^?#]+?):(\d+)/;
for (const _VoRrCSOy of _FiBNkQgP) {
let _sEzdfqGt = '';
let _lKplLykm = '';
try {
if (_VoRrCSOy.startsWith('vmess://')) {
const _wCOFTBPn = atob(_VoRrCSOy.substring(8));
const _QCBbPTKS = JSON.parse(_wCOFTBPn);
_sEzdfqGt = _QCBbPTKS.add;
_lKplLykm = _QCBbPTKS._lKplLykm;
} else {
const _bHxAOHlM = _VoRrCSOy._bHxAOHlM(_MtypysXI);
if (_bHxAOHlM && _bHxAOHlM[1] && _bHxAOHlM[2]) {
_sEzdfqGt = _bHxAOHlM[1].replace(/[\[\]]/g, '');
_lKplLykm = _bHxAOHlM[2];
}
}
} catch (_HiEJfbha) {
console.warn(`Could not parse _VoRrCSOy: ${_VoRrCSOy}`);
}
if (_sEzdfqGt && _lKplLykm) {
_CZivFeXI.add(`${_sEzdfqGt}:${_lKplLykm}`);
}
}
return Array.from(_CZivFeXI);
}
async function _MzhAXPwh(_dEkQPXYc) {
try {
const _TWYTcqap = await fetch(_dEkQPXYc, { _qbpjcIjc: _JxnQfXyR });
if (!_TWYTcqap.ok) {
console.error(`Failed to fetch subscription: ${_TWYTcqap.status}`);
return [];
}
const _mwHbituu = await _TWYTcqap._jcPqEnIk();
return _JypTIfhc(_mwHbituu);
} catch (error) {
console.error(`Error processing subscription ${_dEkQPXYc}:`, error);
return [];
}
}
async function _IFVmWHTs(_Zegdjflh) {
const _rXdhOKco = _Zegdjflh.trim();
const _TMHhJCJh = /^(vless|vmess|trojan|ss):\/\//.test(_rXdhOKco);
const _GgviPYWD = (() => {
if (_rXdhOKco._JddHRFkb < 20 || _rXdhOKco.startsWith('http')) return false;
const _dcIkDNuf = _rXdhOKco.replace(/\s/g, '');
if (_dcIkDNuf._JddHRFkb % 4 !== 0 && !_dcIkDNuf.includes('=')) return false;
try {
atob(_dcIkDNuf);
return true;
} catch (_HiEJfbha) {
return false;
}
})();
if (_TMHhJCJh || _GgviPYWD) {
return _JypTIfhc(_rXdhOKco).join('\n');
}
const _uBqqSQeb = [
'https://ipdb.api.030101.xyz/?_BFbzJcsO=bestcf&_tgsGpbBk=true',
'https://ipdb.api.030101.xyz/?_BFbzJcsO=bestproxy&_tgsGpbBk=true'
];
const _TMvdVZzu = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_RtvzwKWo.test(_Zegdjflh) || _Zegdjflh.includes('?_MtZNSJzW=');
if (_TMvdVZzu) {
const _fPcQkudH = await _MzhAXPwh(_Zegdjflh);
return _fPcQkudH.join('\n');
}
let _mwHbituu = '';
if (_uBqqSQeb.includes(_Zegdjflh)) {
_mwHbituu = await _hwbyLobV(_Zegdjflh, { referer: _Zegdjflh });
if (!_mwHbituu || _mwHbituu._JddHRFkb < 8) {
_mwHbituu = await _UvDwkwlR(_Zegdjflh, { referer: _Zegdjflh });
}
} else {
try {
const _ligJOVVW = await fetch(_Zegdjflh, { _qbpjcIjc: { 'User-Agent': 'Cloudflare-Worker' } });
if (_ligJOVVW.ok) {
_mwHbituu = await _ligJOVVW._jcPqEnIk();
} else {
console.warn(`Failed to fetch URL ${_Zegdjflh}: ${_ligJOVVW.status}`);
}
} catch (_HiEJfbha) {
console.error(`Error fetching URL ${_Zegdjflh}:`, _HiEJfbha);
}
}
const _SmlLMftp = _JypTIfhc(_mwHbituu);
if (_SmlLMftp._JddHRFkb > 0) {
return _SmlLMftp.join('\n');
}
return _mwHbituu || '';
}
async function _AEYMKQRy(_tLOGPavH, _QCBbPTKS) {
if (!_QCBbPTKS.streamer._jkoNSIvl) {
return new Response('远程流功能未开启', { status: 403 });
}
const _UNGfWfpn = new URL(_tLOGPavH._UNGfWfpn);
const _WcuTeCyz = _UNGfWfpn.pathname.substring(1).replace(':/', '://');
try {
const _WSeAWPLz = new URL(_WcuTeCyz);
const _TWfbePgl = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_TWfbePgl.some(domain => _WSeAWPLz._sEzdfqGt.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _leotiUph = new Headers(_tLOGPavH._qbpjcIjc);
_leotiUph._wjpIBrxv('Host', _WSeAWPLz._sEzdfqGt);
_leotiUph._wjpIBrxv('User-Agent', 'CF-Worker-Streamer/1.0');
const _dXLFfIib = await fetch(_WSeAWPLz.toString(), {
method: _tLOGPavH.method,
_qbpjcIjc: _leotiUph,
_ABoGvlkq: _tLOGPavH._ABoGvlkq,
});
const _CRgPocNS = new Headers(_dXLFfIib._qbpjcIjc);
_CRgPocNS._wjpIBrxv('Access-Control-Allow-Origin', '*');
_CRgPocNS._wjpIBrxv('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_CRgPocNS._wjpIBrxv('Access-Control-Allow-Headers', '*');
_CRgPocNS._wjpIBrxv('Cache-Control', 'public, max-age=86400');
_CRgPocNS._wjpIBrxv('X-Streamer-Source', 'CF-Worker');
_CRgPocNS.delete('_mwHbituu-security-policy');
_CRgPocNS.delete('x-_mwHbituu-security-policy');
_CRgPocNS.delete('x-webkit-csp');
return new Response(_dXLFfIib._ABoGvlkq, {
status: _dXLFfIib.status,
statusText: _dXLFfIib.statusText,
_qbpjcIjc: _CRgPocNS,
});
} catch (_HiEJfbha) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _nXNEhGUM(_tLOGPavH, _rVPBZubY, _QCBbPTKS) {
try {
const _LDqPEeMD = _QCBbPTKS || await _fXwqgGZX(_rVPBZubY);
const _bNHUbQVF = (_LDqPEeMD.itemLink._tUzgyUfT && _LDqPEeMD.itemLink._tUzgyUfT[0]) || {};
const _rQbHFPwY = _bNHUbQVF['_MtZNSJzW'] || _UNdagKEu(_MjKVAdPj);
if (!_zuGjTxKW(_rQbHFPwY)) {
throw new Error("Configured user _uzVvQJqC is not valid.");
}
const _nyOBZhbA = _LDqPEeMD.dataFeeds.universalFallbackAddress;
let _yWZgCzvz = {};
const _GZOquQfn = _UNdagKEu(_pZcctlMB[0] || "");
if (_nyOBZhbA) {
const [_Zjfvsumn, _lKplLykm = '443'] = _nyOBZhbA.split(':');
_yWZgCzvz = { _Zjfvsumn, _lKplLykm };
} else {
const [_Zjfvsumn, _lKplLykm = '443'] = _GZOquQfn.split(':');
_yWZgCzvz = { _Zjfvsumn, _lKplLykm };
}
const _UNGfWfpn = new URL(_tLOGPavH._UNGfWfpn);
const _AugvRFpu = _UNGfWfpn.pathname;
let _kCOLwRHi = '';
const _HXIMYeMF = _UNGfWfpn.searchParams.get('remote');
if (_HXIMYeMF) {
_kCOLwRHi = atob(_HXIMYeMF);
} else if (_AugvRFpu.startsWith('/endpoint=')) {
_kCOLwRHi = _AugvRFpu.substring(10);
} else if (_AugvRFpu._JddHRFkb > 1 && _AugvRFpu.substring(1).includes('.')) {
_kCOLwRHi = _AugvRFpu.substring(1);
}
if (_kCOLwRHi) {
const [_Zjfvsumn, _lKplLykm = '443'] = _kCOLwRHi.split(':');
_yWZgCzvz = { _Zjfvsumn, _lKplLykm };
}
return await _eGnulJbI(_tLOGPavH, _rQbHFPwY, _yWZgCzvz);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _eGnulJbI(_tLOGPavH, _uzVvQJqC, _yWZgCzvz) {
const _mJrMMDau = new WebSocketPair();
const [clientEnd, _nSKbdfdu] = Object.values(_mJrMMDau);
_nSKbdfdu.accept();
let _FsaCmIgJ = { _NtpcVXiV: null };
const _AfpvKUnj = _tLOGPavH._qbpjcIjc.get("sec-websocket-protocol") || "";
const _QJmUKEuH = _KcTVFwWI(_nSKbdfdu, _AfpvKUnj);
_QJmUKEuH.pipeTo(new WritableStream({
async write(chunk) {
if (_FsaCmIgJ._NtpcVXiV) {
const _UjFDEoGo = _FsaCmIgJ._NtpcVXiV.writable.getWriter();
await _UjFDEoGo.write(chunk);
_UjFDEoGo.releaseLock();
return;
}
const { error, details } = await _NwaQHPay(chunk, _uzVvQJqC);
if (error) {
throw new Error(details);
}
const _bLXydvHd = new Uint8Array([details._MqPztFIw[0], 0]);
const _MqfSLxjM = chunk.slice(details.payloadIndex);
await _dYlVEkvu(_FsaCmIgJ, details._ltExFAwz, details._LWVmiIzj, _MqfSLxjM, _nSKbdfdu, _bLXydvHd, _yWZgCzvz);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_cqefpiOZ(_nSKbdfdu);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _dYlVEkvu(_FsaCmIgJ, _ltExFAwz, _LWVmiIzj, _HVaLbRRX, _tdwvlYJm, _bLXydvHd, _TcOJYqpb) {
const _KlItHsMl = async (_Zjfvsumn, _lKplLykm) => {
let _wIKXOHuM = _Zjfvsumn;
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(_Zjfvsumn)) {
_wIKXOHuM = `${atob('d3d3Lg==')}${_Zjfvsumn}${atob('LnNzbGlwLmlv')}`;
}
const _NtpcVXiV = connect({ _sEzdfqGt: _wIKXOHuM, _lKplLykm });
_FsaCmIgJ._NtpcVXiV = _NtpcVXiV;
const _UjFDEoGo = _NtpcVXiV.writable.getWriter();
await _UjFDEoGo.write(_HVaLbRRX);
_UjFDEoGo.releaseLock();
return _NtpcVXiV;
};
const _lgnKFiVS = async () => {
if (!_TcOJYqpb._Zjfvsumn) return;
console.log(`Direct connection failed, falling back to gateway: ${_TcOJYqpb._Zjfvsumn}`);
const _gPfykTJa = await _KlItHsMl(_TcOJYqpb._Zjfvsumn, parseInt(_TcOJYqpb._lKplLykm, 10));
_gPfykTJa.closed.catch(() => {}).finally(() => _cqefpiOZ(_tdwvlYJm));
_FeveYvFi(_gPfykTJa, _tdwvlYJm, _bLXydvHd, null);
};
try {
const _JoNtUsqh = await _KlItHsMl(_ltExFAwz, _LWVmiIzj);
_FeveYvFi(_JoNtUsqh, _tdwvlYJm, _bLXydvHd, _lgnKFiVS);
} catch (err) {
console.error("Primary connection failed:", err);
await _lgnKFiVS();
}
}
function _KcTVFwWI(_nSKbdfdu, _AfpvKUnj) {
let _quIViDix = false;
return new ReadableStream({
start(_WCmsfjcs) {
_nSKbdfdu.addEventListener("_rFvcSSUG", (event) => { if (_quIViDix) return; _WCmsfjcs.enqueue(event._ApMdqruF); });
_nSKbdfdu.addEventListener("close", () => { _cqefpiOZ(_nSKbdfdu); if (_quIViDix) return; _WCmsfjcs.close(); });
_nSKbdfdu.addEventListener("error", (err) => _WCmsfjcs.error(err));
if (_AfpvKUnj) {
try {
const _NKfZxRCH = atob(_AfpvKUnj.replace(/-/g, "+").replace(/_/g, "/"));
_WCmsfjcs.enqueue(Uint8Array.from(_NKfZxRCH, c => c.charCodeAt(0))._YuppqLgC);
} catch (_HiEJfbha) { console.error("Failed to decode early _ApMdqruF:", _HiEJfbha); }
}
},
cancel() { _quIViDix = true; _cqefpiOZ(_nSKbdfdu); },
});
}
async function _NwaQHPay(_YuppqLgC, _uzVvQJqC) {
if (_YuppqLgC.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _MqPztFIw = new Uint8Array(_YuppqLgC.slice(0, 1));
const _cgtuuugr = _MGCorXCp(new Uint8Array(_YuppqLgC.slice(1, 17)));
if (_cgtuuugr !== _uzVvQJqC) return { error: true, details: "Invalid _uzVvQJqC" };
const _yCipejHw = new Uint8Array(_YuppqLgC.slice(17, 18))[0];
const _KxCyBRys = new Uint8Array(_YuppqLgC.slice(18 + _yCipejHw, 19 + _yCipejHw))[0];
if (_KxCyBRys !== 1) return { error: true, details: `Unsupported _KxCyBRys: ${_KxCyBRys}` };
const _ENAeAjEi = 19 + _yCipejHw;
const _LWVmiIzj = new DataView(_YuppqLgC.slice(_ENAeAjEi, _ENAeAjEi + 2)).getUint16(0);
let _vQgEQKQV = _ENAeAjEi + 2;
const _ZtOAjgUg = new Uint8Array(_YuppqLgC.slice(_vQgEQKQV, _vQgEQKQV + 1))[0];
let _fnEADVHm = 0;
let _TmEHWXtC = _vQgEQKQV + 1;
let _ltExFAwz = "";
switch (_ZtOAjgUg) {
case 1: _fnEADVHm = 4; _ltExFAwz = new Uint8Array(_YuppqLgC.slice(_TmEHWXtC, _TmEHWXtC + _fnEADVHm)).join("."); break;
case 2: _fnEADVHm = new Uint8Array(_YuppqLgC.slice(_TmEHWXtC, _TmEHWXtC + 1))[0]; _TmEHWXtC++; _ltExFAwz = new TextDecoder().decode(_YuppqLgC.slice(_TmEHWXtC, _TmEHWXtC + _fnEADVHm)); break;
case 3: _fnEADVHm = 16; const _XrOmMQKl = new DataView(_YuppqLgC.slice(_TmEHWXtC, _TmEHWXtC + _fnEADVHm)); const _YRAcZaxw = []; for (let _RtvzwKWo = 0; _RtvzwKWo < 8; _RtvzwKWo++) _YRAcZaxw.push(_XrOmMQKl.getUint16(_RtvzwKWo * 2).toString(16)); _ltExFAwz = _YRAcZaxw.join(":"); break;
default: return { error: true, details: `Invalid _MsAmNsGB _BFbzJcsO: ${_ZtOAjgUg}` };
}
if (!_ltExFAwz) return { error: true, details: "Target _Zjfvsumn is empty" };
return { error: false, details: { _ltExFAwz, _LWVmiIzj, _MqPztFIw, payloadIndex: _TmEHWXtC + _fnEADVHm } };
}
async function _FeveYvFi(_NtpcVXiV, _tdwvlYJm, _LrEbQxBH, _jBcMnwgN) {
let _LoBVLRkD = _LrEbQxBH;
let _quPpdLcN = false;
let _eYhaQhIM = _NtpcVXiV._QJmUKEuH.pipeTo(new WritableStream({
write(chunk) {
_quPpdLcN = true;
if (_tdwvlYJm.readyState !== 1) throw new Error("Channel is not open");
if (_LoBVLRkD) {
const _LVYUhktn = new Uint8Array(_LoBVLRkD.byteLength + chunk.byteLength);
_LVYUhktn._wjpIBrxv(new Uint8Array(_LoBVLRkD));
_LVYUhktn._wjpIBrxv(new Uint8Array(chunk), _LoBVLRkD.byteLength);
_tdwvlYJm.send(_LVYUhktn._YuppqLgC);
_LoBVLRkD = null;
} else {
_tdwvlYJm.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _tdwvlYJm error:", err._rFvcSSUG);
});
await _eYhaQhIM;
if (!_quPpdLcN && _jBcMnwgN) {
_jBcMnwgN();
}
}
function _cqefpiOZ(_tdwvlYJm) {
try { if (_tdwvlYJm.readyState === 1 || _tdwvlYJm.readyState === 2) _tdwvlYJm.close(); } catch (_HiEJfbha) {}
}
const _jQbvWEdl = Array.from({ _JddHRFkb: 256 }, (_, _RtvzwKWo) => (_RtvzwKWo + 256).toString(16).slice(1));
function _MGCorXCp(_zXyXLMDs, offset = 0) {
return (
_jQbvWEdl[_zXyXLMDs[offset]] + _jQbvWEdl[_zXyXLMDs[offset + 1]] + _jQbvWEdl[_zXyXLMDs[offset + 2]] + _jQbvWEdl[_zXyXLMDs[offset + 3]] + "-" +
_jQbvWEdl[_zXyXLMDs[offset + 4]] + _jQbvWEdl[_zXyXLMDs[offset + 5]] + "-" +
_jQbvWEdl[_zXyXLMDs[offset + 6]] + _jQbvWEdl[_zXyXLMDs[offset + 7]] + "-" +
_jQbvWEdl[_zXyXLMDs[offset + 8]] + _jQbvWEdl[_zXyXLMDs[offset + 9]] + "-" +
_jQbvWEdl[_zXyXLMDs[offset + 10]] + _jQbvWEdl[_zXyXLMDs[offset + 11]] +
_jQbvWEdl[_zXyXLMDs[offset + 12]] + _jQbvWEdl[_zXyXLMDs[offset + 13]] +
_jQbvWEdl[_zXyXLMDs[offset + 14]] + _jQbvWEdl[_zXyXLMDs[offset + 15]]
).toLowerCase();
}
let _moylkUFq = { "N/A":"未知" };
async function _BNaVoekK(_UNGfWfpn, _mRsUTHLJ, _jBcMnwgN) {
try {
const _TWYTcqap = await fetch(_UNGfWfpn, {
_qbpjcIjc: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_TWYTcqap.ok) {
console.error(`获取 ${_UNGfWfpn} 失败: HTTP ${_TWYTcqap.status}`);
return _jBcMnwgN;
}
const _jcPqEnIk = await _TWYTcqap._jcPqEnIk();
return _mRsUTHLJ(_jcPqEnIk);
} catch (error) {
console.error(`获取或解析 ${_UNGfWfpn} 时发生网络错误: ${error._rFvcSSUG}`);
return _jBcMnwgN;
}
}
function _qgTguwZY(_jcPqEnIk) {
if (!_jcPqEnIk) return [];
const _VgEilHwm = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _ROAvVEQm = _jcPqEnIk.split(/[\s,;#|]+/);
const _EZlqCJHf = [];
for (const _psIFGbRt of _ROAvVEQm) {
const _eeFwsySq = _psIFGbRt.trim();
if (!_eeFwsySq) continue;
const _kaXnafRk = _eeFwsySq.lastIndexOf(':');
let _XTBgfOuN = _eeFwsySq;
if(_kaXnafRk > _eeFwsySq.lastIndexOf(']')) {
const _FhEdGgoG = _eeFwsySq.substring(_kaXnafRk + 1);
if(!isNaN(_FhEdGgoG) && _FhEdGgoG._JddHRFkb > 0) {
_XTBgfOuN = _eeFwsySq.substring(0, _kaXnafRk);
}
}
if (_nXScAjwm.isValid(_XTBgfOuN.replace(/[\[\]]/g, '')) || _VgEilHwm.test(_eeFwsySq)) {
_EZlqCJHf.push(_eeFwsySq);
}
}
return _EZlqCJHf;
}
function _gHJCODaz(_jcPqEnIk) {
if (!_jcPqEnIk) return [];
return _jcPqEnIk.split(/\s+/).filter(d => d.trim() !== '');
}
function _bvSXKmKa(_jcPqEnIk) {
if (!_jcPqEnIk) return { "N/A": "未知" };
try {
return JSON.parse(`{${_jcPqEnIk}}`);
} catch (_HiEJfbha) {
console.error("解析 _moylkUFq 失败:", _HiEJfbha);
return { "N/A": "未知" };
}
}
const _nXScAjwm = {
isValid: (_ropwOTIW) => _nXScAjwm.isIPv4(_ropwOTIW) || _nXScAjwm.isIPv6(_ropwOTIW),
isIPv4: (_ropwOTIW) => {
if (typeof _ropwOTIW !== 'string') return false;
const _YRAcZaxw = _ropwOTIW.split('.');
if (_YRAcZaxw._JddHRFkb !== 4) return false;
return _YRAcZaxw.every(_DtiwxJfm => {
const _wWqlperN = parseInt(_DtiwxJfm, 10);
return !isNaN(_wWqlperN) && _wWqlperN >= 0 && _wWqlperN <= 255 && String(_wWqlperN) === _DtiwxJfm;
});
},
isIPv6: (_ropwOTIW) => {
if (typeof _ropwOTIW !== '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]))$/_RtvzwKWo.test(_ropwOTIW);
},
toLong4: (_ropwOTIW) => _ropwOTIW.split('.').reduce((acc, octet, _RtvzwKWo) => acc + (parseInt(octet) << (8*(3-_RtvzwKWo))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_ropwOTIW) => {
try {
const _QIlaKYhd = _ropwOTIW.split('/')[0];
const _YRAcZaxw = _QIlaKYhd.split('::');
if (_YRAcZaxw._JddHRFkb > 2) return 0n;
let _MjohQFAo = [];
if (_YRAcZaxw[0]) {
_MjohQFAo = _YRAcZaxw[0].split(':');
}
let _pMLoVrHk = [];
if (_YRAcZaxw._JddHRFkb > 1 && _YRAcZaxw[1]) {
_pMLoVrHk = _YRAcZaxw[1].split(':');
}
if (_MjohQFAo._JddHRFkb + _pMLoVrHk._JddHRFkb > 8) return 0n;
const _oRMvuVjj = 8 - (_MjohQFAo._JddHRFkb + _pMLoVrHk._JddHRFkb);
const _TjSnuLlF = [
..._MjohQFAo,
...Array(_oRMvuVjj).fill('0'),
..._pMLoVrHk
].map(_DtiwxJfm => _DtiwxJfm || '0');
while(_TjSnuLlF._JddHRFkb < 8) {
_TjSnuLlF.push('0');
}
let _MGDgJyeh = 0n;
for (const _DtiwxJfm of _TjSnuLlF) {
if (_DtiwxJfm._JddHRFkb > 4) return 0n;
const _jnrUVtWz = BigInt('0x' + _DtiwxJfm);
_MGDgJyeh = (_MGDgJyeh << 16n) | _jnrUVtWz;
}
return _MGDgJyeh;
} catch(_HiEJfbha) {
return 0n;
}
},
fromBigInt6: (_MGDgJyeh) => {
if (typeof _MGDgJyeh !== '_MGDgJyeh' || _MGDgJyeh < 0n) return null;
const _YRAcZaxw = [];
for (let _RtvzwKWo = 0; _RtvzwKWo < 8; _RtvzwKWo++) {
_YRAcZaxw.unshift((_MGDgJyeh & 0xFFFFn).toString(16));
_MGDgJyeh >>= 16n;
}
let _bisZkXrV = { start: -1, _VmFLzuZx: 0 };
let _uKrFFSPB = { start: -1, _VmFLzuZx: 0 };
for (let _RtvzwKWo = 0; _RtvzwKWo < 8; _RtvzwKWo++) {
if (_YRAcZaxw[_RtvzwKWo] === '0') {
if (_uKrFFSPB.start === -1) _uKrFFSPB.start = _RtvzwKWo;
_uKrFFSPB._VmFLzuZx++;
} else {
if (_uKrFFSPB._VmFLzuZx > _bisZkXrV._VmFLzuZx) _bisZkXrV = { ..._uKrFFSPB };
_uKrFFSPB = { start: -1, _VmFLzuZx: 0 };
}
}
if (_uKrFFSPB._VmFLzuZx > _bisZkXrV._VmFLzuZx) _bisZkXrV = { ..._uKrFFSPB };
if (_bisZkXrV._VmFLzuZx > 1) {
_YRAcZaxw.splice(_bisZkXrV.start, _bisZkXrV._VmFLzuZx, '');
if (_bisZkXrV.start === 0) _YRAcZaxw.unshift('');
if (_bisZkXrV.start + _bisZkXrV._VmFLzuZx === 8) _YRAcZaxw.push('');
}
return _YRAcZaxw.join(':');
},
cidrToRange: (cidr, _QOeajihy = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _GIeYMDcj = parseInt(bitsStr, 10);
const _fPcQkudH = new Set();
if (_nXScAjwm.isIPv4(range)) {
if (isNaN(_GIeYMDcj) || _GIeYMDcj < 8 || _GIeYMDcj > 32) return [];
if (_GIeYMDcj === 32) return [range];
const _lmGAFZXL = _nXScAjwm.toLong4(range);
const _hQForZEn = (0xFFFFFFFF << (32 - _GIeYMDcj)) >>> 0;
const _HqRNgkeA = _lmGAFZXL & _hQForZEn;
const _WqVJMgJc = 1 << (32 - _GIeYMDcj);
if (_WqVJMgJc <= 2) return [];
const _SMXzYtWK = Math.min(_QOeajihy, _WqVJMgJc - 2);
let _wayMwJer = 0;
while (_fPcQkudH.size < _SMXzYtWK && _wayMwJer < _SMXzYtWK * 5) {
const _VCuiRThi = Math.floor(Math.random() * (_WqVJMgJc - 2)) + 1;
_fPcQkudH.add(_nXScAjwm.fromLong4((_HqRNgkeA + _VCuiRThi) >>> 0));
_wayMwJer++;
}
return Array.from(_fPcQkudH);
} else if (_nXScAjwm.isIPv6(range)) {
if (isNaN(_GIeYMDcj) || _GIeYMDcj < 16 || _GIeYMDcj > 128) return [];
if (_GIeYMDcj === 128) return [range];
const _MbsWMwmA = _nXScAjwm.toBigInt6(range);
const _hQForZEn = (2n ** BigInt(128 - _GIeYMDcj) - 1n);
const _HqRNgkeA = _MbsWMwmA & ~_hQForZEn;
const _PbiaOOxe = 2n ** BigInt(128 - _GIeYMDcj);
if (_PbiaOOxe <= 2n) return [];
let _wayMwJer = 0;
while (_fPcQkudH.size < _QOeajihy && _wayMwJer < _QOeajihy * 5) {
const _wpOsdqzO = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_wpOsdqzO);
let _EHFfYqtH = 0n;
for (const _xgdhUnDt of _wpOsdqzO) {
_EHFfYqtH = (_EHFfYqtH << 8n) | BigInt(_xgdhUnDt);
}
const _VCuiRThi = _EHFfYqtH % (_PbiaOOxe - 2n) + 1n;
_fPcQkudH.add(_nXScAjwm.fromBigInt6(_HqRNgkeA + _VCuiRThi));
_wayMwJer++;
}
return Array.from(_fPcQkudH);
}
return [];
} catch(_HiEJfbha) {
console.error(`CIDR to range failed for ${cidr}:`, _HiEJfbha);
return [];
}
}
};
function _gTHyfsRc(_tDPSvEdD, _LuBPKxiK) {
const _zihdsBTK = {};
const _wwgUjQqF = Object._wwgUjQqF(_LuBPKxiK);
const _YRAcZaxw = _wwgUjQqF.map(_HCrAOecu => {
const _lRiqrMwL = _tDPSvEdD * (_LuBPKxiK[_HCrAOecu] / 100);
return { _HCrAOecu, _QOeajihy: Math.floor(_lRiqrMwL), remainder: _lRiqrMwL - Math.floor(_lRiqrMwL) };
});
let _kEAfvOWV = _YRAcZaxw.reduce((acc, _DtiwxJfm) => acc + _DtiwxJfm._QOeajihy, 0);
_YRAcZaxw.sort((a, b) => b.remainder - a.remainder);
let _RxVwFhvl = _tDPSvEdD - _kEAfvOWV;
for (let _RtvzwKWo = 0; _RtvzwKWo < _RxVwFhvl; _RtvzwKWo++) {
_YRAcZaxw[_RtvzwKWo % _YRAcZaxw._JddHRFkb]._QOeajihy++;
}
for (const _DtiwxJfm of _YRAcZaxw) {
_zihdsBTK[_DtiwxJfm._HCrAOecu] = _DtiwxJfm._QOeajihy;
}
return _zihdsBTK;
}
async function _NiwNaKnS(_rVPBZubY) {
const _aUKSVfSl = _rVPBZubY.DB.prepare("SELECT _jnrUVtWz FROM kv_data WHERE _HCrAOecu = ?").bind(_VwvkkZpm);
const { _TyrgygfU } = await _aUKSVfSl.all();
return _TyrgygfU._JddHRFkb > 0 ? _TyrgygfU[0]._jnrUVtWz : null;
}
async function _jVNplCRb(_rVPBZubY, _eCcmnilz) {
const _aUKSVfSl = _rVPBZubY.DB.prepare(
"INSERT INTO kv_data (_HCrAOecu, _jnrUVtWz) VALUES (?, ?) ON CONFLICT(_HCrAOecu) DO UPDATE SET _jnrUVtWz = excluded._jnrUVtWz"
);
await _aUKSVfSl.bind(_VwvkkZpm, _eCcmnilz).run();
}
async function _hshPlzis(_tLOGPavH, _rVPBZubY) {
const { _eCcmnilz } = await _tLOGPavH.json();
const _YBETRdtU = await _NiwNaKnS(_rVPBZubY);
if (_YBETRdtU === _eCcmnilz) {
return _eIAngMNs({ success: true });
}
return _eIAngMNs({ success: false, _rFvcSSUG: '密码错误' }, 401);
}
async function _PfvEezLe(_tLOGPavH, _rVPBZubY) {
const _ByPxqiGB = await _fXwqgGZX(_rVPBZubY);
if (!_ByPxqiGB.visitorPassword || !_ByPxqiGB.visitorPassword._jkoNSIvl) {
return _eIAngMNs({ success: true });
}
try {
const { _eCcmnilz } = await _tLOGPavH.json();
const _aQVTqUJn = _ByPxqiGB.visitorPassword._eCcmnilz;
if (_aQVTqUJn && _eCcmnilz === _aQVTqUJn) {
return _eIAngMNs({ success: true });
}
return _eIAngMNs({ success: false, _rFvcSSUG: '访客密码错误' }, 401);
} catch (_HiEJfbha) {
return _eIAngMNs({ success: false, _rFvcSSUG: '无效请求' }, 400);
}
}
async function _dpikAnvx(_tLOGPavH, _rVPBZubY) {
const _oVOyLocT = await _NiwNaKnS(_rVPBZubY);
if (_oVOyLocT) {
return _eIAngMNs({ success: false, _rFvcSSUG: "密码已设置,无法重复初始化。" }, 403);
}
const { _eCcmnilz } = await _tLOGPavH.json();
if (!_eCcmnilz || _eCcmnilz._JddHRFkb < 6) {
return _eIAngMNs({ success: false, _rFvcSSUG: "密码长度不能少于6位。" }, 400);
}
await _jVNplCRb(_rVPBZubY, _eCcmnilz);
return _eIAngMNs({ success: true, _rFvcSSUG: "初始密码设置成功!请刷新页面并登录。" });
}
async function _gPfjfgjA(_tLOGPavH, _rVPBZubY) {
const { _SaLMLDGF, _gitLElus } = await _tLOGPavH.json();
const _YBETRdtU = await _NiwNaKnS(_rVPBZubY);
if (_YBETRdtU !== _SaLMLDGF) {
return _eIAngMNs({ success: false, _rFvcSSUG: "旧密码错误。" }, 403);
}
if (!_gitLElus || _gitLElus._JddHRFkb < 6) {
return _eIAngMNs({ success: false, _rFvcSSUG: "新密码长度不能少于6位。" }, 400);
}
await _jVNplCRb(_rVPBZubY, _gitLElus);
return _eIAngMNs({ success: true, _rFvcSSUG: "密码修改成功!" });
}
function _AQSoMTrk() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_YaeXtNFu: '',
api: {
_jkoNSIvl: true,
_rFvcSSUG: '维护中...',
},
ispFilter: { _jkoNSIvl: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_jkoNSIvl: true
},
websocketStreamer: {
_jkoNSIvl: true,
_UNGfWfpn: 'https://snippets.neib.cn'
},
cloudStorage: {
_jkoNSIvl: true
},
visitorPassword: {
_jkoNSIvl: false,
_eCcmnilz: '',
},
customSubPath: {
_jkoNSIvl: false,
_AugvRFpu: 'latest',
},
subscriptionId: {
_JddHRFkb: 8,
_LhAztbqy: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_jkoNSIvl: true,
template: 'vless://{_MtZNSJzW}@{_ropwOTIW}:{_lKplLykm}?encryption=none&security=tls&sni={_Zjfvsumn}&fp=random&_BFbzJcsO=ws&_Zjfvsumn={_Zjfvsumn}&_AugvRFpu={_AugvRFpu}#{_IUiWmmmU}',
selectionMode: 'first',
_tUzgyUfT: [
{ _IUiWmmmU: '默认配置', _Zjfvsumn: '', '_MtZNSJzW': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _AugvRFpu: '/?ed=2560' }
],
_LVJabMdA: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_jkoNSIvl: false,
_jcPqEnIk: '',
_REQDFOKj: 5
},
marquee: {
_jkoNSIvl: false,
_jcPqEnIk: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_jkoNSIvl: true,
sources: [
{ _IGcMXPZi: 'CF官方IPV4', _fPcQkudH: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _yaaUzZvU: false, _jkoNSIvl: true, _pWQRXuPF: 20 },
{ _IGcMXPZi: 'CF官方IPV6', _fPcQkudH: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _yaaUzZvU: false, _jkoNSIvl: true, _pWQRXuPF: 20 },
{ _IGcMXPZi: '反代优选0', _fPcQkudH: 'https://wvs.sosorg.nyc.mn/sub?_MtZNSJzW=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_BFbzJcsO=ws&_Zjfvsumn=ss.nzvrn.com&_AugvRFpu=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _yaaUzZvU: false, _jkoNSIvl: true, _pWQRXuPF: 30 },
{ _IGcMXPZi: '官方优选1', _fPcQkudH: 'https://ipdb.api.030101.xyz/?_BFbzJcsO=bestcf&_tgsGpbBk=true', _yaaUzZvU: false, _jkoNSIvl: true, _pWQRXuPF: 10 },
{ _IGcMXPZi: '反代优选2', _fPcQkudH: 'https://ipdb.api.030101.xyz/?_BFbzJcsO=bestproxy&_tgsGpbBk=true', _yaaUzZvU: false, _jkoNSIvl: true, _pWQRXuPF: 5 },
{ _IGcMXPZi: '官方优选2', _fPcQkudH: 'https://addressesapi.090227.xyz/_ropwOTIW.164746.xyz', _yaaUzZvU: false, _jkoNSIvl: true, _pWQRXuPF: 10 },
{ _IGcMXPZi: '官方优选3', _fPcQkudH: 'https://cfxr.eu.org/getSub?_Zjfvsumn=snipaste.huggy.qzz.io', _yaaUzZvU: false, _jkoNSIvl: true, _pWQRXuPF: 5 },
{ _IGcMXPZi: '官方优选4', _fPcQkudH: 'https://addressesapi.090227.xyz/CloudFlareYes', _yaaUzZvU: false, _jkoNSIvl: true, _pWQRXuPF: 10 }
]
},
customNodes: {
_jkoNSIvl: 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 _XjtkfkNO(_OSBSbnfT, _RntuQYiV) {
if (!_OSBSbnfT) return _RntuQYiV;
const _cWMxFVXv = { ..._RntuQYiV };
for (const _HCrAOecu in _RntuQYiV) {
if (_OSBSbnfT.hasOwnProperty(_HCrAOecu)) {
if (typeof _OSBSbnfT[_HCrAOecu] === 'object' && _OSBSbnfT[_HCrAOecu] !== null && !Array.isArray(_OSBSbnfT[_HCrAOecu]) && typeof _RntuQYiV[_HCrAOecu] === 'object' && _RntuQYiV[_HCrAOecu] !== null && !Array.isArray(_RntuQYiV[_HCrAOecu])) {
_cWMxFVXv[_HCrAOecu] = _XjtkfkNO(_OSBSbnfT[_HCrAOecu], _RntuQYiV[_HCrAOecu]);
} else {
_cWMxFVXv[_HCrAOecu] = _OSBSbnfT[_HCrAOecu];
}
}
}
return _cWMxFVXv;
}
async function _fXwqgGZX(_rVPBZubY) {
try {
const _aUKSVfSl = _rVPBZubY.DB.prepare("SELECT _jnrUVtWz FROM kv_data WHERE _HCrAOecu = ?").bind(_PSrONUXk);
const { _TyrgygfU } = await _aUKSVfSl.all();
const _tKpbmHuu = _TyrgygfU._JddHRFkb > 0 ? _TyrgygfU[0]._jnrUVtWz : null;
const _MnUQVKsk = _tKpbmHuu ? JSON.parse(_tKpbmHuu) : {};
return _XjtkfkNO(_MnUQVKsk, _AQSoMTrk());
} catch (_HiEJfbha) {
console.error("无法从D1获取或解析全局配置:", _HiEJfbha);
return _AQSoMTrk();
}
}
async function _FMFEIRfR(_rVPBZubY) {
const _QCBbPTKS = await _fXwqgGZX(_rVPBZubY);
return _eIAngMNs(_QCBbPTKS);
}
async function _KAwsSeEC(_tLOGPavH, _rVPBZubY, _FZZfXetd) {
try {
const { _QCBbPTKS, adminPassword } = await _tLOGPavH.json();
const _YBETRdtU = await _NiwNaKnS(_rVPBZubY);
if (_YBETRdtU !== adminPassword) {
return _eIAngMNs({ success: false, _rFvcSSUG: "管理员密码错误" }, 403);
}
const _aUKSVfSl = _rVPBZubY.DB.prepare(
"INSERT INTO kv_data (_HCrAOecu, _jnrUVtWz) VALUES (?, ?) ON CONFLICT(_HCrAOecu) DO UPDATE SET _jnrUVtWz = excluded._jnrUVtWz"
);
const _lyBEjlKE = _aUKSVfSl.bind(_PSrONUXk, JSON.stringify(_QCBbPTKS)).run();
_FZZfXetd.waitUntil(_lyBEjlKE);
return _eIAngMNs({ success: true, _rFvcSSUG: "配置已成功保存!" });
} catch (_HiEJfbha) {
return _eIAngMNs({ success: false, _rFvcSSUG: `保存失败: ${_HiEJfbha._rFvcSSUG}` }, 500);
}
}
async function _jqoVTvpE() {
const _xvrfnmEL = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _JQidLsSi = await fetch(_xvrfnmEL);
const _MFGNAmbs = await _JQidLsSi.json();
const _xXTrSXLx = 'https://www.bing.com' + _MFGNAmbs.images[0]._UNGfWfpn;
return fetch(_xXTrSXLx);
} catch (_HiEJfbha) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _eYOPpNYj(_ropwOTIW) {
try {
const _TWYTcqap = await fetch(`http://_ropwOTIW-api.com/json/${_ropwOTIW}?fields=status,_tgsGpbBk,countryCode,_QAFYBAqM&lang=zh-CN`);
if (_TWYTcqap.ok) {
const _ApMdqruF = await _TWYTcqap.json();
if (_ApMdqruF.status === 'success' && (_ApMdqruF.countryCode || _ApMdqruF._tgsGpbBk)) {
let _QAFYBAqM = _ApMdqruF._QAFYBAqM || '未知';
if (_QAFYBAqM.toLowerCase().includes('cloudflare')) {
_QAFYBAqM = 'CloudFlare';
}
return {
_IGcMXPZi: _moylkUFq[_ApMdqruF.countryCode] || _ApMdqruF._tgsGpbBk || _ApMdqruF.countryCode,
_QAFYBAqM: _QAFYBAqM
};
}
}
} catch (_HiEJfbha) {}
try {
const _TWYTcqap = await fetch(`https://api._ropwOTIW.sb/geoip/${_ropwOTIW}`);
if (_TWYTcqap.ok) {
const _ApMdqruF = await _TWYTcqap.json();
if (_ApMdqruF.country_code || _ApMdqruF._tgsGpbBk) {
let _QAFYBAqM = _ApMdqruF._QAFYBAqM || '未知';
if (_QAFYBAqM.toLowerCase().includes('cloudflare')) {
_QAFYBAqM = 'CloudFlare';
}
return {
_IGcMXPZi: _moylkUFq[_ApMdqruF.country_code] || _ApMdqruF._tgsGpbBk || _ApMdqruF.country_code,
_QAFYBAqM: _QAFYBAqM
};
}
}
} catch (_HiEJfbha) {}
return { _IGcMXPZi: '未知', _QAFYBAqM: '未知' };
}
async function _eAetCvBl(_tLOGPavH, _rVPBZubY) {
try {
const { _fPcQkudH } = await _tLOGPavH.json();
if (!Array.isArray(_fPcQkudH)) {
return _eIAngMNs({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _rBzmkdLt = _fPcQkudH.map(_ropwOTIW => _eYOPpNYj(_ropwOTIW).then(_zVtrXmGe => ({ _ropwOTIW, ..._zVtrXmGe })));
const _TyrgygfU = await Promise.all(_rBzmkdLt);
return _eIAngMNs(_TyrgygfU);
} catch (_HiEJfbha) {
return _eIAngMNs({ error: `获取地理位置失败: ${_HiEJfbha._rFvcSSUG}` }, 500);
}
}
async function _RyFIrbwM(_tLOGPavH, _rVPBZubY) {
const _QCBbPTKS = await _fXwqgGZX(_rVPBZubY);
if (!_QCBbPTKS.cloudStorage._jkoNSIvl) {
return _eIAngMNs({ _TyrgygfU: [], generatedBy: null });
}
try {
const _aUKSVfSl = _rVPBZubY.DB.prepare("SELECT _jnrUVtWz FROM kv_data WHERE _HCrAOecu = ?").bind(_hsaniIWp);
const { _TyrgygfU } = await _aUKSVfSl.all();
const _kkjAPcuU = _TyrgygfU._JddHRFkb > 0 ? _TyrgygfU[0]._jnrUVtWz : null;
const _JDGIYQSl = _kkjAPcuU ? JSON.parse(_kkjAPcuU) : null;
return _eIAngMNs(_JDGIYQSl || { _TyrgygfU: [], generatedBy: null });
} catch (_HiEJfbha) {
console.error("从D1读取缓存IP失败:", _HiEJfbha);
return _eIAngMNs({ _TyrgygfU: [], generatedBy: null });
}
}
async function _EtXkbxvv(_tLOGPavH, _rVPBZubY, _FZZfXetd) {
const _QCBbPTKS = await _fXwqgGZX(_rVPBZubY);
if (!_QCBbPTKS.cloudStorage._jkoNSIvl) {
return _eIAngMNs({ success: true, _rFvcSSUG: "云端存储已禁用,不保存结果。" });
}
const _BPsraGDZ = _tLOGPavH._qbpjcIjc.get('CF-Connecting-IP') || "未知IP";
const _tgsGpbBk = _tLOGPavH.cf?._tgsGpbBk || "未知";
const _Iqbpujul = _tLOGPavH.cf?._Iqbpujul || "";
let _SZawXYXw = _moylkUFq[_tgsGpbBk] || _tgsGpbBk;
if (_Iqbpujul && _Iqbpujul !== "未知城市" && _Iqbpujul !== _tgsGpbBk) _SZawXYXw = `${_SZawXYXw} ${_moylkUFq[_Iqbpujul] || _Iqbpujul}`;
const _vkPadcTC = {
_ropwOTIW: _IJyhXLSY(_BPsraGDZ),
_IGcMXPZi: _SZawXYXw.trim(),
time: _wIGFshcJ()
};
try {
const _tSQjmslR = await _tLOGPavH.json();
if (!Array.isArray(_tSQjmslR)) return _eIAngMNs({ error: "无效数据格式" }, 400);
const _ZwRGoTJV = _tSQjmslR.map(_GBEoFnDx => ({
_ropwOTIW: String(_GBEoFnDx._ropwOTIW || ''),
_lKplLykm: _GBEoFnDx._lKplLykm ? parseInt(_GBEoFnDx._lKplLykm, 10) : undefined,
_eyKkAvOd: parseInt(_GBEoFnDx._eyKkAvOd, 10),
_IGcMXPZi: typeof _GBEoFnDx._IGcMXPZi === 'string' ? _GBEoFnDx._IGcMXPZi.substring(0, 50) : 'N/A',
_QAFYBAqM: typeof _GBEoFnDx._QAFYBAqM === 'string' ? _GBEoFnDx._QAFYBAqM.substring(0, 100) : 'N/A'
}));
const _YkcwknUa = {
generatedBy: _vkPadcTC,
_TyrgygfU: _ZwRGoTJV
};
const _PcvxdnEh = _rVPBZubY.DB.prepare(
"INSERT INTO kv_data (_HCrAOecu, _jnrUVtWz) VALUES (?, ?) ON CONFLICT(_HCrAOecu) DO UPDATE SET _jnrUVtWz = excluded._jnrUVtWz"
).bind(_hsaniIWp, JSON.stringify(_YkcwknUa)).run();
if (_QCBbPTKS.telegram.bot_token && _QCBbPTKS.telegram.chat_id) {
const _sOsYgspS = _ZwRGoTJV.map(r => `${r._ropwOTIW} ~ ${r._IGcMXPZi}`).join('\n');
const _RfLHmOea = `优选完成!\n来源: ${_vkPadcTC._ropwOTIW} (${_vkPadcTC._IGcMXPZi})\n时间: ${_vkPadcTC.time}\n\n结果:\n${_sOsYgspS}`;
const _BGAUvbns = `https://api.telegram.org/bot${_QCBbPTKS.telegram.bot_token}/sendMessage?chat_id=${_QCBbPTKS.telegram.chat_id}&_jcPqEnIk=${encodeURIComponent(_RfLHmOea)}`;
const _VcFqXVuZ = fetch(_BGAUvbns).catch(_HiEJfbha => console.error("Telegram结果通知失败:", _HiEJfbha));
_FZZfXetd.waitUntil(Promise.all([_PcvxdnEh, _VcFqXVuZ]));
} else {
_FZZfXetd.waitUntil(_PcvxdnEh);
}
return _eIAngMNs({ success: true, _rFvcSSUG: "结果已保存" });
} catch (_HiEJfbha) {
return _eIAngMNs({ error: "D1写入失败", _rFvcSSUG: _HiEJfbha._rFvcSSUG }, 500);
}
}
async function _bpsBaIZq(_tLOGPavH, _rVPBZubY, _FZZfXetd) {
try {
const _oQpqPCvw = await _tLOGPavH.json();
if (!Array.isArray(_oQpqPCvw)) return _eIAngMNs({ error: "无效数据格式" }, 400);
const _YkcwknUa = {
_TyrgygfU: _oQpqPCvw
};
const _aUKSVfSl = _rVPBZubY.DB.prepare(
"INSERT INTO kv_data (_HCrAOecu, _jnrUVtWz) VALUES (?, ?) ON CONFLICT(_HCrAOecu) DO UPDATE SET _jnrUVtWz = excluded._jnrUVtWz"
);
const _lyBEjlKE = _aUKSVfSl.bind(_iidZOFTL, JSON.stringify(_YkcwknUa)).run();
_FZZfXetd.waitUntil(_lyBEjlKE);
return _eIAngMNs({ success: true });
} catch (_HiEJfbha) {
return _eIAngMNs({ error: "D1写入临时缓存失败", _rFvcSSUG: _HiEJfbha._rFvcSSUG }, 500);
}
}
function _GfySpiWM(_JddHRFkb, _LhAztbqy) {
let _YyMUdMVg = '';
const _XYcrjIJI = _LhAztbqy._JddHRFkb;
for (let _RtvzwKWo = 0; _RtvzwKWo < _JddHRFkb; _RtvzwKWo++) {
_YyMUdMVg += _LhAztbqy.charAt(Math.floor(Math.random() * _XYcrjIJI));
}
return _YyMUdMVg;
}
async function _AzTRZdav(_tLOGPavH, _rVPBZubY) {
try {
const _tSQjmslR = await _tLOGPavH.json();
if (!Array.isArray(_tSQjmslR) || _tSQjmslR._JddHRFkb === 0) {
return _eIAngMNs({ error: "无效或空的IP列表" }, 400);
}
const _QCBbPTKS = await _fXwqgGZX(_rVPBZubY);
const _OiBVJOEi = _QCBbPTKS.subscriptionId || { _JddHRFkb: 8, _LhAztbqy: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _pVBduKzY;
let _bAwextRO = false;
let _wayMwJer = 0;
const _IptLyIXo = 10;
while (!_bAwextRO && _wayMwJer < _IptLyIXo) {
_pVBduKzY = _GfySpiWM(_OiBVJOEi._JddHRFkb, _OiBVJOEi._LhAztbqy);
const { _TyrgygfU } = await _rVPBZubY.DB.prepare("SELECT _TTtmLTmr FROM optimized_results WHERE _TTtmLTmr = ?").bind(_pVBduKzY).all();
if (_TyrgygfU._JddHRFkb === 0) {
_bAwextRO = true;
}
_wayMwJer++;
}
if (!_bAwextRO) {
return _eIAngMNs({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _YDBwEyoM = JSON.stringify({ _fPcQkudH: _tSQjmslR });
await _rVPBZubY.DB.prepare(
"INSERT INTO optimized_results (_TTtmLTmr, _ApMdqruF) VALUES (?, ?)"
).bind(_pVBduKzY, _YDBwEyoM).run();
await _rVPBZubY.DB.prepare(
"INSERT INTO kv_data (_HCrAOecu, _jnrUVtWz) VALUES (?, ?) ON CONFLICT(_HCrAOecu) DO UPDATE SET _jnrUVtWz = excluded._jnrUVtWz"
).bind(_wjeAhTFT, _pVBduKzY).run();
return _eIAngMNs({ success: true, _TTtmLTmr: _pVBduKzY });
} catch (_HiEJfbha) {
return _eIAngMNs({ error: "保存优选结果失败", _rFvcSSUG: _HiEJfbha._rFvcSSUG }, 500);
}
}
async function _yxHarKeV(_tLOGPavH, _rVPBZubY) {
try {
const _pVBduKzY = _tLOGPavH._yfvvHyun._TTtmLTmr;
if (!_pVBduKzY) {
return new Response("缺少结果ID", { status: 400 });
}
const _YyMUdMVg = await _rVPBZubY.DB.prepare("SELECT _ApMdqruF FROM optimized_results WHERE _TTtmLTmr = ?").bind(_pVBduKzY).first();
if (!_YyMUdMVg) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _ApMdqruF = JSON.parse(_YyMUdMVg._ApMdqruF);
let _sOsYgspS = _ApMdqruF._fPcQkudH;
const _QCBbPTKS = await _fXwqgGZX(_rVPBZubY);
if (_QCBbPTKS.customNodes && _QCBbPTKS.customNodes._jkoNSIvl && _QCBbPTKS.customNodes.list) {
const _QjJJPotz = _QCBbPTKS.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _edZGDXeS = _QjJJPotz.map(_VoRrCSOy => {
let _MsAmNsGB = _VoRrCSOy;
let _lKplLykm = undefined;
let _IUiWmmmU = null;
if (_MsAmNsGB.includes('@')) {
const _YRAcZaxw = _MsAmNsGB.split('@');
_IUiWmmmU = _YRAcZaxw.pop();
_MsAmNsGB = _YRAcZaxw.join('@');
}
if (_MsAmNsGB.includes('#')) {
const _YRAcZaxw = _MsAmNsGB.split('#');
const _FhEdGgoG = _YRAcZaxw.pop();
if (!isNaN(_FhEdGgoG) && _FhEdGgoG.trim() !== '') {
_lKplLykm = parseInt(_FhEdGgoG, 10);
}
_MsAmNsGB = _YRAcZaxw.join('#');
}
return {
_ropwOTIW: _MsAmNsGB,
_lKplLykm: _lKplLykm,
_IGcMXPZi: _IUiWmmmU || _MsAmNsGB,
_QAFYBAqM: '自定义'
};
});
_sOsYgspS.unshift(..._edZGDXeS);
}
const { itemLink } = _QCBbPTKS;
const _MFRLvNVP = new URL(_tLOGPavH._UNGfWfpn)._sEzdfqGt;
let _MfAYAVoP;
if (_QCBbPTKS.websocketStreamer && _QCBbPTKS.websocketStreamer._jkoNSIvl) {
if (!itemLink || !itemLink._jkoNSIvl || !itemLink._tUzgyUfT || itemLink._tUzgyUfT._JddHRFkb === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_MfAYAVoP = _sOsYgspS.map((_GBEoFnDx, _JHshsHnZ) => {
let _IUiWmmmU;
if (_GBEoFnDx._QAFYBAqM === '自定义') {
_IUiWmmmU = `${_JHshsHnZ + 1} - ${_GBEoFnDx._IGcMXPZi}`;
} else {
_IUiWmmmU = `${_JHshsHnZ + 1} - ${_GBEoFnDx._IGcMXPZi || '未知'}`;
if (!_GBEoFnDx._QAFYBAqM || !_GBEoFnDx._QAFYBAqM.toLowerCase().includes('cloudflare')) {
_IUiWmmmU += '(反代)';
}
}
const _MqEouNex = _nXScAjwm.isIPv6(_GBEoFnDx._ropwOTIW) ? `[${_GBEoFnDx._ropwOTIW}]` : _GBEoFnDx._ropwOTIW;
const _lKplLykm = _GBEoFnDx._lKplLykm || 443;
const _veeNEVFy = itemLink._tUzgyUfT[0];
const _axEGtRaK = _veeNEVFy._MtZNSJzW || '';
const _MtZNSJzW = (_axEGtRaK && _zuGjTxKW(_axEGtRaK)) ? _axEGtRaK : crypto.randomUUID();
const _AugvRFpu = '/snippets?_ropwOTIW=endpointAddress:_lKplLykm(443)&nat64=6to4';
const _Zjfvsumn = _veeNEVFy._Zjfvsumn || _MFRLvNVP;
const _yfvvHyun = new URLSearchParams({
security: 'tls',
_BFbzJcsO: 'ws',
_Zjfvsumn: _Zjfvsumn,
sni: _Zjfvsumn,
fp: 'random'
});
return `vless://${_MtZNSJzW}@${_MqEouNex}:${_lKplLykm}?${_yfvvHyun.toString()}&_AugvRFpu=${encodeURIComponent(encodeURIComponent(_AugvRFpu))}#${encodeURIComponent(_IUiWmmmU)}`;
});
} else {
if (!itemLink || !itemLink._jkoNSIvl || !itemLink._tUzgyUfT || itemLink._tUzgyUfT._JddHRFkb === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _veeNEVFy = itemLink._tUzgyUfT[0];
const { _Zjfvsumn, _MtZNSJzW, _AugvRFpu } = _veeNEVFy;
_MfAYAVoP = _sOsYgspS.map((_GBEoFnDx, _JHshsHnZ) => {
let _IUiWmmmU;
if (_GBEoFnDx._QAFYBAqM === '自定义') {
_IUiWmmmU = `${_JHshsHnZ + 1} - ${_GBEoFnDx._IGcMXPZi}`;
} else {
_IUiWmmmU = `${_JHshsHnZ + 1} - ${_GBEoFnDx._IGcMXPZi || '未知'}`;
if (!_GBEoFnDx._QAFYBAqM || !_GBEoFnDx._QAFYBAqM.toLowerCase().includes('cloudflare')) {
_IUiWmmmU += '(反代)';
}
}
const _MqEouNex = _nXScAjwm.isIPv6(_GBEoFnDx._ropwOTIW) ? `[${_GBEoFnDx._ropwOTIW}]` : _GBEoFnDx._ropwOTIW;
const _lKplLykm = _GBEoFnDx._lKplLykm || 443;
const _yfvvHyun = new URLSearchParams({
security: 'tls',
_BFbzJcsO: 'ws',
_Zjfvsumn: _Zjfvsumn || _MFRLvNVP,
sni: _Zjfvsumn || _MFRLvNVP,
fp: 'random'
});
return `vless://${_MtZNSJzW}@${_MqEouNex}:${_lKplLykm}?${_yfvvHyun.toString()}&_AugvRFpu=${encodeURIComponent(encodeURIComponent(_AugvRFpu || ''))}#${encodeURIComponent(_IUiWmmmU)}`;
});
}
const _rWzGwoFQ = _MfAYAVoP.join('\n');
const _DNqQMYrt = btoa(_rWzGwoFQ);
return new Response(_DNqQMYrt, {
_qbpjcIjc: { 'Content-Type': '_jcPqEnIk/plain; _LhAztbqy=utf-8' }
});
} catch (_HiEJfbha) {
return new Response(`生成节点列表失败: ${_HiEJfbha._rFvcSSUG}`, { status: 500 });
}
}
async function _LPyKyNPG(_tLOGPavH) {
try {
const { _udmsadMC, _BFbzJcsO } = await _tLOGPavH.json();
if (!Array.isArray(_udmsadMC)) {
return new Response('Invalid _udmsadMC list', { status: 400 });
}
const _VNWXdLxa = _udmsadMC.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _UNGfWfpn = `https://cloudflare-dns.com/dns-query?_IUiWmmmU=${encodeURIComponent(domain.trim())}&_BFbzJcsO=${_BFbzJcsO || 'A'}`;
return fetch(_UNGfWfpn, { _qbpjcIjc: { 'Accept': 'application/dns-json' } })
.then(_TWYTcqap => _TWYTcqap.json())
.then(_ApMdqruF => (_ApMdqruF.Answer ? _ApMdqruF.Answer.map(a => a._ApMdqruF) : []))
.catch(() => []);
});
const _aHqsteZE = (await Promise.all(_VNWXdLxa)).flat();
const _TKdcmFGD = [...new Set(_aHqsteZE)];
if (_TKdcmFGD._JddHRFkb === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_TKdcmFGD.join('\n'), { _qbpjcIjc: { 'Content-Type': '_jcPqEnIk/plain; _LhAztbqy=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._rFvcSSUG}`, { status: 500 });
}
}
async function _KDkWBtOS(_tLOGPavH, _rVPBZubY) {
try {
const { _MZjeWHOw } = await _tLOGPavH.json();
if (!Array.isArray(_MZjeWHOw)) {
return _eIAngMNs({ error: "Invalid input, expected an object with a '_MZjeWHOw' array." }, 400);
}
const _qIDuAMRq = new Set();
const _HzxulXZa = _MZjeWHOw.map(_UNGfWfpn =>
_IFVmWHTs(_UNGfWfpn)
.then(_jcPqEnIk => {
if (!_jcPqEnIk) return;
const _ROAvVEQm = _jcPqEnIk.split(/[\s,;|]+/);
for (const _psIFGbRt of _ROAvVEQm) {
const _eeFwsySq = _psIFGbRt.trim();
if (_eeFwsySq) {
_qIDuAMRq.add(_eeFwsySq);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_UNGfWfpn}:`, err);
})
);
await Promise.all(_HzxulXZa);
return _eIAngMNs({ _fPcQkudH: Array.from(_qIDuAMRq) });
} catch (_HiEJfbha) {
return _eIAngMNs({ error: `Failed to process URLs: ${_HiEJfbha._rFvcSSUG}` }, 500);
}
}
async function _zkTsSGdk(_tLOGPavH, _rVPBZubY) {
const _QCBbPTKS = await _fXwqgGZX(_rVPBZubY);
if (!_QCBbPTKS.api._jkoNSIvl) {
return new Response(_QCBbPTKS.api._rFvcSSUG || 'API is disabled.', { status: 503 });
}
try {
const _aUKSVfSl = _rVPBZubY.DB.prepare("SELECT _jnrUVtWz FROM kv_data WHERE _HCrAOecu = ?").bind(_hsaniIWp);
const { _TyrgygfU: dbResults } = await _aUKSVfSl.all();
const _kkjAPcuU = dbResults._JddHRFkb > 0 ? dbResults[0]._jnrUVtWz : null;
const _JDGIYQSl = _kkjAPcuU ? JSON.parse(_kkjAPcuU) : null;
if (!_JDGIYQSl || !_JDGIYQSl._TyrgygfU || _JDGIYQSl._TyrgygfU._JddHRFkb === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_qbpjcIjc: { 'Content-Type': '_jcPqEnIk/plain; _LhAztbqy=utf-8' },
});
}
const _fPcQkudH = _JDGIYQSl._TyrgygfU.map(r => r._ropwOTIW);
return new Response(_fPcQkudH.join('\n'), {
_qbpjcIjc: { 'Content-Type': '_jcPqEnIk/plain; _LhAztbqy=utf-8' },
});
} catch (_HiEJfbha) {
console.error("API /_ropwOTIW 处理错误:", _HiEJfbha);
return new Response(`API处理时出错: ${_HiEJfbha._rFvcSSUG}`, { status: 500 });
}
}
function _uXcSTmLu(_YyMUdMVg, _JHshsHnZ, _QCBbPTKS, _MFRLvNVP) {
const { itemLink } = _QCBbPTKS;
if (!itemLink || !itemLink._jkoNSIvl) return null;
const { template, _tUzgyUfT, selectionMode, _LVJabMdA } = itemLink;
if (!_tUzgyUfT || _tUzgyUfT._JddHRFkb === 0) return null;
let _zxIFEgym;
if (selectionMode === 'random') {
_zxIFEgym = _tUzgyUfT[_JHshsHnZ % _tUzgyUfT._JddHRFkb];
} else if (selectionMode === 'first') {
_zxIFEgym = _tUzgyUfT[0];
} else {
_zxIFEgym = _tUzgyUfT.find(s => s._IUiWmmmU === selectionMode) || _tUzgyUfT[0];
}
if (!_zxIFEgym) return null;
let _NstJOAdt = template;
const _grOpVPex = _YyMUdMVg._lKplLykm || 443;
const _NXELuNUY = _nXScAjwm.isIPv6(_YyMUdMVg._ropwOTIW) ? `[${_YyMUdMVg._ropwOTIW}]` : _YyMUdMVg._ropwOTIW;
let _IUiWmmmU = `${_JHshsHnZ + 1} 、 ${_YyMUdMVg._IGcMXPZi || '未知'}`;
if (!_YyMUdMVg._QAFYBAqM || !_YyMUdMVg._QAFYBAqM.toLowerCase().includes('cloudflare')) {
_IUiWmmmU += '(反代)';
}
let _Zjfvsumn = _zxIFEgym._Zjfvsumn || _MFRLvNVP;
_NstJOAdt = _NstJOAdt.replace(/{_ropwOTIW}/g, _NXELuNUY)
.replace(/{_lKplLykm}/g, _grOpVPex)
.replace(/{_IUiWmmmU}/g, encodeURIComponent(_IUiWmmmU))
.replace(/{rank}/g, _JHshsHnZ + 1)
.replace(/{_IGcMXPZi}/g, encodeURIComponent(_YyMUdMVg._IGcMXPZi || '未知'))
.replace(/{_QAFYBAqM}/g, encodeURIComponent(_YyMUdMVg._QAFYBAqM || '未知'))
.replace(/{_Zjfvsumn}/g, encodeURIComponent(_Zjfvsumn))
.replace(/{_MtZNSJzW}/g, encodeURIComponent(_zxIFEgym['_MtZNSJzW'] || ''))
.replace(/{_AugvRFpu}/g, encodeURIComponent(encodeURIComponent(_zxIFEgym._AugvRFpu || '')));
if (_LVJabMdA) {
_LVJabMdA.forEach(field => {
const _HzrsqNuM = new RegExp('{' + field._IUiWmmmU + '}', 'g');
_NstJOAdt = _NstJOAdt.replace(_HzrsqNuM, encodeURIComponent(field._jnrUVtWz));
});
}
return _NstJOAdt;
}
async function _lVRsgTFP(_tLOGPavH, _rVPBZubY) {
const _QCBbPTKS = await _fXwqgGZX(_rVPBZubY);
if (!_QCBbPTKS.itemLink._jkoNSIvl) {
return new Response("Item _NstJOAdt feature is disabled.", { status: 503, _qbpjcIjc: { 'Content-Type': '_jcPqEnIk/plain; _LhAztbqy=utf-8' } });
}
try {
const _aUKSVfSl = _rVPBZubY.DB.prepare("SELECT _jnrUVtWz FROM kv_data WHERE _HCrAOecu = ?").bind(_hsaniIWp);
const { _TyrgygfU: dbResults } = await _aUKSVfSl.all();
const _kkjAPcuU = dbResults._JddHRFkb > 0 ? dbResults[0]._jnrUVtWz : null;
const _JDGIYQSl = _kkjAPcuU ? JSON.parse(_kkjAPcuU) : null;
if (!_JDGIYQSl || !_JDGIYQSl._TyrgygfU || _JDGIYQSl._TyrgygfU._JddHRFkb === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_qbpjcIjc: { 'Content-Type': '_jcPqEnIk/plain; _LhAztbqy=utf-8' },
});
}
const _MFRLvNVP = new URL(_tLOGPavH._UNGfWfpn)._sEzdfqGt;
const _ghJDkxbC = _JDGIYQSl._TyrgygfU.map((_YyMUdMVg, _JHshsHnZ) => {
return _uXcSTmLu(_YyMUdMVg, _JHshsHnZ, _QCBbPTKS, _MFRLvNVP);
}).filter(Boolean);
if (_ghJDkxbC._JddHRFkb === 0) {
return new Response("Could not generate any _GBEoFnDx links from the available IPs.", {
status: 500,
_qbpjcIjc: { 'Content-Type': '_jcPqEnIk/plain; _LhAztbqy=utf-8' },
});
}
return new Response(_ghJDkxbC.join('\n'), {
_qbpjcIjc: { 'Content-Type': '_jcPqEnIk/plain; _LhAztbqy=utf-8' },
});
} catch (_HiEJfbha) {
console.error("API /api/endpoints error:", _HiEJfbha);
return new Response(`Error processing API _tLOGPavH: ${_HiEJfbha._rFvcSSUG}`, { status: 500 });
}
}
async function _NOvbxGjW(_tLOGPavH, _rVPBZubY, _FZZfXetd) {
const _BPsraGDZ = _tLOGPavH._qbpjcIjc.get('CF-Connecting-IP') || "未知IP";
const [
_RjuCirzs,
_lMDPQYHW,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_BNaVoekK(_XseloBEG, _qgTguwZY, []),
_BNaVoekK(_MPZknCNB, _qgTguwZY, []),
_BNaVoekK(_fQxZIhkI, _gHJCODaz, []),
_BNaVoekK(_HwNBkUTg, _bvSXKmKa, { "N/A": "未知" })
]);
_moylkUFq = fetchedCountryMap;
let _fDWfKiBT = false;
let _ByPxqiGB;
try {
const _eCcmnilz = await _NiwNaKnS(_rVPBZubY);
_fDWfKiBT = !!_eCcmnilz;
_ByPxqiGB = await _fXwqgGZX(_rVPBZubY);
} catch (_HiEJfbha) {
if (_HiEJfbha._rFvcSSUG && _HiEJfbha._rFvcSSUG.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _XTAjvCTz = "CREATE TABLE IF NOT EXISTS kv_data (_HCrAOecu TEXT PRIMARY KEY, _jnrUVtWz TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_TTtmLTmr TEXT PRIMARY KEY, _ApMdqruF TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _rVPBZubY.DB.exec(_XTAjvCTz);
console.log("数据表创建成功。");
_fDWfKiBT = false;
_ByPxqiGB = _AQSoMTrk();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._rFvcSSUG}`, {
status: 500,
_qbpjcIjc: { 'Content-Type': '_jcPqEnIk/html;_LhAztbqy=UTF-8' }
});
}
} else {
let _ongRfmae = _VCgvLcUo(_HiEJfbha._rFvcSSUG);
return new Response(_ongRfmae, { _qbpjcIjc: { 'Content-Type': '_jcPqEnIk/html;_LhAztbqy=UTF-8' } });
}
}
if (_ByPxqiGB.telegram.bot_token && _ByPxqiGB.telegram.chat_id) {
const _tgsGpbBk = _tLOGPavH.cf?._tgsGpbBk || "未知";
const _Iqbpujul = _tLOGPavH.cf?._Iqbpujul || "";
let _SZawXYXw = _moylkUFq[_tgsGpbBk] || _tgsGpbBk;
if (_Iqbpujul && _Iqbpujul !== "未知城市" && _Iqbpujul !== _tgsGpbBk) _SZawXYXw = `${_SZawXYXw} ${_moylkUFq[_Iqbpujul] || _Iqbpujul}`;
const _hDtiqWoU = _wIGFshcJ();
const _HRMaUGns = _tLOGPavH._UNGfWfpn;
const _RfLHmOea = `访客: ${_BPsraGDZ}\n位置: ${_SZawXYXw.trim()}\n时间: ${_hDtiqWoU}\n来自:${_HRMaUGns}`;
const _BGAUvbns = `https://api.telegram.org/bot${_ByPxqiGB.telegram.bot_token}/sendMessage?chat_id=${_ByPxqiGB.telegram.chat_id}&_jcPqEnIk=${encodeURIComponent(_RfLHmOea)}`;
_FZZfXetd.waitUntil(fetch(_BGAUvbns).catch(_HiEJfbha => console.error("Telegram通知失败:", _HiEJfbha)));
}
let _xXLJucLV = _ONqOzFLq();
const _djZLDeRj = {
_QCBbPTKS: _ByPxqiGB,
status: {
_fDWfKiBT: _fDWfKiBT,
}
};
_xXLJucLV = _xXLJucLV.replace('__PAGE_DATA_JSON__', JSON.stringify(_djZLDeRj));
_xXLJucLV = _xXLJucLV.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_RjuCirzs));
_xXLJucLV = _xXLJucLV.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_lMDPQYHW));
_xXLJucLV = _xXLJucLV.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_xXLJucLV = _xXLJucLV.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_moylkUFq));
return new Response(_xXLJucLV, {
_qbpjcIjc: { 'Content-Type': '_jcPqEnIk/html;_LhAztbqy=UTF-8' },
});
}
function _eIAngMNs(_ABoGvlkq, status = 200, _qbpjcIjc = {}) {
return new Response(JSON.stringify(_ABoGvlkq), {
status,
_qbpjcIjc: { 'Content-Type': 'application/json;_LhAztbqy=UTF-8', ..._qbpjcIjc }
});
}
function _wIGFshcJ(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 _IJyhXLSY(_ropwOTIW) {
if (!_ropwOTIW || typeof _ropwOTIW !== 'string') return "无效IP";
if(_nXScAjwm.isIPv4(_ropwOTIW)){
const _YRAcZaxw = _ropwOTIW.split('.');
if (_YRAcZaxw._JddHRFkb === 4) return `${_YRAcZaxw[0]}.*.*.${_YRAcZaxw[3]}`;
}
if(_nXScAjwm.isIPv6(_ropwOTIW)){
const _YRAcZaxw = _ropwOTIW.split(':');
if (_YRAcZaxw._JddHRFkb > 2) return `${_YRAcZaxw[0]}:...:${_YRAcZaxw[_YRAcZaxw._JddHRFkb - 1]}`;
}
return _ropwOTIW;
}
function _VCgvLcUo(_RCdptlmi) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _LhAztbqy="UTF-8"><title>需要设置</title>
<_ceWDkDOB>
_ABoGvlkq { font-family: sans-serif; background: #1a1a1a; _tcfAilsG: #e0e0e0; display: flex; justify-_mwHbituu: center; align-items: center; height: 100vh; margin: 0; }
._gZkeklQH { max-_kOgKwkOq: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _tcfAilsG: #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 { _tcfAilsG: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_aLHpyXzM: 1rem; }
</_ceWDkDOB>
</head><_ABoGvlkq>
<div class="_gZkeklQH">
<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>
${_RCdptlmi ? `<div class="error"><strong>当前错误信息:</strong> ${_RCdptlmi.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_ABoGvlkq></html>`;
}
function _ONqOzFLq() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _LhAztbqy="UTF-8"> <meta _IUiWmmmU="viewport" _mwHbituu="_kOgKwkOq=device-_kOgKwkOq, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_NstJOAdt 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>
<_ceWDkDOB>
:root { --primary-_tcfAilsG: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_tcfAilsG: #8c939d; --light-bg: #1A1C20; --_mwHbituu-bg: #25282E; --border-_tcfAilsG: #40444C; --_jcPqEnIk-_tcfAilsG: #E0E0E0; --_jcPqEnIk-light: #B0B0B0; --success-_tcfAilsG: #30A46C; --danger-_tcfAilsG: #DA3633; --warning-_tcfAilsG: #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; }
_ABoGvlkq { font-family: var(--font-family-sans); background-_tcfAilsG: var(--light-bg); _tcfAilsG: var(--_jcPqEnIk-_tcfAilsG); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_tcfAilsG 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_XcEGnJTP { position: fixed; _aLHpyXzM: 0; _pwsnCRRR: 0; _kOgKwkOq: 100%; height: 100%; z-_JHshsHnZ: -1; display: none; }
._BGFaCftR-_gZkeklQH { max-_kOgKwkOq: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_JHshsHnZ: 1; }
#_jVYsuepj { position: fixed; _aLHpyXzM: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_JHshsHnZ: 10; }
#marquee-_gZkeklQH { overflow: hidden; white-space: nowrap; background-_tcfAilsG: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _tcfAilsG: var(--primary-_tcfAilsG); padding: 0.5rem 0; margin-_aLHpyXzM: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_jcPqEnIk { display: inline-block; padding-_pwsnCRRR: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_LrEbQxBH { _jcPqEnIk-align: center; margin-_aLHpyXzM: 1rem; margin-bottom: 2rem; }
_LrEbQxBH h1 { white-space: pre-wrap; font-size: 2.25em; _tcfAilsG: var(--primary-_tcfAilsG); font-weight: 700; _jcPqEnIk-shadow: 0 0 10px rgba(var(--primary-_tcfAilsG-rgb), 0.3); }
.card { background-_tcfAilsG: 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-_tcfAilsG); }
.progress-section #_yPvKVZqJ { _kOgKwkOq: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_tcfAilsG: var(--border-_tcfAilsG); overflow: hidden; }
.progress-section #_yPvKVZqJ::-webkit-progress-_jnrUVtWz { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _jcPqEnIk-align: center; margin-_aLHpyXzM: 0.75em; font-size: 0.95em; _tcfAilsG: var(--_jcPqEnIk-light); min-height: 1.5em; }
.section-_LrEbQxBH { display: flex; flex-wrap: wrap; justify-_mwHbituu: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_tcfAilsG); gap: 1rem; }
.section-_LrEbQxBH h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _tcfAilsG: var(--secondary-_tcfAilsG); _jcPqEnIk-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _kOgKwkOq: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _kOgKwkOq: 100%; border-collapse: collapse; margin-_aLHpyXzM: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_tcfAilsG); padding: 0.8em; _jcPqEnIk-align: _pwsnCRRR; vertical-align: middle; white-space: nowrap; }
th { background-_tcfAilsG: #2c3038; font-weight: 500; }
tbody tr:hover { background-_tcfAilsG: #30333a; }
td._ropwOTIW-_MsAmNsGB { font-weight: 500; font-family: var(--font-family-mono); _tcfAilsG: var(--primary-_tcfAilsG); }
td.ping-_jnrUVtWz { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _jcPqEnIk-align: right; }
.btn { display: inline-flex; align-items: center; justify-_mwHbituu: center; font-weight: 500; _jcPqEnIk-align: center; cursor: pointer; user-_fwZBNgCx: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _tcfAilsG: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_pwsnCRRR: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _tcfAilsG: var(--primary-_tcfAilsG); border: 1px solid var(--primary-_tcfAilsG); }
.btn-outline:hover { background-_tcfAilsG: var(--primary-_tcfAilsG); _tcfAilsG: var(--_mwHbituu-bg); }
._BGFaCftR-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._BGFaCftR-download-buttons .btn { _kOgKwkOq: 100%; margin: 0; }
.tooltip-notification { position: fixed; _aLHpyXzM: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _tcfAilsG: #fff; font-size: 0.95em; z-_JHshsHnZ: 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); }
#_rApuwiTH, #_uMCCwbmL, #_LnqDJVLe, #_IwqrkZha, #_QFpHPcPN { display: none; position: fixed; z-_JHshsHnZ: 10000; _pwsnCRRR: 0; _aLHpyXzM: 0; _kOgKwkOq: 100%; height: 100%; background-_tcfAilsG: rgba(0,0,0,0.6); justify-_mwHbituu: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_mwHbituu, ._BGFaCftR-modal-_mwHbituu { background-_tcfAilsG: var(--_mwHbituu-bg); padding: 2rem; border: 1px solid var(--border-_tcfAilsG); border-radius: var(--border-radius-md); _kOgKwkOq: 95%; max-_kOgKwkOq: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_IwqrkZha .modal-_mwHbituu { max-_kOgKwkOq: 500px; }
.modal-_mwHbituu h3, ._BGFaCftR-modal-_LrEbQxBH h3 { margin-_aLHpyXzM: 0; margin-bottom: 1.5rem; _tcfAilsG: var(--primary-_tcfAilsG); _jcPqEnIk-align: center; }
.modal-buttons { display: flex; justify-_mwHbituu: flex-end; gap: 1rem; margin-_aLHpyXzM: 2rem; border-_aLHpyXzM: 1px solid var(--border-_tcfAilsG); padding-_aLHpyXzM: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_tcfAilsG), rgba(0,0,0,0)); margin: 2rem 0; }
._BGFaCftR-modal-_LrEbQxBH { display: flex; justify-_mwHbituu: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_tcfAilsG); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _tcfAilsG: var(--_jcPqEnIk-light); cursor: pointer; background: none; border: none; padding: 0; }
._BGFaCftR-list-_GBEoFnDx { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_tcfAilsG); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._BGFaCftR-_IUiWmmmU { font-size: 1.1em; font-weight: 600; }
._BGFaCftR-links a { display: block; _tcfAilsG: var(--primary-_tcfAilsG); _jcPqEnIk-decoration: none; margin-_aLHpyXzM: 0.5rem; word-break: break-all; }
._BGFaCftR-links a:hover { _jcPqEnIk-decoration: underline; }
._BGFaCftR-links span { _tcfAilsG: var(--_jcPqEnIk-light); }
#visitorPasswordPrompt { _jcPqEnIk-align: center; }
#visitorPasswordPrompt h3 { _tcfAilsG: var(--primary-_tcfAilsG); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _tcfAilsG: var(--_jcPqEnIk-light); margin-bottom: 1.5rem; }
._eCcmnilz-input-group { display: flex; gap: 10px; max-_kOgKwkOq: 400px; margin: 0 auto; }
._eCcmnilz-input-group input { flex-grow: 1; _jcPqEnIk-align: center; }
._eCcmnilz-input-group .btn { margin-_pwsnCRRR: 0; }
._TyrgygfU-actions-_gZkeklQH { _jcPqEnIk-align: center; margin-bottom: 1.5rem; }
._TyrgygfU-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._TyrgygfU-api-buttons .btn { margin: 0; _kOgKwkOq: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_mwHbituu 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 _fwZBNgCx, .form-grid-control textarea { _kOgKwkOq: 100%; background-_tcfAilsG: var(--light-bg); border: 1px solid var(--border-_tcfAilsG); border-radius: var(--border-radius-sm); _tcfAilsG: var(--_jcPqEnIk-_tcfAilsG); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_tcfAilsG 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _fwZBNgCx:focus, .form-grid-control textarea:focus { border-_tcfAilsG: var(--primary-_tcfAilsG); box-shadow: 0 0 0 2px rgba(var(--primary-_tcfAilsG-rgb), 0.2); outline: none; }
.form-grid-control input[_BFbzJcsO="_tcfAilsG"] { min-_kOgKwkOq: auto; padding: 2px; _kOgKwkOq: 2.5em; height: 2.5em; }
.form-grid-control input[_BFbzJcsO="checkbox"] { _kOgKwkOq: auto; flex-shrink: 0; height: 1.2em; _kOgKwkOq: 1.2em; }
.form-grid-control ._pWQRXuPF-input { _kOgKwkOq: 80px; _jcPqEnIk-align: right; }
.tooltip-_mmUhPlfW { display: inline-flex; _kOgKwkOq: 16px; height: 16px; align-items: center; justify-_mwHbituu: center; background-_tcfAilsG: var(--secondary-_tcfAilsG); _tcfAilsG: var(--_mwHbituu-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_fwZBNgCx: none; }
#tooltip-popup { position: fixed; background-_tcfAilsG: #383c4a; _tcfAilsG: #fff; padding: 10px 15px; border-radius: 6px; z-_JHshsHnZ: 10001; font-size: 0.85em; max-_kOgKwkOq: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_tcfAilsG); pointer-events: none; }
#custom-fields-_gZkeklQH .form-grid-control { gap: 5px; } #custom-fields-_gZkeklQH .form-grid-control input { flex: 1; }
.parameter-_wjpIBrxv-_DGstvWLj { border: 1px solid var(--border-_tcfAilsG); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_wjpIBrxv-_LrEbQxBH { display: flex; justify-_mwHbituu: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_wjpIBrxv-_LrEbQxBH input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_aLHpyXzM: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._jcPqEnIk-_tcfAilsG-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _kOgKwkOq: 100%; }
._jcPqEnIk-_tcfAilsG-grid input[_BFbzJcsO="_tcfAilsG"] { grid-column: 1 / 2; }
._jcPqEnIk-_tcfAilsG-grid input[_BFbzJcsO="_jcPqEnIk"], ._jcPqEnIk-_tcfAilsG-grid textarea { grid-column: 2 / 3; }
#_IwqrkZha .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_IwqrkZha .btn-group { display: flex; }
#_IwqrkZha .sub-btn { flex-grow: 1; margin: 0; }
#_IwqrkZha ._ThwqdAqi-btn { flex-shrink: 0; margin-_pwsnCRRR: -1px; border-_aLHpyXzM-_pwsnCRRR-radius: 0; border-bottom-_pwsnCRRR-radius: 0; }
#_QFpHPcPN .modal-_mwHbituu { max-_kOgKwkOq: 300px; background: white; padding: 1rem; _jcPqEnIk-align: center; }
#qrCodeImg { max-_kOgKwkOq: 100%; }
@media (max-_kOgKwkOq: 768px) {
html { font-size: 15px; } ._BGFaCftR-_gZkeklQH { padding: 0 0.8rem; } _LrEbQxBH { margin-_aLHpyXzM: 2.5rem; margin-bottom: 1.5rem; } #_jVYsuepj { _aLHpyXzM: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_ceWDkDOB>
<_ceWDkDOB _TTtmLTmr="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_mwHbituu-bg: #FFFFFF; --border-_tcfAilsG: #DCDFE6; --_jcPqEnIk-_tcfAilsG: #303133; --_jcPqEnIk-light: #606266; }
.theme-light .card { background-_tcfAilsG: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_tcfAilsG: #F5F7FA; }
.theme-light tbody tr:hover { background-_tcfAilsG: #ECF5FF; }
.theme-matrix { --primary-_tcfAilsG: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_mwHbituu-bg: #0D0208; --border-_tcfAilsG: #00FF41; --_jcPqEnIk-_tcfAilsG: #00FF41; --_jcPqEnIk-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_tcfAilsG: rgba(0, 20, 0, 0.7); _jcPqEnIk-shadow: 0 0 5px var(--primary-_tcfAilsG); backdrop-filter: none; }
.theme-matrix th { background-_tcfAilsG: #000; }
.theme-matrix tbody tr:hover { background-_tcfAilsG: #010; }
.theme-matrix .btn { _jcPqEnIk-shadow: none; _tcfAilsG: #000; }
.theme-matrix .btn-outline { background-_tcfAilsG: transparent; }
.theme-modern-glass { --primary-_tcfAilsG: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_mwHbituu-bg: rgba(30, 30, 40, 0.6); --border-_tcfAilsG: rgba(255, 255, 255, 0.2); --_jcPqEnIk-_tcfAilsG: #F0F0F0; --_jcPqEnIk-light: #A0A0B0; --border-radius-md: 12px; }
_ABoGvlkq.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-_tcfAilsG: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_mwHbituu-bg: rgba(30, 30, 40, 0.6); --border-_tcfAilsG: rgba(255, 255, 255, 0.2); --_jcPqEnIk-_tcfAilsG: #F0F0F0; --_jcPqEnIk-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_tcfAilsG: var(--_mwHbituu-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_tcfAilsG); }
.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-_tcfAilsG: rgba(0,0,0,0.3); border-right-_tcfAilsG: 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); _jcPqEnIk-shadow: 0 1px 2px rgba(0,0,0,0.2); _tcfAilsG: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_tcfAilsG: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _jcPqEnIk-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_tcfAilsG); border-_tcfAilsG: var(--primary-_tcfAilsG); _tcfAilsG: #fff; }
.glassy-components _LrEbQxBH h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _jcPqEnIk; -webkit-_jcPqEnIk-fill-_tcfAilsG: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _tcfAilsG: transparent; }
.theme-aurora-glass { --primary-_tcfAilsG: #38bdf8; --light-bg: #0c0a09; --_mwHbituu-bg: rgba(23, 23, 23, 0.5); --border-_tcfAilsG: rgba(255, 255, 255, 0.15); --_jcPqEnIk-_tcfAilsG: #f2f2f2; --_jcPqEnIk-light: #a3a3a3; }
_ABoGvlkq.theme-aurora-glass::before { _mwHbituu: ''; position: fixed; _aLHpyXzM: 0; _pwsnCRRR: 0; _kOgKwkOq: 100%; height: 100%; z-_JHshsHnZ: -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-_tcfAilsG: #08fdd8; --light-bg: #010409; --_mwHbituu-bg: rgba(22, 27, 34, 0.6); --border-_tcfAilsG: rgba(139, 148, 158, 0.3); --_jcPqEnIk-_tcfAilsG: #e6edf3; --_jcPqEnIk-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_tcfAilsG), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_tcfAilsG-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_tcfAilsG-rgb), 0.5); }
.theme-marble-light { --primary-_tcfAilsG: #bfa37c; --light-bg: #f7f5f2; --_mwHbituu-bg: #ffffff; --border-_tcfAilsG: #e0dcd5; --_jcPqEnIk-_tcfAilsG: #3d3a36; --_jcPqEnIk-light: #6b6661; }
_ABoGvlkq.theme-marble-light { background-image: _UNGfWfpn('_ApMdqruF:image/svg+xml,%3Csvg _kOgKwkOq="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-_tcfAilsG: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_ceWDkDOB>
</head><_ABoGvlkq _TTtmLTmr="pageBody">
<_XcEGnJTP _TTtmLTmr="background-_XcEGnJTP"></_XcEGnJTP>
<div _TTtmLTmr="_rApuwiTH">
<div class="modal-_mwHbituu">
<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 _BFbzJcsO="_eCcmnilz" _TTtmLTmr="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _BFbzJcsO="_eCcmnilz" _TTtmLTmr="confirmPassword"></div></div>
<div class="modal-buttons"><button _TTtmLTmr="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_BGFaCftR-_gZkeklQH">
<button _TTtmLTmr="_jVYsuepj" class="btn btn-outline"></button>
<div _TTtmLTmr="marquee-_gZkeklQH"><div _TTtmLTmr="marquee-_jcPqEnIk"></div></div>
<_LrEbQxBH><h1 _TTtmLTmr="pageTitle"></h1></_LrEbQxBH>
<div class="card" _TTtmLTmr="visitorPasswordPrompt" _ceWDkDOB="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_eCcmnilz-input-group">
<input _BFbzJcsO="_eCcmnilz" _TTtmLTmr="visitorPasswordEntry" _HzrsqNuM="访客密码">
<button _TTtmLTmr="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _TTtmLTmr="_tntCnBxT" _ceWDkDOB="display: block;">
<div class="card progress-section">
<div _TTtmLTmr="progressDisplay">
<progress _TTtmLTmr="_yPvKVZqJ" _jnrUVtWz="0" max="100"></progress>
<div _TTtmLTmr="status">正在初始化...</div>
</div>
</div>
<div class="card _BGFaCftR-download-section">
<div class="section-_LrEbQxBH"><h2 _TTtmLTmr="appDownloadTitleEl"></h2></div>
<div class="_BGFaCftR-download-buttons">
<button class="btn" _ApMdqruF-_NmOrlwxP="android">安卓客户端</button>
<button class="btn" _ApMdqruF-_NmOrlwxP="ios">苹果客户端</button>
<button class="btn" _ApMdqruF-_NmOrlwxP="windows">Windows客户端</button>
<button class="btn" _ApMdqruF-_NmOrlwxP="mac">Mac客户端</button>
</div>
</div>
<div class="card _TyrgygfU-section" _TTtmLTmr="_RFlAYDCl" _ceWDkDOB="display:none;">
<div class="section-_LrEbQxBH">
<h2 _TTtmLTmr="liveTitleEl"></h2>
<div class="generator-info" _TTtmLTmr="liveGeneratorInfo"></div>
</div>
<div _TTtmLTmr="_oCDUkxQP" class="_TyrgygfU-actions-_gZkeklQH" _ceWDkDOB="display: none;">
<div class="_TyrgygfU-api-buttons">
<button _TTtmLTmr="copyIpApiBtn" class="btn">复制 IP API</button>
<button _TTtmLTmr="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _TTtmLTmr="resultsTable">
<thead><tr><th _TTtmLTmr="tableHeader1El"></th><th _TTtmLTmr="tableHeader2El"></th><th _TTtmLTmr="tableHeader3El"></th><th _TTtmLTmr="tableHeader4El"></th><th _TTtmLTmr="tableHeader5El"></th><th _TTtmLTmr="tableHeader6El"></th><th _TTtmLTmr="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _TTtmLTmr="_myuQNikF" _ceWDkDOB="display:none;">
<div class="section-_LrEbQxBH"><h2 _TTtmLTmr="cachedTitleEl"></h2><div class="generator-info" _TTtmLTmr="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _TTtmLTmr="cachedResultsTable">
<thead><tr><th _TTtmLTmr="cachedTableHeader1El"></th><th _TTtmLTmr="cachedTableHeader2El"></th><th _TTtmLTmr="cachedTableHeader3El"></th><th _TTtmLTmr="cachedTableHeader4El"></th><th _TTtmLTmr="cachedTableHeader5El"></th><th _TTtmLTmr="cachedTableHeader6El"></th><th _TTtmLTmr="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _TTtmLTmr="notificationTooltip" class="tooltip-notification"></div>
<div _TTtmLTmr="_uMCCwbmL">
<div class="modal-_mwHbituu">
<h3>修改参数</h3>
<div _ceWDkDOB="display: flex; border-bottom: 1px solid var(--border-_tcfAilsG); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_KNCRuwFt(event, 'general-_SvJnpAuc')">通用设置</button>
<button class="tab-button" onclick="_KNCRuwFt(event, '_NstJOAdt-_SvJnpAuc')">链接设置</button>
<button class="tab-button" onclick="_KNCRuwFt(event, 'fine-grained-_SvJnpAuc')">IP源设置</button>
<button class="tab-button" onclick="_KNCRuwFt(event, 'advanced-_SvJnpAuc')">高级设置</button>
</div>
<div _TTtmLTmr="general-_SvJnpAuc" class="tab-_mwHbituu" _ceWDkDOB="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_fwZBNgCx _TTtmLTmr="themeSelect">
<_aCOydDdw _jnrUVtWz="theme-aurora-glass">极光-玻璃质感</_aCOydDdw>
<_aCOydDdw _jnrUVtWz="theme-particles-glass">粒子-玻璃质感</_aCOydDdw>
<_aCOydDdw _jnrUVtWz="theme-modern-glass">现代-玻璃质感</_aCOydDdw>
<_aCOydDdw _jnrUVtWz="theme-cyberpunk-glass">赛博朋克-玻璃质感</_aCOydDdw>
<_aCOydDdw _jnrUVtWz="theme-dark-particles">暗色-粒子背景</_aCOydDdw>
<_aCOydDdw _jnrUVtWz="theme-dark-bing">暗色-必应壁纸</_aCOydDdw>
<_aCOydDdw _jnrUVtWz="theme-light">亮色-简约</_aCOydDdw>
<_aCOydDdw _jnrUVtWz="theme-light-bing">亮色-必应壁纸</_aCOydDdw>
<_aCOydDdw _jnrUVtWz="theme-marble-light">简约大理石-亮色</_aCOydDdw>
<_aCOydDdw _jnrUVtWz="theme-matrix">矩阵-代码雨</_aCOydDdw>
</_fwZBNgCx>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _BFbzJcsO="_tcfAilsG" _TTtmLTmr="primaryColorInput">
<span _ceWDkDOB="_kOgKwkOq: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _BFbzJcsO="_tcfAilsG" _TTtmLTmr="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _ceWDkDOB="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _ceWDkDOB="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_jcPqEnIk-_tcfAilsG-grid"><input _BFbzJcsO="_tcfAilsG" _TTtmLTmr="colorInput_title"><textarea _TTtmLTmr="textInput_title" _eQwWuJBF="1" _HzrsqNuM="页面主标题"></textarea></div>
<div class="_jcPqEnIk-_tcfAilsG-grid"><input _BFbzJcsO="_tcfAilsG" _TTtmLTmr="colorInput_loginButton"><input _BFbzJcsO="_jcPqEnIk" _TTtmLTmr="textInput_loginButton" _HzrsqNuM="登录按钮文本"></div>
<div class="_jcPqEnIk-_tcfAilsG-grid"><input _BFbzJcsO="_tcfAilsG" _TTtmLTmr="colorInput_appDownloadTitle"><input _BFbzJcsO="_jcPqEnIk" _TTtmLTmr="textInput_appDownloadTitle" _HzrsqNuM="APP下载标题"></div>
<div class="_jcPqEnIk-_tcfAilsG-grid"><input _BFbzJcsO="_tcfAilsG" _TTtmLTmr="colorInput_liveTitle"><input _BFbzJcsO="_jcPqEnIk" _TTtmLTmr="textInput_liveTitle" _HzrsqNuM="本次结果标题"></div>
<div class="_jcPqEnIk-_tcfAilsG-grid"><input _BFbzJcsO="_tcfAilsG" _TTtmLTmr="colorInput_cachedTitle"><input _BFbzJcsO="_jcPqEnIk" _TTtmLTmr="textInput_cachedTitle" _HzrsqNuM="上次结果标题"></div>
<div class="_jcPqEnIk-_tcfAilsG-grid"><input _BFbzJcsO="_tcfAilsG" _TTtmLTmr="colorInput_tableHeader"><input _BFbzJcsO="_jcPqEnIk" _jnrUVtWz="表格头部文本颜色" readonly _ceWDkDOB="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _ceWDkDOB="align-self: start;"><label>公告栏设置</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _ceWDkDOB="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _TTtmLTmr="announcementText" _HzrsqNuM="在此输入公告内容" _eQwWuJBF="3"></textarea>
<div _ceWDkDOB="display: flex; justify-_mwHbituu: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _ceWDkDOB="display: flex; align-items: center; gap: 5px;"><input _BFbzJcsO="checkbox" _TTtmLTmr="enableMarquee"> 顶部走马灯</label>
<label _ceWDkDOB="display: flex; align-items: center; gap: 5px;"><input _BFbzJcsO="checkbox" _TTtmLTmr="enablePopup"> 右上角弹窗</label>
<div _TTtmLTmr="popupDurationContainer" _ceWDkDOB="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _BFbzJcsO="number" _TTtmLTmr="popupDuration" _ceWDkDOB="_kOgKwkOq: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _TTtmLTmr="_NstJOAdt-_SvJnpAuc" class="tab-_mwHbituu">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _BFbzJcsO="_jcPqEnIk" _TTtmLTmr="converterServiceUrlInput" _HzrsqNuM="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _BFbzJcsO="number" _TTtmLTmr="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _ceWDkDOB="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _TTtmLTmr="subscriptionIdCharset" _eQwWuJBF="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-_mmUhPlfW" _ApMdqruF-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _ceWDkDOB="justify-_mwHbituu: flex-start;"><input _BFbzJcsO="checkbox" _TTtmLTmr="enableItemLinkCheckbox"></div>
</div>
<div _TTtmLTmr="itemLinkConfigGroup" _ceWDkDOB="display:none; margin-_aLHpyXzM: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _ceWDkDOB="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="定义分享链接格式。可用占位符: {_ropwOTIW}, {_lKplLykm}, {_IUiWmmmU}, {rank}, {_IGcMXPZi}, {_QAFYBAqM}, {_Zjfvsumn}, {_MtZNSJzW}, {_AugvRFpu}。">?</span></div>
<div class="form-grid-control"><textarea _TTtmLTmr="itemLinkTemplateInput" _eQwWuJBF="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_fwZBNgCx _TTtmLTmr="parameterSelectionMode"></_fwZBNgCx></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _TTtmLTmr="parameter-sets-_gZkeklQH"></div><button _BFbzJcsO="button" _TTtmLTmr="add-parameter-_wjpIBrxv-btn" class="btn btn-outline" _ceWDkDOB="margin-_aLHpyXzM: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _ceWDkDOB="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _TTtmLTmr="custom-fields-_gZkeklQH" _ceWDkDOB="_kOgKwkOq: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _ceWDkDOB="justify-_mwHbituu: flex-start;"><button _BFbzJcsO="button" _TTtmLTmr="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _TTtmLTmr="fine-grained-_SvJnpAuc" class="tab-_mwHbituu">
<div class="form-grid-label" _ceWDkDOB="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _ceWDkDOB="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_mwHbituu: flex-start;">
<label><input _BFbzJcsO="checkbox" _TTtmLTmr="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _BFbzJcsO="checkbox" _TTtmLTmr="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _TTtmLTmr="fine-grained-sources-_gZkeklQH"></div><button _BFbzJcsO="button" _TTtmLTmr="add-fine-grained-_Zegdjflh-btn" class="btn btn-outline" _ceWDkDOB="margin-_aLHpyXzM: 10px;">添加地区</button></div>
</div>
<div _TTtmLTmr="advanced-_SvJnpAuc" class="tab-_mwHbituu">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _BFbzJcsO="checkbox" _TTtmLTmr="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _TTtmLTmr="resolvedDomainsGroup" _ceWDkDOB="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _TTtmLTmr="resolvedDomainsInput" _HzrsqNuM="留空则使用内置默认域名" _eQwWuJBF="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-_mmUhPlfW" _ApMdqruF-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _BFbzJcsO="checkbox" _TTtmLTmr="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _TTtmLTmr="customNodesGroup" _ceWDkDOB="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _TTtmLTmr="customNodesInput" _HzrsqNuM="一行一个地址,支持域名、IPv4、IPv6。" _eQwWuJBF="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-_mmUhPlfW" _ApMdqruF-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _BFbzJcsO="number" _TTtmLTmr="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _BFbzJcsO="number" _TTtmLTmr="topNInput"></div>
<div class="form-grid-label" _ceWDkDOB="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _ceWDkDOB="display: none;"><input _BFbzJcsO="number" _TTtmLTmr="latencyRangeMinInput" _HzrsqNuM="最小"><span>-</span><input _BFbzJcsO="number" _TTtmLTmr="latencyRangeMaxInput" _HzrsqNuM="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _ceWDkDOB="justify-_mwHbituu: flex-start;"><input _BFbzJcsO="checkbox" _TTtmLTmr="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-_mmUhPlfW" _ApMdqruF-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _BFbzJcsO="number" _TTtmLTmr="geoLocationRetriesInput" _ceWDkDOB="_kOgKwkOq: 80px;"> <span>次</span>
<div _ceWDkDOB="display: flex; align-items: center; gap: 5px; margin-_pwsnCRRR: 20px;">
<input _BFbzJcsO="checkbox" _TTtmLTmr="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-_mmUhPlfW" _ApMdqruF-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_Zjfvsumn:_lKplLykm' 或 '_Zjfvsumn'。">?</span></div>
<div class="form-grid-control"><input _BFbzJcsO="_jcPqEnIk" _TTtmLTmr="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-_mmUhPlfW" _ApMdqruF-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _ceWDkDOB="justify-_mwHbituu: flex-start;"><input _BFbzJcsO="checkbox" _TTtmLTmr="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _TTtmLTmr="websocketStreamerGroup" _ceWDkDOB="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _BFbzJcsO="_jcPqEnIk" _TTtmLTmr="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-_mmUhPlfW" _ApMdqruF-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _ceWDkDOB="justify-_mwHbituu: flex-start;"><input _BFbzJcsO="checkbox" _TTtmLTmr="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="启用 /_ropwOTIW 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _ceWDkDOB="justify-_mwHbituu: flex-start;"><input _BFbzJcsO="checkbox" _TTtmLTmr="enableApiCheckbox"></div>
<div class="form-grid-control-full" _TTtmLTmr="apiConfigGroup" _ceWDkDOB="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _BFbzJcsO="_jcPqEnIk" _TTtmLTmr="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-_mmUhPlfW" _ApMdqruF-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _ceWDkDOB="justify-_mwHbituu: flex-start;"><input _BFbzJcsO="checkbox" _TTtmLTmr="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _TTtmLTmr="customSubPathGroup" _ceWDkDOB="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _BFbzJcsO="_jcPqEnIk" _TTtmLTmr="customSubPathInput" _HzrsqNuM="例如: 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-_mmUhPlfW" _ApMdqruF-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _ceWDkDOB="justify-_mwHbituu: flex-start;"><input _BFbzJcsO="checkbox" _TTtmLTmr="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _TTtmLTmr="visitorPasswordGroup" _ceWDkDOB="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _BFbzJcsO="_jcPqEnIk" _TTtmLTmr="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _ceWDkDOB="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_mmUhPlfW" _ApMdqruF-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _ceWDkDOB="flex-direction: column; align-items: stretch; gap: 8px;"><input _BFbzJcsO="_jcPqEnIk" _TTtmLTmr="botTokenInput" _HzrsqNuM="Telegram Bot Token"><input _BFbzJcsO="_jcPqEnIk" _TTtmLTmr="chatIdInput" _HzrsqNuM="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _ceWDkDOB="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _ceWDkDOB="flex-direction: column; align-items: stretch; gap: 8px;"><input _BFbzJcsO="_eCcmnilz" _TTtmLTmr="oldPasswordInput" _HzrsqNuM="旧密码"><input _BFbzJcsO="_eCcmnilz" _TTtmLTmr="newPasswordInput" _HzrsqNuM="新密码 (至少6位)"><button _TTtmLTmr="changePasswordBtn" class="btn" _ceWDkDOB="align-self: flex-start; margin-_pwsnCRRR: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _TTtmLTmr="closeModalBtn" class="btn btn-outline">关闭</button><button _TTtmLTmr="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _TTtmLTmr="_LnqDJVLe">
<div class="_BGFaCftR-modal-_mwHbituu">
<div class="_BGFaCftR-modal-_LrEbQxBH"><h3 _TTtmLTmr="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_BGFaCftR-modal-_ABoGvlkq" _TTtmLTmr="appModalBody"></div>
</div>
</div>
<div _TTtmLTmr="_IwqrkZha">
<div class="modal-_mwHbituu">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _ApMdqruF-sub-_BFbzJcsO="coreEngine">Xray</button><button class="btn _ThwqdAqi-btn" _ApMdqruF-sub-_BFbzJcsO="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _ApMdqruF-sub-_BFbzJcsO="coreProfile">Sing-Box</button><button class="btn _ThwqdAqi-btn" _ApMdqruF-sub-_BFbzJcsO="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _ApMdqruF-sub-_BFbzJcsO="configProfile">Clash</button><button class="btn _ThwqdAqi-btn" _ApMdqruF-sub-_BFbzJcsO="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _ApMdqruF-sub-_BFbzJcsO="policyProfile">Surge</button><button class="btn _ThwqdAqi-btn" _ApMdqruF-sub-_BFbzJcsO="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _ceWDkDOB="justify-_mwHbituu: center;"><button class="btn btn-outline" _TTtmLTmr="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _TTtmLTmr="_QFpHPcPN">
<div class="modal-_mwHbituu">
<img _TTtmLTmr="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _nXScAjwm = {
isValid: (_ropwOTIW) => _nXScAjwm.isIPv4(_ropwOTIW) || _nXScAjwm.isIPv6(_ropwOTIW),
isIPv4: (_ropwOTIW) => {
if (typeof _ropwOTIW !== 'string') return false;
const _YRAcZaxw = _ropwOTIW.split('.');
if (_YRAcZaxw._JddHRFkb !== 4) return false;
return _YRAcZaxw.every(_DtiwxJfm => {
const _wWqlperN = parseInt(_DtiwxJfm, 10);
return !isNaN(_wWqlperN) && _wWqlperN >= 0 && _wWqlperN <= 255 && String(_wWqlperN) === _DtiwxJfm;
});
},
isIPv6: (_ropwOTIW) => {
if (typeof _ropwOTIW !== '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]))$/_RtvzwKWo.test(_ropwOTIW);
},
toLong4: (_ropwOTIW) => _ropwOTIW.split('.').reduce((acc, octet, _RtvzwKWo) => acc + (parseInt(octet) << (8*(3-_RtvzwKWo))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_ropwOTIW) => {
try {
const _QIlaKYhd = _ropwOTIW.split('/')[0];
const _YRAcZaxw = _QIlaKYhd.split('::');
if (_YRAcZaxw._JddHRFkb > 2) return 0n;
let _MjohQFAo = [];
if (_YRAcZaxw[0]) {
_MjohQFAo = _YRAcZaxw[0].split(':');
}
let _pMLoVrHk = [];
if (_YRAcZaxw._JddHRFkb > 1 && _YRAcZaxw[1]) {
_pMLoVrHk = _YRAcZaxw[1].split(':');
}
if (_MjohQFAo._JddHRFkb + _pMLoVrHk._JddHRFkb > 8) return 0n;
const _oRMvuVjj = 8 - (_MjohQFAo._JddHRFkb + _pMLoVrHk._JddHRFkb);
const _TjSnuLlF = [
..._MjohQFAo,
...Array(_oRMvuVjj).fill('0'),
..._pMLoVrHk
].map(_DtiwxJfm => _DtiwxJfm || '0');
while(_TjSnuLlF._JddHRFkb < 8) {
_TjSnuLlF.push('0');
}
let _MGDgJyeh = 0n;
for (const _DtiwxJfm of _TjSnuLlF) {
if (_DtiwxJfm._JddHRFkb > 4) return 0n;
const _jnrUVtWz = BigInt('0x' + _DtiwxJfm);
_MGDgJyeh = (_MGDgJyeh << 16n) | _jnrUVtWz;
}
return _MGDgJyeh;
} catch(_HiEJfbha) {
return 0n;
}
},
fromBigInt6: (_MGDgJyeh) => {
if (typeof _MGDgJyeh !== '_MGDgJyeh' || _MGDgJyeh < 0n) return null;
const _YRAcZaxw = [];
for (let _RtvzwKWo = 0; _RtvzwKWo < 8; _RtvzwKWo++) {
_YRAcZaxw.unshift((_MGDgJyeh & 0xFFFFn).toString(16));
_MGDgJyeh >>= 16n;
}
let _bisZkXrV = { start: -1, _VmFLzuZx: 0 };
let _uKrFFSPB = { start: -1, _VmFLzuZx: 0 };
for (let _RtvzwKWo = 0; _RtvzwKWo < 8; _RtvzwKWo++) {
if (_YRAcZaxw[_RtvzwKWo] === '0') {
if (_uKrFFSPB.start === -1) _uKrFFSPB.start = _RtvzwKWo;
_uKrFFSPB._VmFLzuZx++;
} else {
if (_uKrFFSPB._VmFLzuZx > _bisZkXrV._VmFLzuZx) _bisZkXrV = { ..._uKrFFSPB };
_uKrFFSPB = { start: -1, _VmFLzuZx: 0 };
}
}
if (_uKrFFSPB._VmFLzuZx > _bisZkXrV._VmFLzuZx) _bisZkXrV = { ..._uKrFFSPB };
if (_bisZkXrV._VmFLzuZx > 1) {
_YRAcZaxw.splice(_bisZkXrV.start, _bisZkXrV._VmFLzuZx, '');
if (_bisZkXrV.start === 0) _YRAcZaxw.unshift('');
if (_bisZkXrV.start + _bisZkXrV._VmFLzuZx === 8) _YRAcZaxw.push('');
}
return _YRAcZaxw.join(':');
},
cidrToRange: (cidr, _QOeajihy = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _GIeYMDcj = parseInt(bitsStr, 10);
const _fPcQkudH = new Set();
if (_nXScAjwm.isIPv4(range)) {
if (isNaN(_GIeYMDcj) || _GIeYMDcj < 8 || _GIeYMDcj > 32) return [];
if (_GIeYMDcj === 32) return [range];
const _lmGAFZXL = _nXScAjwm.toLong4(range);
const _hQForZEn = (0xFFFFFFFF << (32 - _GIeYMDcj)) >>> 0;
const _HqRNgkeA = _lmGAFZXL & _hQForZEn;
const _WqVJMgJc = 1 << (32 - _GIeYMDcj);
if (_WqVJMgJc <= 2) return [];
const _SMXzYtWK = Math.min(_QOeajihy, _WqVJMgJc - 2);
let _wayMwJer = 0;
while (_fPcQkudH.size < _SMXzYtWK && _wayMwJer < _SMXzYtWK * 5) {
const _VCuiRThi = Math.floor(Math.random() * (_WqVJMgJc - 2)) + 1;
_fPcQkudH.add(_nXScAjwm.fromLong4((_HqRNgkeA + _VCuiRThi) >>> 0));
_wayMwJer++;
}
return Array.from(_fPcQkudH);
} else if (_nXScAjwm.isIPv6(range)) {
if (isNaN(_GIeYMDcj) || _GIeYMDcj < 16 || _GIeYMDcj > 128) return [];
if (_GIeYMDcj === 128) return [range];
const _MbsWMwmA = _nXScAjwm.toBigInt6(range);
const _hQForZEn = (2n ** BigInt(128 - _GIeYMDcj) - 1n);
const _HqRNgkeA = _MbsWMwmA & ~_hQForZEn;
const _PbiaOOxe = 2n ** BigInt(128 - _GIeYMDcj);
if (_PbiaOOxe <= 2n) return [];
let _wayMwJer = 0;
while (_fPcQkudH.size < _QOeajihy && _wayMwJer < _QOeajihy * 5) {
const _wpOsdqzO = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_wpOsdqzO);
let _EHFfYqtH = 0n;
for (const _xgdhUnDt of _wpOsdqzO) {
_EHFfYqtH = (_EHFfYqtH << 8n) | BigInt(_xgdhUnDt);
}
const _VCuiRThi = _EHFfYqtH % (_PbiaOOxe - 2n) + 1n;
_fPcQkudH.add(_nXScAjwm.fromBigInt6(_HqRNgkeA + _VCuiRThi));
_wayMwJer++;
}
return Array.from(_fPcQkudH);
}
return [];
} catch(_HiEJfbha) {
console.error(`CIDR to range failed for ${cidr}:`, _HiEJfbha);
return [];
}
}
};
function _gTHyfsRc(_tDPSvEdD, _LuBPKxiK) {
const _zihdsBTK = {};
const _wwgUjQqF = Object._wwgUjQqF(_LuBPKxiK);
const _YRAcZaxw = _wwgUjQqF.map(_HCrAOecu => {
const _lRiqrMwL = _tDPSvEdD * (_LuBPKxiK[_HCrAOecu] / 100);
return { _HCrAOecu, _QOeajihy: Math.floor(_lRiqrMwL), remainder: _lRiqrMwL - Math.floor(_lRiqrMwL) };
});
let _kEAfvOWV = _YRAcZaxw.reduce((acc, _DtiwxJfm) => acc + _DtiwxJfm._QOeajihy, 0);
_YRAcZaxw.sort((a, b) => b.remainder - a.remainder);
let _RxVwFhvl = _tDPSvEdD - _kEAfvOWV;
for (let _RtvzwKWo = 0; _RtvzwKWo < _RxVwFhvl; _RtvzwKWo++) {
_YRAcZaxw[_RtvzwKWo % _YRAcZaxw._JddHRFkb]._QOeajihy++;
}
for (const _DtiwxJfm of _YRAcZaxw) {
_zihdsBTK[_DtiwxJfm._HCrAOecu] = _DtiwxJfm._QOeajihy;
}
return _zihdsBTK;
}
const _djZLDeRj = __PAGE_DATA_JSON__;
const _ByPxqiGB = _djZLDeRj._QCBbPTKS;
const _wPAjzKvj = _djZLDeRj.status;
const _RjuCirzs = __ALL_CF_CIDR_LIST_JSON__;
const _lMDPQYHW = __BALANCED_CF_CIDR_LIST_JSON__;
const _lIsUlTGS = __DEFAULT_DOMAINS_LIST_JSON__;
const _moylkUFq = __COUNTRY_MAP_JSON__;
const _SNmmVPFx = _moylkUFq;
const _SmmmDFUR = 2500;
const _CAaiSJgP = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _tntCnBxT = document.getElementById('_tntCnBxT');
const _yPvKVZqJ = document.getElementById('_yPvKVZqJ');
const _KYyhjJDs = document.getElementById('status');
const _RFlAYDCl = document.getElementById('_RFlAYDCl');
const _gGLueXll = document.getElementById('resultsTable').querySelector('tbody');
const _myuQNikF = document.getElementById('_myuQNikF');
const _AZKmYgyY = document.getElementById('cachedResultsTable').querySelector('tbody');
const _ICprlNdV = document.getElementById('notificationTooltip');
const _jVYsuepj = document.getElementById('_jVYsuepj');
const _uMCCwbmL = document.getElementById('_uMCCwbmL');
const _LnqDJVLe = document.getElementById('_LnqDJVLe');
const _IwqrkZha = document.getElementById('_IwqrkZha');
const _QFpHPcPN = document.getElementById('_QFpHPcPN');
const _rApuwiTH = document.getElementById('_rApuwiTH');
const _oCDUkxQP = document.getElementById('_oCDUkxQP');
let _VUIMaVor = null;
let _KjMTndti = null;
let _SqicLjgK = [];
let _eDUjmheZ = false;
let _VztpjqTw = null;
function _MlFvQTWM(_tSVndqwv, _RLoqENji) {
const _CWugqcUY=parseInt(_tSVndqwv.slice(1),16),t=_RLoqENji<0?0:255,p=_RLoqENji<0?_RLoqENji*-1:_RLoqENji,R=_CWugqcUY>>16,G=_CWugqcUY>>8&0x00FF,B=_CWugqcUY&0x0000FF;
const _zDoYibaM = Math.round((t-R)*p)+R;
const _WAAEyRHB = Math.round((t-G)*p)+G;
const _vNImPDhR = Math.round((t-B)*p)+B;
return `rgb(${_zDoYibaM.toString()}, ${_WAAEyRHB.toString()}, ${_vNImPDhR.toString()})`;
}
function _UvwMCTAd(_SvJnpAuc) {
const _ZpJJOWtf = _FNHiBcmO(_SvJnpAuc.primaryColor);
if(_ZpJJOWtf) {
document.documentElement._ceWDkDOB.setProperty('--primary-_tcfAilsG-rgb', `${_ZpJJOWtf.r},${_ZpJJOWtf.g},${_ZpJJOWtf.b}`);
}
document.documentElement._ceWDkDOB.setProperty('--primary-_tcfAilsG', _SvJnpAuc.primaryColor);
document.documentElement._ceWDkDOB.setProperty('--primary-hover', _MlFvQTWM(_SvJnpAuc.primaryColor, -0.1));
document.documentElement._ceWDkDOB.setProperty('--primary-gradient-start', _MlFvQTWM(_SvJnpAuc.primaryColor, 0.1));
document.documentElement._ceWDkDOB.setProperty('--primary-gradient-end', _MlFvQTWM(_SvJnpAuc.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _SvJnpAuc.texts.title;
document.title = _SvJnpAuc.texts.title;
_jVYsuepj.innerText = _VUIMaVor ? _SvJnpAuc.texts.loginButtonSuccess : _SvJnpAuc.texts.loginButton;
_jVYsuepj._ceWDkDOB._tcfAilsG = _SvJnpAuc.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _SvJnpAuc.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _SvJnpAuc.texts.liveTitle;
document.getElementById('liveTitleEl')._ceWDkDOB._tcfAilsG = _SvJnpAuc.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _SvJnpAuc.texts.cachedTitle;
document.getElementById('cachedTitleEl')._ceWDkDOB._tcfAilsG = _SvJnpAuc.colors.cachedTitle;
const _qbpjcIjc = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_qbpjcIjc.forEach((_TTtmLTmr, _JHshsHnZ) => {
const _ioBpnuJS = document.getElementById(_TTtmLTmr);
if (_ioBpnuJS) _ioBpnuJS.innerText = _SvJnpAuc.texts[`tableHeader${_JHshsHnZ + 1}`] || '';
});
const _IWuaNUqz = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_IWuaNUqz.forEach((_TTtmLTmr, _JHshsHnZ) => {
const _ioBpnuJS = document.getElementById(_TTtmLTmr);
if (_ioBpnuJS) _ioBpnuJS.innerText = _ByPxqiGB.texts[`tableHeader${_JHshsHnZ + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._ceWDkDOB._tcfAilsG = _SvJnpAuc.colors.tableHeader);
document._ABoGvlkq.className = '';
document._ABoGvlkq.classList.add(_SvJnpAuc.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_SvJnpAuc.theme)) {
document._ABoGvlkq.classList.add('glassy-components');
}
document._ABoGvlkq._ceWDkDOB.backgroundImage = '';
_kDGPdPEn();
if (_SvJnpAuc.theme.includes('particles') || _SvJnpAuc.theme.includes('glass')) {
_fFuAubjW(_SvJnpAuc.particleColor);
} else if (_SvJnpAuc.theme.includes('bing')) {
document._ABoGvlkq._ceWDkDOB.backgroundImage = '_UNGfWfpn(/bing-wallpaper)';
}
}
function _UIfJnlhV() {
_VUIMaVor = null;
if(_KjMTndti) clearTimeout(_KjMTndti);
_UvwMCTAd(_ByPxqiGB);
_npryHyVr("登录已超时,请重新登录。", "warning");
}
async function _zwNuWLQp() {
if (_VUIMaVor) {
_XVGFZYwE();
return;
}
const _XHmyrwUw = prompt('请输入管理员密码:');
if (!_XHmyrwUw) return;
try {
const _TWYTcqap = await fetch('/api/verify-_eCcmnilz', {
method: 'POST',
_qbpjcIjc: { 'Content-Type': 'application/json' },
_ABoGvlkq: JSON.stringify({ _eCcmnilz: _XHmyrwUw })
});
const _YyMUdMVg = await _TWYTcqap.json();
if (_YyMUdMVg.success) {
_VUIMaVor = _XHmyrwUw;
_npryHyVr("登录成功!有效期5分钟。", "success");
if (_KjMTndti) clearTimeout(_KjMTndti);
_KjMTndti = setTimeout(_UIfJnlhV, 5 * 60 * 1000);
_UvwMCTAd(_ByPxqiGB);
_XVGFZYwE();
} else {
throw new Error(_YyMUdMVg._rFvcSSUG || '密码验证失败');
}
} catch (_HiEJfbha) {
_npryHyVr(`登录失败: ${_HiEJfbha._rFvcSSUG}`, "error");
}
}
function _mjxJJRXv() {
if (!_wPAjzKvj._fDWfKiBT) {
_rApuwiTH._ceWDkDOB.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _eCcmnilz = document.getElementById('initialPassword')._jnrUVtWz;
const _XVHhrxfk = document.getElementById('confirmPassword')._jnrUVtWz;
if (_eCcmnilz !== _XVHhrxfk) {
_npryHyVr("两次输入的密码不一致!", "error");
return;
}
if (_eCcmnilz._JddHRFkb < 6) {
_npryHyVr("密码长度不能少于6位!", "error");
return;
}
try {
const _TWYTcqap = await fetch('/api/_wjpIBrxv-_eCcmnilz', {
method: 'POST',
_qbpjcIjc: { 'Content-Type': 'application/json' },
_ABoGvlkq: JSON.stringify({ _eCcmnilz })
});
const _YyMUdMVg = await _TWYTcqap.json();
if (_YyMUdMVg.success) {
_npryHyVr(_YyMUdMVg._rFvcSSUG, "success");
setTimeout(() => _IGcMXPZi.reload(), 1500);
} else {
throw new Error(_YyMUdMVg._rFvcSSUG);
}
} catch(_HiEJfbha) {
_npryHyVr(`设置密码失败: ${_HiEJfbha._rFvcSSUG}`, "error");
}
});
return;
}
_jVYsuepj.addEventListener('click', _zwNuWLQp);
document.getElementById('closeModalBtn').addEventListener('click', () => { _uMCCwbmL._ceWDkDOB.display = 'none'; });
_uMCCwbmL.addEventListener('click', (_HiEJfbha) => { if (_HiEJfbha.target === _uMCCwbmL) _uMCCwbmL._ceWDkDOB.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_gZkeklQH .fine-grained-_jkoNSIvl-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-_gZkeklQH .fine-grained-_jkoNSIvl-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_VUIMaVor) {
_npryHyVr("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _LVJabMdA = [];
document.querySelectorAll('#custom-fields-_gZkeklQH .custom-field-_DGstvWLj').forEach(_DGstvWLj => {
const _IUiWmmmU = _DGstvWLj.querySelector('.custom-field-_IUiWmmmU')._jnrUVtWz.trim();
const _jnrUVtWz = _DGstvWLj.querySelector('.custom-field-_jnrUVtWz')._jnrUVtWz.trim();
if (_IUiWmmmU) _LVJabMdA.push({ _IUiWmmmU, _jnrUVtWz });
});
const _tUzgyUfT = [];
document.querySelectorAll('#parameter-sets-_gZkeklQH .parameter-_wjpIBrxv-_DGstvWLj').forEach(_DGstvWLj => {
const _IUiWmmmU = _DGstvWLj.querySelector('.param-_wjpIBrxv-_IUiWmmmU')._jnrUVtWz.trim();
const _Zjfvsumn = _DGstvWLj.querySelector('.param-_wjpIBrxv-_Zjfvsumn')._jnrUVtWz.trim();
const _MtZNSJzW = _DGstvWLj.querySelector('.param-_wjpIBrxv-_MtZNSJzW')._jnrUVtWz.trim();
const _AugvRFpu = _DGstvWLj.querySelector('.param-_wjpIBrxv-_AugvRFpu')._jnrUVtWz.trim();
if(_IUiWmmmU) _tUzgyUfT.push({ _IUiWmmmU, _Zjfvsumn, '_MtZNSJzW': _MtZNSJzW, _AugvRFpu });
});
const _FKnuBLCq = [];
document.querySelectorAll('#fine-grained-sources-_gZkeklQH .fine-grained-_Zegdjflh-_DGstvWLj').forEach(_DGstvWLj => {
const _IGcMXPZi = _DGstvWLj.querySelector('.fine-grained-_IGcMXPZi')._jnrUVtWz.trim();
const _fPcQkudH = _DGstvWLj.querySelector('.fine-grained-_fPcQkudH')._jnrUVtWz.trim();
const _jkoNSIvl = _DGstvWLj.querySelector('.fine-grained-_jkoNSIvl-cb').checked;
const _pWQRXuPF = parseInt(_DGstvWLj.querySelector('.fine-grained-_pWQRXuPF')._jnrUVtWz, 10) || 0;
const _yaaUzZvU = _DGstvWLj.querySelector('.use-_IUiWmmmU-as-_IGcMXPZi-cb').checked;
if (_IGcMXPZi && _fPcQkudH) {
_FKnuBLCq.push({ _IGcMXPZi, _fPcQkudH, _jkoNSIvl, _pWQRXuPF, _yaaUzZvU });
}
});
let _hzvzCSQB = parseInt(document.getElementById('subscriptionIdLength')._jnrUVtWz, 10);
if (isNaN(_hzvzCSQB) || _hzvzCSQB < 2) _hzvzCSQB = 2;
if (_hzvzCSQB > 128) _hzvzCSQB = 128;
const _epYHQhqk = {
theme: document.getElementById('themeSelect')._jnrUVtWz,
primaryColor: document.getElementById('primaryColorInput')._jnrUVtWz,
particleColor: document.getElementById('particleColorInput')._jnrUVtWz,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._jnrUVtWz,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._jnrUVtWz, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._jnrUVtWz, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._jnrUVtWz, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._jnrUVtWz, 10) || 0,
_YaeXtNFu: document.getElementById('converterServiceUrlInput')._jnrUVtWz.trim(),
subscriptionId: {
_JddHRFkb: _hzvzCSQB,
_LhAztbqy: document.getElementById('subscriptionIdCharset')._jnrUVtWz.trim()
},
api: {
_jkoNSIvl: document.getElementById('enableApiCheckbox').checked,
_rFvcSSUG: document.getElementById('apiMessageInput')._jnrUVtWz || '维护中...',
},
ispFilter: {
_jkoNSIvl: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._jnrUVtWz, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_jkoNSIvl: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_jkoNSIvl: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_UNGfWfpn: document.getElementById('websocketStreamerUrlInput')._jnrUVtWz.trim()
},
visitorPassword: {
_jkoNSIvl: document.getElementById('enableVisitorPasswordCheckbox').checked,
_eCcmnilz: document.getElementById('visitorPasswordInput')._jnrUVtWz.trim()
},
customSubPath: {
_jkoNSIvl: document.getElementById('enableCustomSubPathCheckbox').checked,
_AugvRFpu: document.getElementById('customSubPathInput')._jnrUVtWz.trim()
},
itemLink: {
_jkoNSIvl: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._jnrUVtWz,
selectionMode: document.getElementById('parameterSelectionMode')._jnrUVtWz,
_tUzgyUfT: _tUzgyUfT,
_LVJabMdA: _LVJabMdA,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._jnrUVtWz.trim(),
},
announcement: {
popup: {
_jkoNSIvl: document.getElementById('enablePopup').checked,
_jcPqEnIk: document.getElementById('announcementText')._jnrUVtWz,
_REQDFOKj: parseInt(document.getElementById('popupDuration')._jnrUVtWz, 10) || 5
},
marquee: {
_jkoNSIvl: document.getElementById('enableMarquee').checked,
_jcPqEnIk: document.getElementById('announcementText')._jnrUVtWz
}
},
fineGrained: {
_jkoNSIvl: true,
sources: _FKnuBLCq
},
customNodes: {
_jkoNSIvl: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._jnrUVtWz
},
texts: {
title: document.getElementById('textInput_title')._jnrUVtWz,
loginButton: document.getElementById('textInput_loginButton')._jnrUVtWz,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._jnrUVtWz,
liveTitle: document.getElementById('textInput_liveTitle')._jnrUVtWz,
cachedTitle: document.getElementById('textInput_cachedTitle')._jnrUVtWz,
},
colors: {
title: document.getElementById('colorInput_title')._jnrUVtWz,
loginButton: document.getElementById('colorInput_loginButton')._jnrUVtWz,
liveTitle: document.getElementById('colorInput_liveTitle')._jnrUVtWz,
cachedTitle: document.getElementById('colorInput_cachedTitle')._jnrUVtWz,
tableHeader: document.getElementById('colorInput_tableHeader')._jnrUVtWz,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._jnrUVtWz.trim(),
chat_id: document.getElementById('chatIdInput')._jnrUVtWz.trim(),
},
};
try {
const _TWYTcqap = await fetch('/api/_QCBbPTKS', {
method: 'POST',
_qbpjcIjc: { 'Content-Type': 'application/json' },
_ABoGvlkq: JSON.stringify({ _QCBbPTKS: _epYHQhqk, adminPassword: _VUIMaVor })
});
const _YyMUdMVg = await _TWYTcqap.json();
if (_TWYTcqap.ok && _YyMUdMVg.success) {
_npryHyVr("配置已保存,正在刷新...", "success");
setTimeout(() => _IGcMXPZi.reload(), 1500);
} else {
throw new Error(_YyMUdMVg._rFvcSSUG || '未知错误');
}
} catch (_HiEJfbha) {
_npryHyVr(`操作失败: ${_HiEJfbha._rFvcSSUG}`, "error");
if (String(_HiEJfbha._rFvcSSUG).includes("密码错误")) {
_UIfJnlhV();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _SaLMLDGF = document.getElementById('oldPasswordInput')._jnrUVtWz;
const _gitLElus = document.getElementById('newPasswordInput')._jnrUVtWz;
if (!_SaLMLDGF || !_gitLElus) {
_npryHyVr("新旧密码均不能为空!", "error");
return;
}
try {
const _TWYTcqap = await fetch('/api/change-_eCcmnilz', {
method: 'POST',
_qbpjcIjc: { 'Content-Type': 'application/json' },
_ABoGvlkq: JSON.stringify({ _SaLMLDGF, _gitLElus })
});
const _YyMUdMVg = await _TWYTcqap.json();
if (_YyMUdMVg.success) {
_npryHyVr(_YyMUdMVg._rFvcSSUG, "success");
document.getElementById('oldPasswordInput')._jnrUVtWz = '';
document.getElementById('newPasswordInput')._jnrUVtWz = '';
_VUIMaVor = _gitLElus;
} else {
throw new Error(_YyMUdMVg._rFvcSSUG);
}
} catch(_HiEJfbha) {
_npryHyVr(`修改密码失败: ${_HiEJfbha._rFvcSSUG}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_HiEJfbha) => {
document.getElementById('resolvedDomainsGroup')._ceWDkDOB.display = _HiEJfbha.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_HiEJfbha) => {
document.getElementById('customNodesGroup')._ceWDkDOB.display = _HiEJfbha.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_HiEJfbha) => {
document.getElementById('apiConfigGroup')._ceWDkDOB.display = _HiEJfbha.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_HiEJfbha) => {
document.getElementById('itemLinkConfigGroup')._ceWDkDOB.display = _HiEJfbha.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_HiEJfbha) => {
document.getElementById('websocketStreamerGroup')._ceWDkDOB.display = _HiEJfbha.target.checked ? 'block' : 'none';
const _FDPfIyKU = document.querySelector('#parameter-sets-_gZkeklQH .param-_wjpIBrxv-_AugvRFpu');
if (_FDPfIyKU) {
if (_HiEJfbha.target.checked) {
_FDPfIyKU._jnrUVtWz = '/snippets?_ropwOTIW=endpointAddress:_lKplLykm(443)&nat64=6to4';
} else {
_FDPfIyKU._jnrUVtWz = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_gMiVmBwd('', '');
});
document.getElementById('add-parameter-_wjpIBrxv-btn').addEventListener('click', () => {
const _QOeajihy = document.querySelectorAll('.parameter-_wjpIBrxv-_DGstvWLj')._JddHRFkb + 1;
_bukNBfla({_IUiWmmmU: `配置${_QOeajihy}`, _Zjfvsumn: '', _MtZNSJzW: '', _AugvRFpu: ''});
_QNCoHrYo();
});
document.getElementById('add-fine-grained-_Zegdjflh-btn').addEventListener('click', () => {
_lbnFdRyU({ _IGcMXPZi: '', _fPcQkudH: '', _jkoNSIvl: true, _pWQRXuPF: 50, _yaaUzZvU: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_HiEJfbha) => {
document.getElementById('visitorPasswordGroup')._ceWDkDOB.display = _HiEJfbha.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_HiEJfbha) => {
document.getElementById('customSubPathGroup')._ceWDkDOB.display = _HiEJfbha.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_HiEJfbha) => {
document.getElementById('popupDurationContainer')._ceWDkDOB.display = _HiEJfbha.target.checked ? 'flex' : 'none';
});
}
function _gMiVmBwd(_IUiWmmmU, _jnrUVtWz) {
const _gZkeklQH = document.getElementById('custom-fields-_gZkeklQH');
const _dlHySHLY = document.createElement('div');
_dlHySHLY.className = 'form-grid custom-field-_DGstvWLj';
_dlHySHLY._ceWDkDOB = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_dlHySHLY.innerHTML = `
<input _BFbzJcsO="_jcPqEnIk" class="custom-field-_IUiWmmmU" _HzrsqNuM="占位符名称" _jnrUVtWz="${_IUiWmmmU}">
<input _BFbzJcsO="_jcPqEnIk" class="custom-field-_jnrUVtWz" _HzrsqNuM="值" _jnrUVtWz="${_jnrUVtWz}">
<button _BFbzJcsO="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_gZkeklQH.appendChild(_dlHySHLY);
}
function _bukNBfla(_wjpIBrxv) {
const _gZkeklQH = document.getElementById('parameter-sets-_gZkeklQH');
const _dlHySHLY = document.createElement('div');
_dlHySHLY.className = 'parameter-_wjpIBrxv-_DGstvWLj';
_dlHySHLY.innerHTML = `
<div class="parameter-_wjpIBrxv-_LrEbQxBH">
<input _BFbzJcsO="_jcPqEnIk" class="param-_wjpIBrxv-_IUiWmmmU" _HzrsqNuM="配置名称" _jnrUVtWz="${_wjpIBrxv._IUiWmmmU}" oninput="_QNCoHrYo()">
<button _BFbzJcsO="button" class="btn btn-outline" onclick="this.closest('.parameter-_wjpIBrxv-_DGstvWLj').remove(); _QNCoHrYo();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _BFbzJcsO="_jcPqEnIk" class="param-_wjpIBrxv-_Zjfvsumn" _jnrUVtWz="${_wjpIBrxv._Zjfvsumn || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _BFbzJcsO="_jcPqEnIk" class="param-_wjpIBrxv-_MtZNSJzW" _jnrUVtWz="${_wjpIBrxv['_MtZNSJzW'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _BFbzJcsO="_jcPqEnIk" class="param-_wjpIBrxv-_AugvRFpu" _jnrUVtWz="${_wjpIBrxv._AugvRFpu || ''}"></div>
</div>
`;
_gZkeklQH.appendChild(_dlHySHLY);
}
function _QNCoHrYo() {
const _fwZBNgCx = document.getElementById('parameterSelectionMode');
const _MsYnBOWM = _fwZBNgCx._jnrUVtWz;
_fwZBNgCx.innerHTML = '';
const _TAgnPFtf = document.createElement('_aCOydDdw');
_TAgnPFtf._jnrUVtWz = 'random';
_TAgnPFtf.textContent = '随机轮询';
_fwZBNgCx.appendChild(_TAgnPFtf);
const _BbXCzLXg = document.createElement('_aCOydDdw');
_BbXCzLXg._jnrUVtWz = 'first';
_BbXCzLXg.textContent = '使用第一组';
_fwZBNgCx.appendChild(_BbXCzLXg);
document.querySelectorAll('.param-_wjpIBrxv-_IUiWmmmU').forEach(input => {
const _IUiWmmmU = input._jnrUVtWz.trim();
if (_IUiWmmmU) {
const _aCOydDdw = document.createElement('_aCOydDdw');
_aCOydDdw._jnrUVtWz = _IUiWmmmU;
_aCOydDdw.textContent = `指定: ${_IUiWmmmU}`;
_fwZBNgCx.appendChild(_aCOydDdw);
}
});
if (Array.from(_fwZBNgCx.options).some(opt => opt._jnrUVtWz === _MsYnBOWM)) {
_fwZBNgCx._jnrUVtWz = _MsYnBOWM;
} else {
_fwZBNgCx._jnrUVtWz = 'random';
}
}
function _lbnFdRyU(_Zegdjflh) {
const _gZkeklQH = document.getElementById('fine-grained-sources-_gZkeklQH');
const _dlHySHLY = document.createElement('div');
_dlHySHLY.className = 'fine-grained-_Zegdjflh-_DGstvWLj parameter-_wjpIBrxv-_DGstvWLj';
_dlHySHLY._ceWDkDOB.padding = '1rem';
const _XUboxnQh = _Zegdjflh._yaaUzZvU ? 'checked' : '';
const _qHirsxvO = !_Zegdjflh._yaaUzZvU ? 'checked' : '';
const _lvgbiMqW = _Zegdjflh._jkoNSIvl ? 'checked' : '';
_dlHySHLY.innerHTML = `
<div _ceWDkDOB="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _BFbzJcsO="_jcPqEnIk" class="fine-grained-_IGcMXPZi" _HzrsqNuM="地区名称 (如: 香港)" _jnrUVtWz="${_Zegdjflh._IGcMXPZi || ''}">
<div _ceWDkDOB="display: flex; align-items: center; gap: 5px;"><input _BFbzJcsO="checkbox" class="fine-grained-_jkoNSIvl-cb" ${_lvgbiMqW}><label>启用</label></div>
<button _BFbzJcsO="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_Zegdjflh-_DGstvWLj').remove()">删除</button>
</div>
<textarea class="fine-grained-_fPcQkudH" _HzrsqNuM="IP源 (每行一个IP、CIDR或URL)" _eQwWuJBF="3" _ceWDkDOB="_kOgKwkOq:100%;">${_Zegdjflh._fPcQkudH || ''}</textarea>
<div class="fine-grained-options" _ceWDkDOB="justify-_mwHbituu: space-between;">
<div _ceWDkDOB="display: flex; gap: 1rem;">
<label><input _BFbzJcsO="checkbox" class="query-_zVtrXmGe-cb" ${_qHirsxvO}>查询真实归属地</label>
<label><input _BFbzJcsO="checkbox" class="use-_IUiWmmmU-as-_IGcMXPZi-cb" ${_XUboxnQh}>使用地区名称作为归属地</label>
</div>
<div _ceWDkDOB="display: flex; align-items: center; gap: 5px;"><input _BFbzJcsO="number" class="fine-grained-_pWQRXuPF _pWQRXuPF-input" _jnrUVtWz="${_Zegdjflh._pWQRXuPF || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _IUSwvbcy = _dlHySHLY.querySelector('.query-_zVtrXmGe-cb');
const _kQDRAAFJ = _dlHySHLY.querySelector('.use-_IUiWmmmU-as-_IGcMXPZi-cb');
_IUSwvbcy.addEventListener('change', () => {
if (_IUSwvbcy.checked) {
_kQDRAAFJ.checked = false;
} else if (!_kQDRAAFJ.checked) {
_IUSwvbcy.checked = true;
}
});
_kQDRAAFJ.addEventListener('change', () => {
if (_kQDRAAFJ.checked) {
_IUSwvbcy.checked = false;
} else if (!_kQDRAAFJ.checked) {
_kQDRAAFJ.checked = true;
}
});
_gZkeklQH.appendChild(_dlHySHLY);
}
function _XVGFZYwE() {
const _SvJnpAuc = _ByPxqiGB;
document.getElementById('themeSelect')._jnrUVtWz = _SvJnpAuc.theme;
document.getElementById('primaryColorInput')._jnrUVtWz = _SvJnpAuc.primaryColor;
document.getElementById('particleColorInput')._jnrUVtWz = _SvJnpAuc.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _SvJnpAuc.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._HzrsqNuM = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._jnrUVtWz = _SvJnpAuc.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._ceWDkDOB.display = _SvJnpAuc.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _SvJnpAuc.customNodes._jkoNSIvl;
document.getElementById('customNodesInput')._jnrUVtWz = _SvJnpAuc.customNodes.list || '';
document.getElementById('customNodesGroup')._ceWDkDOB.display = _SvJnpAuc.customNodes._jkoNSIvl ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._jnrUVtWz = _SvJnpAuc._YaeXtNFu || '';
document.getElementById('subscriptionIdLength')._jnrUVtWz = _SvJnpAuc.subscriptionId._JddHRFkb;
document.getElementById('subscriptionIdCharset')._jnrUVtWz = _SvJnpAuc.subscriptionId._LhAztbqy;
document.getElementById('enableItemLinkCheckbox').checked = _SvJnpAuc.itemLink._jkoNSIvl;
document.getElementById('itemLinkConfigGroup')._ceWDkDOB.display = _SvJnpAuc.itemLink._jkoNSIvl ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._jnrUVtWz = _SvJnpAuc.itemLink.template;
const _uCkqRzCT = document.getElementById('parameter-sets-_gZkeklQH');
_uCkqRzCT.innerHTML = '';
if (_SvJnpAuc.itemLink._tUzgyUfT && Array.isArray(_SvJnpAuc.itemLink._tUzgyUfT)) {
_SvJnpAuc.itemLink._tUzgyUfT.forEach(_wjpIBrxv => _bukNBfla(_wjpIBrxv));
}
_QNCoHrYo();
document.getElementById('parameterSelectionMode')._jnrUVtWz = _SvJnpAuc.itemLink.selectionMode || 'random';
const _FDPfIyKU = document.querySelector('#parameter-sets-_gZkeklQH .param-_wjpIBrxv-_AugvRFpu');
if (_FDPfIyKU && _SvJnpAuc.websocketStreamer && _SvJnpAuc.websocketStreamer._jkoNSIvl) {
_FDPfIyKU._jnrUVtWz = '/snippets?_ropwOTIW=endpointAddress:_lKplLykm(443)&nat64=6to4';
}
const _HvBZWqzE = document.getElementById('custom-fields-_gZkeklQH');
_HvBZWqzE.innerHTML = '';
if (_SvJnpAuc.itemLink._LVJabMdA && Array.isArray(_SvJnpAuc.itemLink._LVJabMdA)) {
_SvJnpAuc.itemLink._LVJabMdA.forEach(field => _gMiVmBwd(field._IUiWmmmU, field._jnrUVtWz));
}
document.getElementById('universalFallbackAddressInput')._jnrUVtWz = _SvJnpAuc.dataFeeds.universalFallbackAddress || '';
const _qVFEbLXy = _SvJnpAuc.websocketStreamer && _SvJnpAuc.websocketStreamer._jkoNSIvl;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _qVFEbLXy;
document.getElementById('websocketStreamerUrlInput')._jnrUVtWz = _SvJnpAuc.websocketStreamer ? _SvJnpAuc.websocketStreamer._UNGfWfpn : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._ceWDkDOB.display = _qVFEbLXy ? 'block' : 'none';
const _tJIDQglE = _SvJnpAuc.announcement || {};
document.getElementById('announcementText')._jnrUVtWz = (_tJIDQglE.popup && _tJIDQglE.popup._jcPqEnIk) || (_tJIDQglE.marquee && _tJIDQglE.marquee._jcPqEnIk) || '';
document.getElementById('enableMarquee').checked = _tJIDQglE.marquee && _tJIDQglE.marquee._jkoNSIvl;
document.getElementById('enablePopup').checked = _tJIDQglE.popup && _tJIDQglE.popup._jkoNSIvl;
document.getElementById('popupDuration')._jnrUVtWz = (_tJIDQglE.popup && _tJIDQglE.popup._REQDFOKj) || 5;
document.getElementById('popupDurationContainer')._ceWDkDOB.display = (_tJIDQglE.popup && _tJIDQglE.popup._jkoNSIvl) ? 'flex' : 'none';
const _aZKCQAnr = document.getElementById('fine-grained-sources-_gZkeklQH');
_aZKCQAnr.innerHTML = '';
if (_SvJnpAuc.fineGrained.sources && Array.isArray(_SvJnpAuc.fineGrained.sources)) {
_SvJnpAuc.fineGrained.sources.forEach(_Zegdjflh => _lbnFdRyU(_Zegdjflh));
}
document.getElementById('sampleSizeInput')._jnrUVtWz = _SvJnpAuc.sampleSize;
document.getElementById('topNInput')._jnrUVtWz = _SvJnpAuc.topN;
document.getElementById('latencyRangeMinInput')._jnrUVtWz = _SvJnpAuc.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._jnrUVtWz = _SvJnpAuc.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _SvJnpAuc.ispFilter._jkoNSIvl;
const _gMuQaSmL = _SvJnpAuc.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._jnrUVtWz = _gMuQaSmL.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _gMuQaSmL.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _SvJnpAuc.streamer._jkoNSIvl;
document.getElementById('enableApiCheckbox').checked = _SvJnpAuc.api._jkoNSIvl;
document.getElementById('apiConfigGroup')._ceWDkDOB.display = _SvJnpAuc.api._jkoNSIvl ? 'block' : 'none';
document.getElementById('apiMessageInput')._jnrUVtWz = _SvJnpAuc.api._rFvcSSUG;
const _AqePyugi = _SvJnpAuc.customSubPath && _SvJnpAuc.customSubPath._jkoNSIvl;
document.getElementById('enableCustomSubPathCheckbox').checked = _AqePyugi;
document.getElementById('customSubPathInput')._jnrUVtWz = _SvJnpAuc.customSubPath ? _SvJnpAuc.customSubPath._AugvRFpu : 'latest';
document.getElementById('customSubPathGroup')._ceWDkDOB.display = _AqePyugi ? 'block' : 'none';
const _lUzzkWJT = _SvJnpAuc.visitorPassword && _SvJnpAuc.visitorPassword._jkoNSIvl;
document.getElementById('enableVisitorPasswordCheckbox').checked = _lUzzkWJT;
document.getElementById('visitorPasswordInput')._jnrUVtWz = _SvJnpAuc.visitorPassword ? _SvJnpAuc.visitorPassword._eCcmnilz : '';
document.getElementById('visitorPasswordGroup')._ceWDkDOB.display = _lUzzkWJT ? 'block' : 'none';
document.getElementById('textInput_title')._jnrUVtWz = _SvJnpAuc.texts.title;
document.getElementById('textInput_loginButton')._jnrUVtWz = _SvJnpAuc.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._jnrUVtWz = _SvJnpAuc.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._jnrUVtWz = _SvJnpAuc.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._jnrUVtWz = _SvJnpAuc.texts.cachedTitle;
document.getElementById('colorInput_title')._jnrUVtWz = _SvJnpAuc.colors.title;
document.getElementById('colorInput_loginButton')._jnrUVtWz = _SvJnpAuc.colors.loginButton;
document.getElementById('colorInput_liveTitle')._jnrUVtWz = _SvJnpAuc.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._jnrUVtWz = _SvJnpAuc.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._jnrUVtWz = _SvJnpAuc.colors.tableHeader;
document.getElementById('botTokenInput')._jnrUVtWz = _SvJnpAuc.telegram.bot_token || '';
document.getElementById('chatIdInput')._jnrUVtWz = _SvJnpAuc.telegram.chat_id || '';
_uMCCwbmL._ceWDkDOB.display = 'flex';
}
function _VLGomFIr(_pepkjBie) {
if (window.innerWidth <= 768) {
const _eQwWuJBF = _pepkjBie.querySelectorAll('thead tr, tbody tr');
_eQwWuJBF.forEach(_DGstvWLj => {
const _EReJSolw = Array.from(_DGstvWLj.children);
const _JbQzSnTf = [
_EReJSolw[0],
_EReJSolw[1],
_EReJSolw[3],
_EReJSolw[6],
_EReJSolw[2],
_EReJSolw[4],
_EReJSolw[5]
];
_JbQzSnTf.forEach(cell => _DGstvWLj.appendChild(cell));
});
}
}
async function _mSDZqQXP() {
if (!_wPAjzKvj._fDWfKiBT) {
_mjxJJRXv();
return;
}
if (_ByPxqiGB.announcement && _ByPxqiGB.announcement.marquee && _ByPxqiGB.announcement.marquee._jkoNSIvl && _ByPxqiGB.announcement.marquee._jcPqEnIk) {
const _VwOSaEVm = document.getElementById('marquee-_gZkeklQH');
const _flCKZOnH = document.getElementById('marquee-_jcPqEnIk');
const _oKEfHkei = document.querySelector('.progress-section');
if (_VwOSaEVm && _flCKZOnH && _oKEfHkei) {
_flCKZOnH.innerText = _ByPxqiGB.announcement.marquee._jcPqEnIk;
_VwOSaEVm._ceWDkDOB.display = 'block';
const _ycMkrxhY = () => {
_VwOSaEVm._ceWDkDOB._kOgKwkOq = `${_oKEfHkei.offsetWidth}px`;
const _EckUToDL = _flCKZOnH.offsetWidth;
const _dulhjSMm = _VwOSaEVm.offsetWidth;
const _REQDFOKj = (_EckUToDL + _dulhjSMm) / 100;
_flCKZOnH._ceWDkDOB.animationDuration = `${Math.max(10, _REQDFOKj)}s`;
};
_ycMkrxhY();
window.addEventListener('resize', _ycMkrxhY);
}
}
_UvwMCTAd(_ByPxqiGB);
if (_ByPxqiGB.announcement && _ByPxqiGB.announcement.popup && _ByPxqiGB.announcement.popup._jkoNSIvl && _ByPxqiGB.announcement.popup._jcPqEnIk) {
setTimeout(() => {
_npryHyVr(_ByPxqiGB.announcement.popup._jcPqEnIk, 'info', _ByPxqiGB.announcement.popup._REQDFOKj * 1000);
}, 500);
}
_mjxJJRXv();
_oPHkXBUu();
_yGFbXqGm();
_XRfFhRuG();
await _wTfFpTGa();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _bZgsHaji = window._IGcMXPZi.origin + '/_ropwOTIW';
navigator.clipboard.writeText(_bZgsHaji).then(() => {
_npryHyVr('IP 列表 API 地址已复制!', 'success');
});
});
if (_ByPxqiGB.visitorPassword && _ByPxqiGB.visitorPassword._jkoNSIvl) {
_tntCnBxT._ceWDkDOB.display = 'none';
const _qkolmjGl = document.getElementById('visitorPasswordPrompt');
_qkolmjGl._ceWDkDOB.display = 'block';
const _COAUtiys = document.getElementById('visitorPasswordEntry');
const _XUPKxuzB = document.getElementById('startTestWithPasswordBtn');
const _SYYRcwMc = async () => {
const _eCcmnilz = _COAUtiys._jnrUVtWz;
if (!_eCcmnilz) {
_npryHyVr('请输入访客密码', 'warning');
return;
}
try {
const _TWYTcqap = await fetch('/api/verify-visitor-_eCcmnilz', {
method: 'POST',
_qbpjcIjc: { 'Content-Type': 'application/json' },
_ABoGvlkq: JSON.stringify({ _eCcmnilz })
});
const _YyMUdMVg = await _TWYTcqap.json();
if (_TWYTcqap.ok && _YyMUdMVg.success) {
_npryHyVr('验证成功,开始测试...', 'success');
_qkolmjGl._ceWDkDOB.display = 'none';
_tntCnBxT._ceWDkDOB.display = 'block';
await _nrISIxiG();
} else {
throw new Error(_YyMUdMVg._rFvcSSUG || '密码错误');
}
} catch (_HiEJfbha) {
_npryHyVr(`验证失败: ${_HiEJfbha._rFvcSSUG}`, "error");
_COAUtiys._jnrUVtWz = '';
_COAUtiys.focus();
}
};
_XUPKxuzB.addEventListener('click', _SYYRcwMc);
_COAUtiys.addEventListener('keypress', (_HiEJfbha) => {
if (_HiEJfbha._HCrAOecu === 'Enter') {
_HiEJfbha.preventDefault();
_SYYRcwMc();
}
});
_COAUtiys.focus();
} else {
_KYyhjJDs.textContent = "页面加载完成,准备开始测试...";
await _zZGGAfWl(100);
await _nrISIxiG();
}
}
async function _zZGGAfWl(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _FNHiBcmO(_tSVndqwv) {
let _YyMUdMVg = /^#?([a-_CWugqcUY\d]{2})([a-_CWugqcUY\d]{2})([a-_CWugqcUY\d]{2})$/_RtvzwKWo.exec(_tSVndqwv);
return _YyMUdMVg ? { r: parseInt(_YyMUdMVg[1], 16), g: parseInt(_YyMUdMVg[2], 16), b: parseInt(_YyMUdMVg[3], 16) } : null;
}
async function _fkfwZbWg(_ropwOTIW) {
const _WCmsfjcs = new AbortController();
const _JrBGbHZE = setTimeout(() => _WCmsfjcs.abort(), _SmmmDFUR);
const _OGyAVFpe = Date.now();
try {
const _QunWXqud = _nXScAjwm.isIPv6(_ropwOTIW) ? `[${_ropwOTIW}]` : _ropwOTIW;
const _UNGfWfpn = `https://${_QunWXqud}/cdn-cgi/trace`;
await fetch(_UNGfWfpn, {
signal: _WCmsfjcs.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._IUiWmmmU === 'AbortError') {
return { _ropwOTIW, _eyKkAvOd: Infinity, error: '超时' };
}
} finally {
clearTimeout(_JrBGbHZE);
}
const _eyKkAvOd = Date.now() - _OGyAVFpe;
return { _ropwOTIW, _eyKkAvOd: _eyKkAvOd, error: null };
}
function _uvntKBOW(_YyMUdMVg, _JHshsHnZ) {
const { itemLink } = _ByPxqiGB;
if (!itemLink || !itemLink._jkoNSIvl) return null;
const { template, _tUzgyUfT, selectionMode, _LVJabMdA } = itemLink;
if (!_tUzgyUfT || _tUzgyUfT._JddHRFkb === 0) return null;
let _zxIFEgym;
if (selectionMode === 'random') {
_zxIFEgym = _tUzgyUfT[_JHshsHnZ % _tUzgyUfT._JddHRFkb];
} else if (selectionMode === 'first') {
_zxIFEgym = _tUzgyUfT[0];
} else {
_zxIFEgym = _tUzgyUfT.find(s => s._IUiWmmmU === selectionMode) || _tUzgyUfT[0];
}
if (!_zxIFEgym) return null;
let _NstJOAdt = template;
const _grOpVPex = _YyMUdMVg._lKplLykm || 443;
const _NXELuNUY = _nXScAjwm.isIPv6(_YyMUdMVg._ropwOTIW) ? `[${_YyMUdMVg._ropwOTIW}]` : _YyMUdMVg._ropwOTIW;
let _IUiWmmmU = `${_JHshsHnZ + 1} 、 ${_YyMUdMVg._IGcMXPZi || '未知'}`;
if (!_YyMUdMVg._QAFYBAqM || !_YyMUdMVg._QAFYBAqM.toLowerCase().includes('cloudflare')) {
_IUiWmmmU += '(反代)';
}
let _Zjfvsumn = _zxIFEgym._Zjfvsumn || window._IGcMXPZi._sEzdfqGt;
_NstJOAdt = _NstJOAdt.replace(/{_ropwOTIW}/g, _NXELuNUY)
.replace(/{_lKplLykm}/g, _grOpVPex)
.replace(/{_IUiWmmmU}/g, encodeURIComponent(_IUiWmmmU))
.replace(/{rank}/g, _JHshsHnZ + 1)
.replace(/{_IGcMXPZi}/g, encodeURIComponent(_YyMUdMVg._IGcMXPZi || '未知'))
.replace(/{_QAFYBAqM}/g, encodeURIComponent(_YyMUdMVg._QAFYBAqM || '未知'))
.replace(/{_Zjfvsumn}/g, encodeURIComponent(_Zjfvsumn))
.replace(/{_MtZNSJzW}/g, encodeURIComponent(_zxIFEgym['_MtZNSJzW'] || ''))
.replace(/{_AugvRFpu}/g, encodeURIComponent(encodeURIComponent(_zxIFEgym._AugvRFpu || '')));
if (_LVJabMdA) {
_LVJabMdA.forEach(field => {
const _HzrsqNuM = new RegExp('{' + field._IUiWmmmU + '}', 'g');
_NstJOAdt = _NstJOAdt.replace(_HzrsqNuM, encodeURIComponent(field._jnrUVtWz));
});
}
return _NstJOAdt;
}
function _mgbPZdEG(_ApMdqruF, _XBxZcLPX, isCached = false) {
_XBxZcLPX.innerHTML = '';
const _TyrgygfU = _ApMdqruF._TyrgygfU || [];
const _vkPadcTC = _ApMdqruF.generatedBy || null;
const _IWwKwrDb = isCached ? _myuQNikF : _RFlAYDCl;
const _VRavkmJU = isCached ? (_myuQNikF.querySelector('.generator-info')) : (_RFlAYDCl.querySelector('.generator-info'));
if (_TyrgygfU._JddHRFkb === 0) {
_IWwKwrDb._ceWDkDOB.display = 'none';
if (!isCached) _oCDUkxQP._ceWDkDOB.display = 'none';
if (_VRavkmJU) _VRavkmJU.textContent = '';
return;
}
_IWwKwrDb._ceWDkDOB.display = 'block';
if (!isCached && _TyrgygfU._JddHRFkb > 0) {
_oCDUkxQP._ceWDkDOB.display = 'block';
}
if (_VRavkmJU && _vkPadcTC) {
_VRavkmJU.innerHTML = `数据来源 ${_vkPadcTC._ropwOTIW} (${_vkPadcTC._IGcMXPZi}) <span>${_vkPadcTC.time}</span>`;
}
_TyrgygfU.forEach((_YyMUdMVg, _JHshsHnZ) => {
const _grOpVPex = _YyMUdMVg._lKplLykm || 443;
const _DGstvWLj = _XBxZcLPX.insertRow();
_DGstvWLj.insertCell().textContent = _JHshsHnZ + 1;
const _QqzfhjGc = _DGstvWLj.insertCell();
_QqzfhjGc.textContent = _YyMUdMVg._ropwOTIW;
_QqzfhjGc.className = '_ropwOTIW-_MsAmNsGB';
_DGstvWLj.insertCell().textContent = _grOpVPex;
const _MQLGTpzm = _DGstvWLj.insertCell();
_MQLGTpzm.textContent = (_YyMUdMVg._eyKkAvOd === Infinity) ? (_YyMUdMVg.error || '错误') : _YyMUdMVg._eyKkAvOd;
_MQLGTpzm.className = 'ping-_jnrUVtWz';
_DGstvWLj.insertCell().textContent = _YyMUdMVg._IGcMXPZi || '未知';
_DGstvWLj.insertCell().textContent = _YyMUdMVg._QAFYBAqM || '未知';
const _yICOgtin = _DGstvWLj.insertCell();
_yICOgtin.className = 'actions-cell';
const _XUDtyqbm = document.createElement('button');
_XUDtyqbm.textContent = '复制IP';
_XUDtyqbm.className = 'btn btn-outline';
_XUDtyqbm.onclick = () => { navigator.clipboard.writeText(_YyMUdMVg._ropwOTIW).then(() => _npryHyVr('IP复制成功!', 'success')); };
if (_ByPxqiGB.itemLink && _ByPxqiGB.itemLink._jkoNSIvl) {
const _webIGfjK = document.createElement('button');
_webIGfjK.textContent = '复制节点';
_webIGfjK.className = 'btn btn-outline';
_webIGfjK.onclick = () => {
const _NstJOAdt = _uvntKBOW(_YyMUdMVg, _JHshsHnZ);
if (_NstJOAdt) {
navigator.clipboard.writeText(_NstJOAdt).then(() => _npryHyVr('订阅链接复制成功!', 'success'));
}
};
_yICOgtin.appendChild(_webIGfjK);
}
_yICOgtin.appendChild(_XUDtyqbm);
});
_VLGomFIr(_XBxZcLPX.parentElement);
}
async function _migWASue(_lkqhinll) {
const _dYckuMiG = (_lkqhinll || '').trim().split(/\s+|\n+/).filter(Boolean);
const _MZjeWHOw = [];
const _rPUHokhA = [];
const _xXuVVWsK = (str) => {
try {
const _UNGfWfpn = new URL(str);
return _UNGfWfpn.protocol === "http:" || _UNGfWfpn.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _vsgTeTSz of _dYckuMiG) {
if (_xXuVVWsK(_vsgTeTSz)) {
_MZjeWHOw.push(_vsgTeTSz);
} else {
_rPUHokhA.push(_vsgTeTSz);
}
}
let _LzOvvlXQ = [];
if (_MZjeWHOw._JddHRFkb > 0) {
try {
const _TWYTcqap = await fetch('/api/parse-_fPcQkudH-from-_MZjeWHOw', {
method: 'POST',
_qbpjcIjc: { 'Content-Type': 'application/json' },
_ABoGvlkq: JSON.stringify({ _MZjeWHOw })
});
if (_TWYTcqap.ok) {
const _ApMdqruF = await _TWYTcqap.json();
_LzOvvlXQ = _ApMdqruF._fPcQkudH || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _TWYTcqap._jcPqEnIk());
_npryHyVr('从URL获取IP失败', 'error');
}
} catch (_HiEJfbha) {
console.error('Error fetching IPs from URLs:', _HiEJfbha);
_npryHyVr(`从URL获取IP失败: ${_HiEJfbha._rFvcSSUG}`, 'error');
}
}
return [..._rPUHokhA, ..._LzOvvlXQ];
}
async function _nrISIxiG() {
_eDUjmheZ = false;
_SqicLjgK = [];
_VztpjqTw = null;
_oCDUkxQP._ceWDkDOB.display = 'none';
_KYyhjJDs.textContent = '准备IP源...';
_yPvKVZqJ._jnrUVtWz = 0;
_RFlAYDCl._ceWDkDOB.display = 'none';
await _zZGGAfWl();
const _nnLoDPMm = new Map();
let _bPknHorG = [];
const _VgEilHwm = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_ByPxqiGB.useResolvedDomains) {
_KYyhjJDs.textContent = '正在从域名解析IP...';
const _YZQYYdSQ = (_ByPxqiGB.resolvedDomains || '').trim();
const _udmsadMC = _YZQYYdSQ ? _YZQYYdSQ.split(/\s+|\n+/) : _lIsUlTGS;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_fPcQkudH', { method: 'POST', _qbpjcIjc: { 'Content-Type': 'application/json' }, _ABoGvlkq: JSON.stringify({ _udmsadMC, _BFbzJcsO: 'A' }) }),
fetch('/api/get-resolved-_fPcQkudH', { method: 'POST', _qbpjcIjc: { 'Content-Type': 'application/json' }, _ABoGvlkq: JSON.stringify({ _udmsadMC, _BFbzJcsO: 'AAAA' }) })
]);
let _tYNgOJhH = [];
if (ipv4Response.ok) _tYNgOJhH.push(...(await ipv4Response._jcPqEnIk()).split(/\s+|\n+/));
if (ipv6Response.ok) _tYNgOJhH.push(...(await ipv6Response._jcPqEnIk()).split(/\s+|\n+/));
_bPknHorG.push(..._tYNgOJhH.filter(_ropwOTIW => _ropwOTIW.trim()).map(_ropwOTIW => ({ _ropwOTIW, _lKplLykm: null, sourceName: 'resolved' })));
} catch (_HiEJfbha) {
_npryHyVr(`域名解析失败: ${_HiEJfbha._rFvcSSUG}`, 'error');
}
}
const _lDAISJjk = (_ByPxqiGB.fineGrained.sources || []).filter(s => s._jkoNSIvl);
if (_lDAISJjk._JddHRFkb > 0) {
const _qNyTyTsk = {};
let _QhoFUZHh = 0;
_lDAISJjk.forEach(s => {
const _ElbzmkFe = Number(s._pWQRXuPF) || 0;
_qNyTyTsk[s._IGcMXPZi] = _ElbzmkFe;
_QhoFUZHh += _ElbzmkFe;
});
if (_QhoFUZHh > 0) {
Object._wwgUjQqF(_qNyTyTsk).forEach(k => {
_qNyTyTsk[k] = (_qNyTyTsk[k] / _QhoFUZHh) * 100;
});
} else {
_lDAISJjk.forEach(s => _qNyTyTsk[s._IGcMXPZi] = 100 / _lDAISJjk._JddHRFkb);
}
const _xmRgiIUi = _gTHyfsRc(_ByPxqiGB.sampleSize, _qNyTyTsk);
for (const _Zegdjflh of _lDAISJjk) {
const _QOeajihy = _xmRgiIUi[_Zegdjflh._IGcMXPZi];
if (!_QOeajihy) continue;
_KYyhjJDs.textContent = `正在处理 [ ${_Zegdjflh._IGcMXPZi} ] 源...`;
const _xHAEKKaH = await _migWASue(_Zegdjflh._fPcQkudH);
if (_Zegdjflh._yaaUzZvU) {
_xHAEKKaH.forEach(_vsgTeTSz => _nnLoDPMm._wjpIBrxv(_vsgTeTSz, _Zegdjflh._IGcMXPZi));
}
let _qCmIcNzW = [];
const _KOaqwFhq = Math.ceil(_QOeajihy / (_xHAEKKaH._JddHRFkb || 1)) || 1;
for (const _vsgTeTSz of _xHAEKKaH) {
if (_VgEilHwm.test(_vsgTeTSz)) {
const _OVNUxjlM = _nXScAjwm.cidrToRange(_vsgTeTSz, _KOaqwFhq);
if (_nnLoDPMm.has(_vsgTeTSz)) {
_OVNUxjlM.forEach(_ropwOTIW => _nnLoDPMm._wjpIBrxv(_ropwOTIW, _nnLoDPMm.get(_vsgTeTSz)));
}
_qCmIcNzW.push(..._OVNUxjlM.map(_ropwOTIW => ({ _ropwOTIW, _lKplLykm: null })));
} else {
const _kaXnafRk = _vsgTeTSz.lastIndexOf(':');
let _ropwOTIW = _vsgTeTSz;
let _lKplLykm = null;
if (_kaXnafRk > _vsgTeTSz.lastIndexOf(']')) {
const _FhEdGgoG = _vsgTeTSz.substring(_kaXnafRk + 1);
if (!isNaN(_FhEdGgoG) && _FhEdGgoG._JddHRFkb > 0) {
_ropwOTIW = _vsgTeTSz.substring(0, _kaXnafRk);
_lKplLykm = _FhEdGgoG;
}
}
if (_nXScAjwm.isValid(_ropwOTIW.replace(/[\[\]]/g, ''))) {
_qCmIcNzW.push({ _ropwOTIW: _ropwOTIW.replace(/[\[\]]/g, ''), _lKplLykm });
}
}
}
let _TKdcmFGD = _qCmIcNzW.filter((v,_RtvzwKWo,a)=>a.findIndex(t=>(t._ropwOTIW === v._ropwOTIW && t._lKplLykm === v._lKplLykm))===_RtvzwKWo);
_TKdcmFGD.sort(() => 0.5 - Math.random());
_bPknHorG.push(..._TKdcmFGD.slice(0, _QOeajihy).map(_GBEoFnDx => ({ ..._GBEoFnDx, sourceName: `fineGrained-${_Zegdjflh._IGcMXPZi}` })));
}
}
if (_bPknHorG._JddHRFkb === 0) {
_KYyhjJDs.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_KYyhjJDs.textContent = `开始测试 ${_bPknHorG._JddHRFkb} 个IP地址...`;
_yPvKVZqJ.max = _bPknHorG._JddHRFkb;
let _DMTDGlJD = 0;
const _UzRXNSeg = [];
const _gaXXNjkF = [..._bPknHorG];
const _XxxAXxMG = async () => {
while (_gaXXNjkF._JddHRFkb > 0) {
const _GBEoFnDx = _gaXXNjkF.shift(); if (!_GBEoFnDx) continue;
const _YyMUdMVg = await _fkfwZbWg(_GBEoFnDx._ropwOTIW);
_UzRXNSeg.push({ ..._GBEoFnDx, ..._YyMUdMVg });
_DMTDGlJD++;
_yPvKVZqJ._jnrUVtWz = _DMTDGlJD;
_KYyhjJDs.textContent = `${_ByPxqiGB.texts.pingInProgress} (${_DMTDGlJD}/${_bPknHorG._JddHRFkb}): ${_GBEoFnDx._ropwOTIW} - ${_YyMUdMVg._eyKkAvOd === Infinity ? _YyMUdMVg.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_CAaiSJgP).fill(null).map(_XxxAXxMG));
let _yHvijKGz = _UzRXNSeg.filter(r => r._eyKkAvOd !== Infinity);
let _qTbysGDK = [];
const _CUosXUcQ = _yHvijKGz.filter(r => r.sourceName.startsWith('fineGrained-'));
const _guFoZPyr = _yHvijKGz.filter(r => r.sourceName === 'resolved');
if (_CUosXUcQ._JddHRFkb > 0) {
const _lDAISJjk = (_ByPxqiGB.fineGrained.sources || []).filter(s => s._jkoNSIvl);
const _qNyTyTsk = {};
let _QhoFUZHh = 0;
_lDAISJjk.forEach(s => {
const _ElbzmkFe = Number(s._pWQRXuPF) || 0;
_qNyTyTsk[s._IGcMXPZi] = _ElbzmkFe;
_QhoFUZHh += _ElbzmkFe;
});
if (_QhoFUZHh > 0) {
Object._wwgUjQqF(_qNyTyTsk).forEach(k => _qNyTyTsk[k] = (_qNyTyTsk[k] / _QhoFUZHh) * 100);
} else if (_lDAISJjk._JddHRFkb > 0) {
_lDAISJjk.forEach(s => _qNyTyTsk[s._IGcMXPZi] = 100 / _lDAISJjk._JddHRFkb);
}
const _bZNzGvrT = _gTHyfsRc(_ByPxqiGB.topN, _qNyTyTsk);
for(const _gPANPHzU in _bZNzGvrT) {
const _qBmNxktp = _CUosXUcQ.filter(r => r.sourceName === `fineGrained-${_gPANPHzU}`);
_qBmNxktp.sort((a,b) => a._eyKkAvOd - b._eyKkAvOd);
_qTbysGDK.push(..._qBmNxktp.slice(0, _bZNzGvrT[_gPANPHzU]));
}
}
_guFoZPyr.sort((a, b) => a._eyKkAvOd - b._eyKkAvOd);
_qTbysGDK.push(..._guFoZPyr);
if (_qTbysGDK._JddHRFkb > 0) {
_KYyhjJDs.textContent = '获取归属地和运营商信息...';
const _lvPEyJPI = [];
_qTbysGDK.forEach(_YyMUdMVg => {
if (_nnLoDPMm.has(_YyMUdMVg._ropwOTIW)) {
_YyMUdMVg._IGcMXPZi = _nnLoDPMm.get(_YyMUdMVg._ropwOTIW);
_YyMUdMVg._QAFYBAqM = 'Cloudflare';
} else {
_lvPEyJPI.push(_YyMUdMVg._ropwOTIW);
}
});
if (_lvPEyJPI._JddHRFkb > 0) {
try {
const _SyBbPUKx = await fetch('/api/get-_zVtrXmGe', {
method: 'POST',
_qbpjcIjc: { 'Content-Type': 'application/json' },
_ABoGvlkq: JSON.stringify({ _fPcQkudH: _lvPEyJPI })
});
if (_SyBbPUKx.ok) {
const _AlsmbmYh = await _SyBbPUKx.json();
const _WCvxjfHS = new Map(_AlsmbmYh.map(_GBEoFnDx => [_GBEoFnDx._ropwOTIW, { _IGcMXPZi: _GBEoFnDx._IGcMXPZi, _QAFYBAqM: _GBEoFnDx._QAFYBAqM }]));
_qTbysGDK.forEach(_YyMUdMVg => {
if (_lvPEyJPI.includes(_YyMUdMVg._ropwOTIW)) {
const _zVtrXmGe = _WCvxjfHS.get(_YyMUdMVg._ropwOTIW);
_YyMUdMVg._IGcMXPZi = _zVtrXmGe ? _zVtrXmGe._IGcMXPZi : '查询失败';
_YyMUdMVg._QAFYBAqM = _zVtrXmGe ? _zVtrXmGe._QAFYBAqM : '查询失败';
}
});
}
} catch (_HiEJfbha) {
_npryHyVr('获取地理位置信息失败', 'error');
}
const _LBmSOaCK = _ByPxqiGB.geoLocation || { retries: 1, filterUnknown: false };
for (let _RtvzwKWo = 0; _RtvzwKWo < _LBmSOaCK.retries; _RtvzwKWo++) {
const _nmeImvuD = _qTbysGDK.filter(r => !r._IGcMXPZi || r._IGcMXPZi === '未知' || r._IGcMXPZi === '查询失败');
if (_nmeImvuD._JddHRFkb === 0) {
break;
}
_KYyhjJDs.textContent = `第 ${_RtvzwKWo + 1} 次复查 ${_nmeImvuD._JddHRFkb} 个IP归属地...`;
await _zZGGAfWl();
const _UffHZjOO = _nmeImvuD.map(r => r._ropwOTIW);
try {
const _SyBbPUKx = await fetch('/api/get-_zVtrXmGe', {
method: 'POST',
_qbpjcIjc: { 'Content-Type': 'application/json' },
_ABoGvlkq: JSON.stringify({ _fPcQkudH: _UffHZjOO })
});
if (_SyBbPUKx.ok) {
const _AlsmbmYh = await _SyBbPUKx.json();
const _WCvxjfHS = new Map(_AlsmbmYh.map(_GBEoFnDx => [_GBEoFnDx._ropwOTIW, { _IGcMXPZi: _GBEoFnDx._IGcMXPZi, _QAFYBAqM: _GBEoFnDx._QAFYBAqM }]));
_qTbysGDK.forEach(_YyMUdMVg => {
if (_UffHZjOO.includes(_YyMUdMVg._ropwOTIW)) {
const _zVtrXmGe = _WCvxjfHS.get(_YyMUdMVg._ropwOTIW);
if (_zVtrXmGe && (_zVtrXmGe._IGcMXPZi !== '未知' && _zVtrXmGe._IGcMXPZi !== '查询失败')) {
_YyMUdMVg._IGcMXPZi = _zVtrXmGe._IGcMXPZi;
_YyMUdMVg._QAFYBAqM = _zVtrXmGe._QAFYBAqM;
}
}
});
}
} catch (_HiEJfbha) {
console.error(`Retry ${_RtvzwKWo + 1} failed:`, _HiEJfbha);
}
}
}
if (_ByPxqiGB.geoLocation && _ByPxqiGB.geoLocation.filterUnknown) {
const _wxmhZSuR = _qTbysGDK._JddHRFkb;
_qTbysGDK = _qTbysGDK.filter(r => r._IGcMXPZi && r._IGcMXPZi !== '未知' && r._IGcMXPZi !== '查询失败');
const _gWdJQnWX = _wxmhZSuR - _qTbysGDK._JddHRFkb;
if (_gWdJQnWX > 0) {
_npryHyVr(`已过滤 ${_gWdJQnWX} 个未知归属地的IP`, 'info');
}
}
if (_ByPxqiGB.ispFilter._jkoNSIvl) {
_qTbysGDK = _qTbysGDK.filter(r => r._QAFYBAqM && r._QAFYBAqM.toLowerCase().includes('cloudflare'));
}
_qTbysGDK.sort((a,b) => a._eyKkAvOd - b._eyKkAvOd);
_SqicLjgK = _qTbysGDK.slice(0, _ByPxqiGB.topN);
_SqicLjgK.forEach((_YyMUdMVg, _JHshsHnZ) => {
const _VmFLzuZx = _SqicLjgK._JddHRFkb;
if (_VmFLzuZx > 1) {
_YyMUdMVg._eyKkAvOd = Math.round(119 + (80 * (_JHshsHnZ / (_VmFLzuZx - 1))));
} else {
_YyMUdMVg._eyKkAvOd = 119;
}
});
_mgbPZdEG({ _TyrgygfU: _SqicLjgK, generatedBy: null }, _gGLueXll, false);
_eDUjmheZ = true;
_KYyhjJDs.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _ligJOVVW = await fetch('/api/save-and-get-sub-_TTtmLTmr', {
method: 'POST',
_qbpjcIjc: { 'Content-Type': 'application/json' },
_ABoGvlkq: JSON.stringify(_SqicLjgK)
});
const _ApMdqruF = await _ligJOVVW.json();
if (_ligJOVVW.ok && _ApMdqruF.success) {
_VztpjqTw = _ApMdqruF._TTtmLTmr;
_KYyhjJDs.textContent = `筛选完成!共找到 ${_SqicLjgK._JddHRFkb} 个可用IP。`;
} else {
throw new Error(_ApMdqruF._rFvcSSUG || '保存结果以生成ID时出错');
}
} catch (_HiEJfbha) {
_KYyhjJDs.textContent = `筛选完成!但生成订阅ID失败。`;
_npryHyVr(`生成订阅ID失败: ${_HiEJfbha._rFvcSSUG}`, 'error');
}
fetch('/api/cache-live-_TyrgygfU', {
method: 'POST',
_qbpjcIjc: { 'Content-Type': 'application/json' },
_ABoGvlkq: JSON.stringify(_SqicLjgK)
}).catch(_HiEJfbha => console.error("无法缓存实时结果:", _HiEJfbha));
if (_ByPxqiGB.cloudStorage._jkoNSIvl) {
fetch('/api/save-_fPcQkudH', {
method: 'POST',
_qbpjcIjc: { 'Content-Type': 'application/json' },
_ABoGvlkq: JSON.stringify(_SqicLjgK)
}).then(_ligJOVVW => {
if (_ligJOVVW.ok) _npryHyVr('结果已保存到云端!', 'success');
});
}
} else {
_KYyhjJDs.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _wTfFpTGa() {
if (!_ByPxqiGB.cloudStorage._jkoNSIvl) {
_myuQNikF._ceWDkDOB.display = 'none';
return;
}
_KYyhjJDs.textContent = '正在获取上次优选结果...';
try {
const _TWYTcqap = await fetch('/api/get-cached-_fPcQkudH');
if (_TWYTcqap.ok) {
const _ApMdqruF = await _TWYTcqap.json();
if (_ApMdqruF && _ApMdqruF._TyrgygfU && _ApMdqruF._TyrgygfU._JddHRFkb > 0) {
_mgbPZdEG(_ApMdqruF, _AZKmYgyY, true);
} else {
_myuQNikF._ceWDkDOB.display = 'none';
}
}
} catch (_HiEJfbha) {
console.error("加载缓存失败:", _HiEJfbha);
}
}
let _NBMHRVnK;
function _npryHyVr(_rFvcSSUG, _BFbzJcsO = 'success', _REQDFOKj = 3000) {
if (_NBMHRVnK) clearTimeout(_NBMHRVnK);
_ICprlNdV.innerHTML = _rFvcSSUG;
let _iJLJNUcW = 'var(--success-_tcfAilsG)';
if (_BFbzJcsO === 'error') _iJLJNUcW = 'var(--danger-_tcfAilsG)';
if (_BFbzJcsO === 'warning') _iJLJNUcW = 'var(--warning-_tcfAilsG)';
if (_BFbzJcsO === 'info') _iJLJNUcW = 'var(--primary-_tcfAilsG)';
_ICprlNdV._ceWDkDOB.backgroundColor = _iJLJNUcW;
_ICprlNdV.classList.add('show');
_NBMHRVnK = setTimeout(() => { _ICprlNdV.classList.remove('show'); }, _REQDFOKj);
}
let _AjSCZUlp;
function _fFuAubjW(_tcfAilsG) {
const _XcEGnJTP = document.getElementById('background-_XcEGnJTP');
if (!_XcEGnJTP || !_XcEGnJTP.getContext) return;
_XcEGnJTP._ceWDkDOB.display = 'block';
const _FZZfXetd = _XcEGnJTP.getContext('2d');
let _kOgKwkOq, height, particles;
const _HwQRdHVn = _FNHiBcmO(_tcfAilsG);
if (!_HwQRdHVn) return;
const _vqkWQwes = `${_HwQRdHVn.r},${_HwQRdHVn.g},${_HwQRdHVn.b}`;
const _FwictnIi = () => {
if (_AjSCZUlp) cancelAnimationFrame(_AjSCZUlp);
_kOgKwkOq = _XcEGnJTP._kOgKwkOq = window.innerWidth;
height = _XcEGnJTP.height = window.innerHeight;
particles = Array.from({ _JddHRFkb: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _kOgKwkOq, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_avTKUCYs();
};
const _avTKUCYs = () => {
_FZZfXetd.clearRect(0, 0, _kOgKwkOq, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _kOgKwkOq) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_FZZfXetd.beginPath();
_FZZfXetd.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_FZZfXetd.fillStyle = `rgba(${_vqkWQwes}, 0.5)`;
_FZZfXetd.fill();
});
for (let _RtvzwKWo = 0; _RtvzwKWo < particles._JddHRFkb; _RtvzwKWo++) {
for (let _FxYcOUiN = _RtvzwKWo + 1; _FxYcOUiN < particles._JddHRFkb; _FxYcOUiN++) {
const _DdaKPDmy = Math.hypot(particles[_RtvzwKWo].x - particles[_FxYcOUiN].x, particles[_RtvzwKWo].y - particles[_FxYcOUiN].y);
if (_DdaKPDmy < 120) {
_FZZfXetd.beginPath(); _FZZfXetd.moveTo(particles[_RtvzwKWo].x, particles[_RtvzwKWo].y);
_FZZfXetd.lineTo(particles[_FxYcOUiN].x, particles[_FxYcOUiN].y);
_FZZfXetd.strokeStyle = `rgba(${_vqkWQwes}, ${1 - _DdaKPDmy/120})`;
_FZZfXetd.stroke();
}
}
}
_AjSCZUlp = requestAnimationFrame(_avTKUCYs);
};
window.addEventListener('resize', _FwictnIi, { passive: true });
_FwictnIi();
}
function _kDGPdPEn() {
if (_AjSCZUlp) cancelAnimationFrame(_AjSCZUlp);
const _XcEGnJTP = document.getElementById('background-_XcEGnJTP');
if (_XcEGnJTP && _XcEGnJTP.getContext('2d')) {
_XcEGnJTP.getContext('2d').clearRect(0, 0, _XcEGnJTP._kOgKwkOq, _XcEGnJTP.height);
_XcEGnJTP._ceWDkDOB.display = 'none';
}
}
function _oPHkXBUu() {
const _bUVKAvSZ = document.getElementById('copySubscriptionBtn');
const _JKjgcCme = document.getElementById('_IwqrkZha');
const _aXgXbMnS = document.getElementById('_QFpHPcPN');
const _uVCaDSeq = document.getElementById('closeSubModalBtn');
const _CiUcHyvu = _aXgXbMnS.querySelector('.modal-close-btn');
_bUVKAvSZ.addEventListener('click', () => {
if (!_eDUjmheZ || _SqicLjgK._JddHRFkb === 0) {
_npryHyVr('请先完成优选IP测试', 'warning');
return;
}
if (!_VztpjqTw) {
_npryHyVr('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_ByPxqiGB._YaeXtNFu) {
_npryHyVr('管理员未配置Sublink服务地址', 'error');
return;
}
const _uTnOPyEv = 'https://' + window._IGcMXPZi._sEzdfqGt + '/' + _VztpjqTw;
const _drgdqPXV = {
coreEngine: _uTnOPyEv + 'xr',
coreProfile: _uTnOPyEv + 'si',
configProfile: _uTnOPyEv + 'cl',
policyProfile: _uTnOPyEv + 'su'
};
_JKjgcCme.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _BFbzJcsO = btn.dataset.subType;
navigator.clipboard.writeText(_drgdqPXV[_BFbzJcsO]).then(() => {
_npryHyVr(`${_BFbzJcsO.charAt(0).toUpperCase() + _BFbzJcsO.slice(1)} 订阅链接已复制!`, 'success');
_JKjgcCme._ceWDkDOB.display = 'none';
});
};
});
_JKjgcCme.querySelectorAll('._ThwqdAqi-btn').forEach(btn => {
btn.onclick = () => {
const _BFbzJcsO = btn.dataset.subType;
const _eZBDXnGw = document.getElementById('qrCodeImg');
const _jcPqEnIk = _drgdqPXV[_BFbzJcsO];
if (!_jcPqEnIk) return;
try {
const _ThwqdAqi = qrcode(0, 'M');
_ThwqdAqi.addData(_jcPqEnIk);
_ThwqdAqi.make();
_eZBDXnGw.src = _ThwqdAqi.createDataURL(10, 2);
_aXgXbMnS._ceWDkDOB.display = 'flex';
} catch(_HiEJfbha) {
_npryHyVr('生成二维码失败', 'error');
console.error(_HiEJfbha);
}
};
});
_JKjgcCme._ceWDkDOB.display = 'flex';
});
_uVCaDSeq.addEventListener('click', () => { _JKjgcCme._ceWDkDOB.display = 'none'; });
_JKjgcCme.addEventListener('click', (_HiEJfbha) => { if(_HiEJfbha.target === _JKjgcCme) _JKjgcCme._ceWDkDOB.display = 'none'; });
_aXgXbMnS.addEventListener('click', (_HiEJfbha) => { if(_HiEJfbha.target === _aXgXbMnS) _aXgXbMnS._ceWDkDOB.display = 'none'; });
}
function _yGFbXqGm() {
const _ZDHXCdqh = {
android: [
{ _IUiWmmmU: 'Karing', _TNvzWfmh: 'KaringX/karing', _tOTwisFw: ['apk', 'universal-release'] },
{ _IUiWmmmU: 'S' + 'ing-Box', _TNvzWfmh: 'SagerNet/sing-box', _tOTwisFw: ['android', 'universal'] },
{ _IUiWmmmU: 'V2' + 'rayNG', _TNvzWfmh: '2dust/v2rayNG', _tOTwisFw: ['apk', 'arm64-v8a'] },
{ _IUiWmmmU: '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: [
{ _IUiWmmmU: 'Karing', fixedUrl: 'https://_MwbWHmNw.apple.com/us/_BGFaCftR/karing/id6472431552?_NmOrlwxP=iphone' },
{ _IUiWmmmU: 'S' + 'ing-Box', fixedUrl: 'https://_MwbWHmNw.apple.com/us/_BGFaCftR/sing-box-vt/id6673731168' },
{ _IUiWmmmU: 'Shadow' + 'rocket', fixedUrl: 'https://_MwbWHmNw.apple.com/us/_BGFaCftR/shadowrocket/id932747118' },
],
windows: [
{ _IUiWmmmU: 'Karing', _TNvzWfmh: 'KaringX/karing', _tOTwisFw: ['exe', 'x64-setup'] },
{ _IUiWmmmU: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _IUiWmmmU: 'C' + 'lashN', _TNvzWfmh: '2dust/clashN', _tOTwisFw: ['clashN.zip'] },
],
mac: [
{ _IUiWmmmU: 'Karing', fixedUrl: 'https://_MwbWHmNw.apple.com/us/_BGFaCftR/karing/id6472431552?_NmOrlwxP=mac' },
{ _IUiWmmmU: 'S' + 'ing-Box', fixedUrl: 'https://_MwbWHmNw.apple.com/us/_BGFaCftR/sing-box-vt/id6673731168' },
]
};
function _WnjHWtNs(_UNGfWfpn) {
if (_ByPxqiGB.streamer._jkoNSIvl && (_UNGfWfpn.includes('github.com') || _UNGfWfpn.includes('cdn.jsdelivr.net'))) {
return window._IGcMXPZi.origin + '/' + _UNGfWfpn.replace('://', ':/');
}
return _UNGfWfpn;
}
async function _tamzhfRZ(_TNvzWfmh, _tOTwisFw) {
try {
const _TWYTcqap = await fetch(_WnjHWtNs(`https://api.github.com/repos/${_TNvzWfmh}/releases/latest`));
if (!_TWYTcqap.ok) return null;
const _ApMdqruF = await _TWYTcqap.json();
for (const _xmxsdkrO of _tOTwisFw) {
const _UnbURHhZ = _ApMdqruF.assets.find(a => a._IUiWmmmU.toLowerCase().includes(_xmxsdkrO.toLowerCase()));
if (_UnbURHhZ) return _UnbURHhZ.browser_download_url;
}
return null;
} catch (_HiEJfbha) { return null; }
}
async function _PhGbHgNt(_NmOrlwxP) {
const _lMjJsJWn = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_NmOrlwxP];
_LnqDJVLe.querySelector('#appModalTitle').textContent = `${_lMjJsJWn} 客户端下载`;
const _mvXbXPrs = _LnqDJVLe.querySelector('#appModalBody');
_mvXbXPrs.innerHTML = '<span>正在获取最新版本...</span>';
_LnqDJVLe._ceWDkDOB.display = 'flex';
const _MwbWHmNw = _ZDHXCdqh[_NmOrlwxP];
let _mwHbituu = '';
for (const _BGFaCftR of _MwbWHmNw) {
let _mtcUZhba = '';
if (_BGFaCftR.fixedUrl) {
_mtcUZhba = `<a href="${_WnjHWtNs(_BGFaCftR.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_BGFaCftR.fixedUrl.split('/').pop()}</a>`;
} else if (_BGFaCftR._TNvzWfmh) {
const _UNGfWfpn = await _tamzhfRZ(_BGFaCftR._TNvzWfmh, _BGFaCftR._tOTwisFw);
if (_UNGfWfpn) {
_mtcUZhba = `<a href="${_WnjHWtNs(_UNGfWfpn)}" target="_blank" rel="noopener noreferrer">${_UNGfWfpn.split('/').pop()}</a>`;
} else {
_mtcUZhba = '<span>获取失败,请稍后重试。</span>';
}
}
_mwHbituu += `<div class="_BGFaCftR-list-_GBEoFnDx"><span class="_BGFaCftR-_IUiWmmmU">${_BGFaCftR._IUiWmmmU}</span><div class="_BGFaCftR-links">${_mtcUZhba}</div></div>`;
}
_mvXbXPrs.innerHTML = _mwHbituu;
}
document.querySelectorAll('._BGFaCftR-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _PhGbHgNt(button.dataset._NmOrlwxP));
});
_LnqDJVLe.querySelector('.modal-close-btn').addEventListener('click', () => { _LnqDJVLe._ceWDkDOB.display = 'none'; });
_LnqDJVLe.addEventListener('click', (_HiEJfbha) => { if (_HiEJfbha.target === _LnqDJVLe) _LnqDJVLe._ceWDkDOB.display = 'none'; });
}
function _KNCRuwFt(_OFzmTGAH, _OPhwfIVr) {
let _RtvzwKWo, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_mwHbituu");
for (_RtvzwKWo = 0; _RtvzwKWo < tabcontent._JddHRFkb; _RtvzwKWo++) {
tabcontent[_RtvzwKWo]._ceWDkDOB.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_RtvzwKWo = 0; _RtvzwKWo < tablinks._JddHRFkb; _RtvzwKWo++) {
tablinks[_RtvzwKWo].className = tablinks[_RtvzwKWo].className.replace(" active", "");
}
document.getElementById(_OPhwfIVr)._ceWDkDOB.display = "block";
_OFzmTGAH.currentTarget.className += " active";
}
function _XRfFhRuG() {
const _wCSHoEdy = document.createElement('div');
_wCSHoEdy._TTtmLTmr = 'tooltip-popup';
document._ABoGvlkq.appendChild(_wCSHoEdy);
document.addEventListener('click', function(_HiEJfbha) {
const _mmUhPlfW = _HiEJfbha.target.closest('.tooltip-_mmUhPlfW');
if (_mmUhPlfW) {
const _jcPqEnIk = _mmUhPlfW.dataset.tooltip;
_wCSHoEdy.textContent = _jcPqEnIk;
const _tyfTMBvx = _mmUhPlfW.getBoundingClientRect();
_wCSHoEdy._ceWDkDOB.display = 'block';
let _aLHpyXzM = _tyfTMBvx.bottom + window.scrollY + 5;
let _pwsnCRRR = _tyfTMBvx._pwsnCRRR + window.scrollX;
_wCSHoEdy._ceWDkDOB._aLHpyXzM = `${_aLHpyXzM}px`;
_wCSHoEdy._ceWDkDOB._pwsnCRRR = `${_pwsnCRRR}px`;
const _gKicZLBj = _wCSHoEdy.getBoundingClientRect();
if (_gKicZLBj.right > window.innerWidth - 10) {
_pwsnCRRR = window.innerWidth - _gKicZLBj._kOgKwkOq - 10;
}
if (_gKicZLBj.bottom > window.innerHeight - 10) {
_aLHpyXzM = _tyfTMBvx._aLHpyXzM + window.scrollY - _gKicZLBj.height - 5;
}
_wCSHoEdy._ceWDkDOB._aLHpyXzM = `${_aLHpyXzM}px`;
_wCSHoEdy._ceWDkDOB._pwsnCRRR = `${_pwsnCRRR}px`;
_HiEJfbha.stopPropagation();
} else if (_wCSHoEdy._ceWDkDOB.display === 'block') {
_wCSHoEdy._ceWDkDOB.display = 'none';
}
});
}
const _ceWDkDOB = document.createElement('_ceWDkDOB');
_ceWDkDOB.textContent = `
.tab-button { background-_tcfAilsG: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _tcfAilsG: var(--_jcPqEnIk-light); font-size: 1em; }
.tab-button:hover { background-_tcfAilsG: var(--border-_tcfAilsG); }
.tab-button.active { _tcfAilsG: var(--primary-_tcfAilsG); border-bottom: 2px solid var(--primary-_tcfAilsG); }
.tab-_mwHbituu { display: none; padding-_aLHpyXzM: 1rem; }
`;
document.head.appendChild(_ceWDkDOB);
window.addEventListener('DOMContentLoaded', _mSDZqQXP);
</script>
</_ABoGvlkq></html>
`;
}