import { connect } from "cloudflare:sockets";
const _uRfEDEEq = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _zLxlSiwE = ["UpstreamAddress.SG.CMLiussss.net"];
const _JsCjOUds = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _HoUZIuGT = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _CRpYxkjg = '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 _CzkKrtNa = '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 _XzIMmxel(_jVLvsPoc) {
if (Array.isArray(_jVLvsPoc)) {
try {
return String.fromCharCode.apply(null, _jVLvsPoc);
} catch (_WVvkUBQv) {
return '';
}
}
return _jVLvsPoc;
}
function _tJCRqGLv(_LSXhjPpk) {
return /^[0-9a-_icaNgLSf]{8}-[0-9a-_icaNgLSf]{4}-[4][0-9a-_icaNgLSf]{3}-[89ab][0-9a-_icaNgLSf]{3}-[0-9a-_icaNgLSf]{12}$/_zoyRWIdH.test(_LSXhjPpk);
}
const _BFXHAuZx = "optimized_ips_v4";
const _ZBQjukNg = "global_config_v4";
const _SCFShvPD = "admin_password_v4";
const _NCwQYarP = "live_results_temp_v1";
const _LKHUClxB = "latest_sub_id_v1";
export default {
async fetch(_onweLyTz, _fYvmpcQp, _NgGtaAhd) {
try {
if (!_fYvmpcQp.DB) {
const _DKwXgRhO = _xUGkhueE("D1 数据库 'DB' 未绑定。");
return new Response(_DKwXgRhO, { status: 503, _jgBuQvlC: { 'Content-Type': '_ANodCKil/html;_CmRWbkul=UTF-8' }});
}
_NgGtaAhd.waitUntil(
_fYvmpcQp.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_ICLvekXw TEXT PRIMARY KEY, _jVLvsPoc TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_LSXhjPpk TEXT PRIMARY KEY, _TcYqzPgL TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_WVvkUBQv => console.error("DB Init Error:", _WVvkUBQv._ORsTYVew))
);
const _OjAsMgfW = new URL(_onweLyTz._OjAsMgfW);
const _eNXPeMNh = _OjAsMgfW.pathname;
const _OZLIrVVo = _onweLyTz._jgBuQvlC.get("Upgrade");
const _vXpEJhzw = await _orBYJfis(_fYvmpcQp);
if (_vXpEJhzw.websocketStreamer && _vXpEJhzw.websocketStreamer._WHtvpmzp && _OZLIrVVo && _OZLIrVVo.toLowerCase() === "websocket") {
const _wVbyTAFx = _vXpEJhzw.websocketStreamer._OjAsMgfW;
if (_wVbyTAFx && _wVbyTAFx.trim().startsWith('https://')) {
try {
const _bKKSgqNq = new Request(_wVbyTAFx.trim() + _OjAsMgfW.pathname + _OjAsMgfW.search, _onweLyTz);
return await fetch(_bKKSgqNq);
} catch (_WVvkUBQv) {
return new Response(`Upstream WebSocket gateway failed: ${_WVvkUBQv._ORsTYVew}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_OZLIrVVo && _OZLIrVVo.toLowerCase() === "websocket") {
return await _RPfrGgYU(_onweLyTz, _fYvmpcQp, _vXpEJhzw);
}
const _FNpySnNc = _eNXPeMNh._NqeRhmPb(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_FNpySnNc) {
const [, _rwiKwUPy, typeSuffix] = _FNpySnNc;
const _cEWxDwqW = _vXpEJhzw._cEWxDwqW;
if (!_cEWxDwqW || _cEWxDwqW.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _jgBuQvlC: { 'Content-Type': '_ANodCKil/plain; _CmRWbkul=utf-8' } });
}
const _PGWOpKIv = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _dXrPvINf = _PGWOpKIv[typeSuffix];
const _dozshEqp = _cEWxDwqW.replace(/\/$/, '');
const _YIjexCrv = `${_OjAsMgfW.origin}/${_rwiKwUPy}`;
const _QNfgkeKd = `${_dozshEqp}/${_dXrPvINf}?_vXpEJhzw=${encodeURIComponent(_YIjexCrv)}`;
try {
const _wjOwTGuS = await fetch(_QNfgkeKd, { _jgBuQvlC: { 'User-Agent': _onweLyTz._jgBuQvlC.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _MLCXzyYl = new Headers(_wjOwTGuS._jgBuQvlC);
_MLCXzyYl._JSheqDrW('Access-Control-Allow-Origin', '*');
return new Response(_wjOwTGuS._uLVPUhBk, { status: _wjOwTGuS.status, statusText: _wjOwTGuS.statusText, _jgBuQvlC: _MLCXzyYl });
} catch (_WVvkUBQv) {
return new Response(`获取上游订阅失败: ${_WVvkUBQv._ORsTYVew}`, { status: 502, _jgBuQvlC: { 'Content-Type': '_ANodCKil/plain; _CmRWbkul=utf-8' } });
}
}
if (_eNXPeMNh.startsWith('/https:/') || _eNXPeMNh.startsWith('/http:/')) {
return _WscjNbLO(_onweLyTz, _vXpEJhzw);
}
if (_vXpEJhzw.customSubPath && _vXpEJhzw.customSubPath._WHtvpmzp && _vXpEJhzw.customSubPath._eNXPeMNh && _eNXPeMNh === '/' + _vXpEJhzw.customSubPath._eNXPeMNh.trim()) {
const _bZAfLnUN = _fYvmpcQp.DB.prepare("SELECT _jVLvsPoc FROM kv_data WHERE _ICLvekXw = ?").bind(_LKHUClxB);
const { _dGyFAfIJ } = await _bZAfLnUN.all();
const _JCDTFLfs = _dGyFAfIJ._LFlZWewk > 0 ? _dGyFAfIJ[0]._jVLvsPoc : null;
if (_JCDTFLfs) {
return _nguNVmxj({ _RqDQgRfv: { _LSXhjPpk: _JCDTFLfs }, _OjAsMgfW: _onweLyTz._OjAsMgfW }, _fYvmpcQp);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _jgBuQvlC: { 'Content-Type': '_ANodCKil/plain; _CmRWbkul=utf-8' } });
}
}
const _auAWSEUj = _eNXPeMNh.split('/').filter(Boolean);
if (_auAWSEUj._LFlZWewk === 1 && !_eNXPeMNh.startsWith('/api/')) {
const _rwiKwUPy = _auAWSEUj[0];
return _nguNVmxj({ _RqDQgRfv: { _LSXhjPpk: _rwiKwUPy }, _OjAsMgfW: _onweLyTz._OjAsMgfW }, _fYvmpcQp);
}
if (_eNXPeMNh.startsWith('/api/')) {
if (_eNXPeMNh === '/api/_vXpEJhzw' && _onweLyTz.method === 'POST') return _RBFErmYN(_onweLyTz, _fYvmpcQp, _NgGtaAhd);
if (_eNXPeMNh === '/api/_JSheqDrW-_AFCpTXpv') return _ozaVQDoo(_onweLyTz, _fYvmpcQp);
if (_eNXPeMNh === '/api/change-_AFCpTXpv') return _xMaGrgtP(_onweLyTz, _fYvmpcQp);
if (_eNXPeMNh === '/api/verify-_AFCpTXpv') return _sEDafvkL(_onweLyTz, _fYvmpcQp);
if (_eNXPeMNh === '/api/verify-visitor-_AFCpTXpv' && _onweLyTz.method === 'POST') return _leBplPKX(_onweLyTz, _fYvmpcQp);
if (_eNXPeMNh === '/api/cache-live-_dGyFAfIJ' && _onweLyTz.method === 'POST') return _wVJthRMu(_onweLyTz, _fYvmpcQp, _NgGtaAhd);
if (_eNXPeMNh === '/api/get-_DJewlrxy' && _onweLyTz.method === 'POST') return _IHszmzsB(_onweLyTz, _fYvmpcQp);
if (_eNXPeMNh === '/api/get-cached-_oqpCrGJP') return _XZDJczsO(_onweLyTz, _fYvmpcQp);
if (_eNXPeMNh === '/api/save-_oqpCrGJP') return _ahMSoakq(_onweLyTz, _fYvmpcQp, _NgGtaAhd);
if (_eNXPeMNh === '/api/save-and-get-sub-_LSXhjPpk' && _onweLyTz.method === 'POST') return _bBfryYBr(_onweLyTz, _fYvmpcQp);
if (_eNXPeMNh.startsWith('/api/get-_wWwmNEaJ/')) {
const _rwiKwUPy = _eNXPeMNh.split('/').pop();
return _nguNVmxj({ _RqDQgRfv: { _LSXhjPpk: _rwiKwUPy }, _OjAsMgfW: _onweLyTz._OjAsMgfW }, _fYvmpcQp);
}
if (_eNXPeMNh === '/api/_vXpEJhzw' && _onweLyTz.method === 'GET') return _rzruLKWO(_fYvmpcQp);
if (_eNXPeMNh === '/api/get-resolved-_oqpCrGJP') return _lvxWrkhz(_onweLyTz);
if (_eNXPeMNh === '/api/parse-_oqpCrGJP-from-_OLqPSnWk' && _onweLyTz.method === 'POST') return _MDZPlrIb(_onweLyTz, _fYvmpcQp);
if (_eNXPeMNh === '/api/endpoints') return _NaNlkrEr(_onweLyTz, _fYvmpcQp);
if (_eNXPeMNh === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_eNXPeMNh === '/_BcVdQLAm') return _fBzxGKEm(_onweLyTz, _fYvmpcQp);
if (_eNXPeMNh === '/bing-wallpaper') return _oRSXRTwI();
return _qOJoxHUJ(_onweLyTz, _fYvmpcQp, _NgGtaAhd);
} catch (err) {
let _WVvkUBQv = err;
return new Response(_WVvkUBQv.toString(), { status: 500 });
}
}
};
const _TJoKmMXm = { 'Accept': '_ANodCKil/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 _VrKWiaac(_OjAsMgfW, _bjdTkdNr) {
const _cxZNPbtJ = await fetch(_OjAsMgfW, { _jgBuQvlC: { ..._TJoKmMXm, 'Referer': _bjdTkdNr.referer } });
if (_cxZNPbtJ.ok) return _cxZNPbtJ._ANodCKil();
return null;
}
async function _rNBQbBQH(_OjAsMgfW, _bjdTkdNr) {
const _ggWIHNxg = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_OjAsMgfW)}`;
const _cxZNPbtJ = await fetch(_ggWIHNxg, { _jgBuQvlC: { ..._TJoKmMXm, 'Referer': _bjdTkdNr.referer } });
if (!_cxZNPbtJ.ok) return null;
const _uLVPUhBk = await _cxZNPbtJ._ANodCKil();
const _NqeRhmPb = _uLVPUhBk._NqeRhmPb(/<pre[^>]*>([\s\S]*?)<\/pre>/_zoyRWIdH);
return _NqeRhmPb && _NqeRhmPb[1] ? _NqeRhmPb[1].replace(/&/g, '&') : null;
}
function _OEKgjQbn(_VPXKlmdE) {
let _RujDnxtg;
try {
_RujDnxtg = atob(_VPXKlmdE.replace(/\s/g, ''));
} catch (_WVvkUBQv) {
_RujDnxtg = _VPXKlmdE;
}
const _wWwmNEaJ = _RujDnxtg.split(/[\s\n\r,]+/).filter(line => line.trim());
const _zkzTAXKs = new Set();
const _wDzLivbJ = /@([^?#]+?):(\d+)/;
for (const _uvxxuSbf of _wWwmNEaJ) {
let _xOcuTxct = '';
let _wUcuAeOY = '';
try {
if (_uvxxuSbf.startsWith('vmess://')) {
const _ggbYlJXK = atob(_uvxxuSbf.substring(8));
const _vXpEJhzw = JSON.parse(_ggbYlJXK);
_xOcuTxct = _vXpEJhzw.add;
_wUcuAeOY = _vXpEJhzw._wUcuAeOY;
} else {
const _NqeRhmPb = _uvxxuSbf._NqeRhmPb(_wDzLivbJ);
if (_NqeRhmPb && _NqeRhmPb[1] && _NqeRhmPb[2]) {
_xOcuTxct = _NqeRhmPb[1].replace(/[\[\]]/g, '');
_wUcuAeOY = _NqeRhmPb[2];
}
}
} catch (_WVvkUBQv) {
console.warn(`Could not parse _uvxxuSbf: ${_uvxxuSbf}`);
}
if (_xOcuTxct && _wUcuAeOY) {
_zkzTAXKs.add(`${_xOcuTxct}:${_wUcuAeOY}`);
}
}
return Array.from(_zkzTAXKs);
}
async function _QehecscF(_JICjbTbE) {
try {
const _cxZNPbtJ = await fetch(_JICjbTbE, { _jgBuQvlC: _TJoKmMXm });
if (!_cxZNPbtJ.ok) {
console.error(`Failed to fetch subscription: ${_cxZNPbtJ.status}`);
return [];
}
const _VPXKlmdE = await _cxZNPbtJ._ANodCKil();
return _OEKgjQbn(_VPXKlmdE);
} catch (error) {
console.error(`Error processing subscription ${_JICjbTbE}:`, error);
return [];
}
}
async function _CUfMGnfs(_RkqyAnzQ) {
const _SThTSutt = _RkqyAnzQ.trim();
const _hKxiKFcY = /^(vless|vmess|trojan|ss):\/\//.test(_SThTSutt);
const _ZIpwmSHY = (() => {
if (_SThTSutt._LFlZWewk < 20 || _SThTSutt.startsWith('http')) return false;
const _DCwMaMmQ = _SThTSutt.replace(/\s/g, '');
if (_DCwMaMmQ._LFlZWewk % 4 !== 0 && !_DCwMaMmQ.includes('=')) return false;
try {
atob(_DCwMaMmQ);
return true;
} catch (_WVvkUBQv) {
return false;
}
})();
if (_hKxiKFcY || _ZIpwmSHY) {
return _OEKgjQbn(_SThTSutt).join('\n');
}
const _GWysUWBM = [
'https://ipdb.api.030101.xyz/?_AbWtAFlz=bestcf&_oPnuCuVc=true',
'https://ipdb.api.030101.xyz/?_AbWtAFlz=bestproxy&_oPnuCuVc=true'
];
const _sqxJOxyK = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_zoyRWIdH.test(_RkqyAnzQ) || _RkqyAnzQ.includes('?_JYrGqVQM=');
if (_sqxJOxyK) {
const _oqpCrGJP = await _QehecscF(_RkqyAnzQ);
return _oqpCrGJP.join('\n');
}
let _VPXKlmdE = '';
if (_GWysUWBM.includes(_RkqyAnzQ)) {
_VPXKlmdE = await _VrKWiaac(_RkqyAnzQ, { referer: _RkqyAnzQ });
if (!_VPXKlmdE || _VPXKlmdE._LFlZWewk < 8) {
_VPXKlmdE = await _rNBQbBQH(_RkqyAnzQ, { referer: _RkqyAnzQ });
}
} else {
try {
const _iRyOTVQC = await fetch(_RkqyAnzQ, { _jgBuQvlC: { 'User-Agent': 'Cloudflare-Worker' } });
if (_iRyOTVQC.ok) {
_VPXKlmdE = await _iRyOTVQC._ANodCKil();
} else {
console.warn(`Failed to fetch URL ${_RkqyAnzQ}: ${_iRyOTVQC.status}`);
}
} catch (_WVvkUBQv) {
console.error(`Error fetching URL ${_RkqyAnzQ}:`, _WVvkUBQv);
}
}
const _qvuoCjhX = _OEKgjQbn(_VPXKlmdE);
if (_qvuoCjhX._LFlZWewk > 0) {
return _qvuoCjhX.join('\n');
}
return _VPXKlmdE || '';
}
async function _WscjNbLO(_onweLyTz, _vXpEJhzw) {
if (!_vXpEJhzw.streamer._WHtvpmzp) {
return new Response('远程流功能未开启', { status: 403 });
}
const _OjAsMgfW = new URL(_onweLyTz._OjAsMgfW);
const _uoZACicP = _OjAsMgfW.pathname.substring(1).replace(':/', '://');
try {
const _QNfgkeKd = new URL(_uoZACicP);
const _qlszeIao = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_qlszeIao.some(domain => _QNfgkeKd._xOcuTxct.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _cYDxFFvn = new Headers(_onweLyTz._jgBuQvlC);
_cYDxFFvn._JSheqDrW('Host', _QNfgkeKd._xOcuTxct);
_cYDxFFvn._JSheqDrW('User-Agent', 'CF-Worker-Streamer/1.0');
const _KaxYzWDd = await fetch(_QNfgkeKd.toString(), {
method: _onweLyTz.method,
_jgBuQvlC: _cYDxFFvn,
_uLVPUhBk: _onweLyTz._uLVPUhBk,
});
const _MLCXzyYl = new Headers(_KaxYzWDd._jgBuQvlC);
_MLCXzyYl._JSheqDrW('Access-Control-Allow-Origin', '*');
_MLCXzyYl._JSheqDrW('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_MLCXzyYl._JSheqDrW('Access-Control-Allow-Headers', '*');
_MLCXzyYl._JSheqDrW('Cache-Control', 'public, max-age=86400');
_MLCXzyYl._JSheqDrW('X-Streamer-Source', 'CF-Worker');
_MLCXzyYl.delete('_VPXKlmdE-security-policy');
_MLCXzyYl.delete('x-_VPXKlmdE-security-policy');
_MLCXzyYl.delete('x-webkit-csp');
return new Response(_KaxYzWDd._uLVPUhBk, {
status: _KaxYzWDd.status,
statusText: _KaxYzWDd.statusText,
_jgBuQvlC: _MLCXzyYl,
});
} catch (_WVvkUBQv) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _RPfrGgYU(_onweLyTz, _fYvmpcQp, _vXpEJhzw) {
try {
const _UCjPnFBp = _vXpEJhzw || await _orBYJfis(_fYvmpcQp);
const _SvahEFhV = (_UCjPnFBp.itemLink._QxTHRutC && _UCjPnFBp.itemLink._QxTHRutC[0]) || {};
const _hTRDbNPg = _SvahEFhV['_JYrGqVQM'] || _XzIMmxel(_uRfEDEEq);
if (!_tJCRqGLv(_hTRDbNPg)) {
throw new Error("Configured user _rnxnLxJN is not valid.");
}
const _wfBjJtrx = _UCjPnFBp.dataFeeds.universalFallbackAddress;
let _swuirzWt = {};
const _CChHVEBh = _XzIMmxel(_zLxlSiwE[0] || "");
if (_wfBjJtrx) {
const [_FmFgLerq, _wUcuAeOY = '443'] = _wfBjJtrx.split(':');
_swuirzWt = { _FmFgLerq, _wUcuAeOY };
} else {
const [_FmFgLerq, _wUcuAeOY = '443'] = _CChHVEBh.split(':');
_swuirzWt = { _FmFgLerq, _wUcuAeOY };
}
const _OjAsMgfW = new URL(_onweLyTz._OjAsMgfW);
const _eNXPeMNh = _OjAsMgfW.pathname;
let _kPkBLVIz = '';
const _JXXLdnqa = _OjAsMgfW.searchParams.get('remote');
if (_JXXLdnqa) {
_kPkBLVIz = atob(_JXXLdnqa);
} else if (_eNXPeMNh.startsWith('/endpoint=')) {
_kPkBLVIz = _eNXPeMNh.substring(10);
} else if (_eNXPeMNh._LFlZWewk > 1 && _eNXPeMNh.substring(1).includes('.')) {
_kPkBLVIz = _eNXPeMNh.substring(1);
}
if (_kPkBLVIz) {
const [_FmFgLerq, _wUcuAeOY = '443'] = _kPkBLVIz.split(':');
_swuirzWt = { _FmFgLerq, _wUcuAeOY };
}
return await _BiBKdrDp(_onweLyTz, _hTRDbNPg, _swuirzWt);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _BiBKdrDp(_onweLyTz, _rnxnLxJN, _swuirzWt) {
const _pgixEsrZ = new WebSocketPair();
const [clientEnd, _qSyXsGCq] = Object.values(_pgixEsrZ);
_qSyXsGCq.accept();
let _lZkTRvZJ = { _xHpZqHmj: null };
const _XwErODxe = _onweLyTz._jgBuQvlC.get("sec-websocket-protocol") || "";
const _qnfUXvbi = _stLyKUWD(_qSyXsGCq, _XwErODxe);
_qnfUXvbi.pipeTo(new WritableStream({
async write(chunk) {
if (_lZkTRvZJ._xHpZqHmj) {
const _VWnKIRoW = _lZkTRvZJ._xHpZqHmj.writable.getWriter();
await _VWnKIRoW.write(chunk);
_VWnKIRoW.releaseLock();
return;
}
const { error, details } = await _snRoPVRT(chunk, _rnxnLxJN);
if (error) {
throw new Error(details);
}
const _decFZFpW = new Uint8Array([details._bfAzOjqA[0], 0]);
const _IkcaAtxT = chunk.slice(details.payloadIndex);
await _FxFnNQNM(_lZkTRvZJ, details._BsChaYtm, details._IrafNccM, _IkcaAtxT, _qSyXsGCq, _decFZFpW, _swuirzWt);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_mGiPbHmt(_qSyXsGCq);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _FxFnNQNM(_lZkTRvZJ, _BsChaYtm, _IrafNccM, _EfeHwlIC, _CgkTdEtW, _decFZFpW, _aJuvcsCr) {
const _zhrtLPmP = async (_FmFgLerq, _wUcuAeOY) => {
let _BXrEPNEG = _FmFgLerq;
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(_FmFgLerq)) {
_BXrEPNEG = `${atob('d3d3Lg==')}${_FmFgLerq}${atob('LnNzbGlwLmlv')}`;
}
const _xHpZqHmj = connect({ _xOcuTxct: _BXrEPNEG, _wUcuAeOY });
_lZkTRvZJ._xHpZqHmj = _xHpZqHmj;
const _VWnKIRoW = _xHpZqHmj.writable.getWriter();
await _VWnKIRoW.write(_EfeHwlIC);
_VWnKIRoW.releaseLock();
return _xHpZqHmj;
};
const _gtgKpHVW = async () => {
if (!_aJuvcsCr._FmFgLerq) return;
console.log(`Direct connection failed, falling back to gateway: ${_aJuvcsCr._FmFgLerq}`);
const _jPHKtCHb = await _zhrtLPmP(_aJuvcsCr._FmFgLerq, parseInt(_aJuvcsCr._wUcuAeOY, 10));
_jPHKtCHb.closed.catch(() => {}).finally(() => _mGiPbHmt(_CgkTdEtW));
_VLjBWtaj(_jPHKtCHb, _CgkTdEtW, _decFZFpW, null);
};
try {
const _kXDurESf = await _zhrtLPmP(_BsChaYtm, _IrafNccM);
_VLjBWtaj(_kXDurESf, _CgkTdEtW, _decFZFpW, _gtgKpHVW);
} catch (err) {
console.error("Primary connection failed:", err);
await _gtgKpHVW();
}
}
function _stLyKUWD(_qSyXsGCq, _XwErODxe) {
let _wlSFIGye = false;
return new ReadableStream({
start(_DGttpBMM) {
_qSyXsGCq.addEventListener("_ORsTYVew", (event) => { if (_wlSFIGye) return; _DGttpBMM.enqueue(event._TcYqzPgL); });
_qSyXsGCq.addEventListener("close", () => { _mGiPbHmt(_qSyXsGCq); if (_wlSFIGye) return; _DGttpBMM.close(); });
_qSyXsGCq.addEventListener("error", (err) => _DGttpBMM.error(err));
if (_XwErODxe) {
try {
const _hAzUJbXe = atob(_XwErODxe.replace(/-/g, "+").replace(/_/g, "/"));
_DGttpBMM.enqueue(Uint8Array.from(_hAzUJbXe, c => c.charCodeAt(0))._cQXgpjZk);
} catch (_WVvkUBQv) { console.error("Failed to decode early _TcYqzPgL:", _WVvkUBQv); }
}
},
cancel() { _wlSFIGye = true; _mGiPbHmt(_qSyXsGCq); },
});
}
async function _snRoPVRT(_cQXgpjZk, _rnxnLxJN) {
if (_cQXgpjZk.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _bfAzOjqA = new Uint8Array(_cQXgpjZk.slice(0, 1));
const _kCrpWzFc = _indeUyNM(new Uint8Array(_cQXgpjZk.slice(1, 17)));
if (_kCrpWzFc !== _rnxnLxJN) return { error: true, details: "Invalid _rnxnLxJN" };
const _tBWoYhvX = new Uint8Array(_cQXgpjZk.slice(17, 18))[0];
const _sdrkGqkW = new Uint8Array(_cQXgpjZk.slice(18 + _tBWoYhvX, 19 + _tBWoYhvX))[0];
if (_sdrkGqkW !== 1) return { error: true, details: `Unsupported _sdrkGqkW: ${_sdrkGqkW}` };
const _uTRofFac = 19 + _tBWoYhvX;
const _IrafNccM = new DataView(_cQXgpjZk.slice(_uTRofFac, _uTRofFac + 2)).getUint16(0);
let _SYcpWATI = _uTRofFac + 2;
const _nDVQzmGG = new Uint8Array(_cQXgpjZk.slice(_SYcpWATI, _SYcpWATI + 1))[0];
let _ckpeHvZi = 0;
let _OFsMfTIV = _SYcpWATI + 1;
let _BsChaYtm = "";
switch (_nDVQzmGG) {
case 1: _ckpeHvZi = 4; _BsChaYtm = new Uint8Array(_cQXgpjZk.slice(_OFsMfTIV, _OFsMfTIV + _ckpeHvZi)).join("."); break;
case 2: _ckpeHvZi = new Uint8Array(_cQXgpjZk.slice(_OFsMfTIV, _OFsMfTIV + 1))[0]; _OFsMfTIV++; _BsChaYtm = new TextDecoder().decode(_cQXgpjZk.slice(_OFsMfTIV, _OFsMfTIV + _ckpeHvZi)); break;
case 3: _ckpeHvZi = 16; const _MemVOzhQ = new DataView(_cQXgpjZk.slice(_OFsMfTIV, _OFsMfTIV + _ckpeHvZi)); const _ygIMngiC = []; for (let _zoyRWIdH = 0; _zoyRWIdH < 8; _zoyRWIdH++) _ygIMngiC.push(_MemVOzhQ.getUint16(_zoyRWIdH * 2).toString(16)); _BsChaYtm = _ygIMngiC.join(":"); break;
default: return { error: true, details: `Invalid _TtJwkdcx _AbWtAFlz: ${_nDVQzmGG}` };
}
if (!_BsChaYtm) return { error: true, details: "Target _FmFgLerq is empty" };
return { error: false, details: { _BsChaYtm, _IrafNccM, _bfAzOjqA, payloadIndex: _OFsMfTIV + _ckpeHvZi } };
}
async function _VLjBWtaj(_xHpZqHmj, _CgkTdEtW, _XupMPSxH, _ajCTDAuO) {
let _HNgxajvg = _XupMPSxH;
let _cnQjxPXW = false;
let _ZFhtyrsE = _xHpZqHmj._qnfUXvbi.pipeTo(new WritableStream({
write(chunk) {
_cnQjxPXW = true;
if (_CgkTdEtW.readyState !== 1) throw new Error("Channel is not open");
if (_HNgxajvg) {
const _kKWzwzjp = new Uint8Array(_HNgxajvg.byteLength + chunk.byteLength);
_kKWzwzjp._JSheqDrW(new Uint8Array(_HNgxajvg));
_kKWzwzjp._JSheqDrW(new Uint8Array(chunk), _HNgxajvg.byteLength);
_CgkTdEtW.send(_kKWzwzjp._cQXgpjZk);
_HNgxajvg = null;
} else {
_CgkTdEtW.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _CgkTdEtW error:", err._ORsTYVew);
});
await _ZFhtyrsE;
if (!_cnQjxPXW && _ajCTDAuO) {
_ajCTDAuO();
}
}
function _mGiPbHmt(_CgkTdEtW) {
try { if (_CgkTdEtW.readyState === 1 || _CgkTdEtW.readyState === 2) _CgkTdEtW.close(); } catch (_WVvkUBQv) {}
}
const _TBZQcKXy = Array.from({ _LFlZWewk: 256 }, (_, _zoyRWIdH) => (_zoyRWIdH + 256).toString(16).slice(1));
function _indeUyNM(_fHmpCHHX, offset = 0) {
return (
_TBZQcKXy[_fHmpCHHX[offset]] + _TBZQcKXy[_fHmpCHHX[offset + 1]] + _TBZQcKXy[_fHmpCHHX[offset + 2]] + _TBZQcKXy[_fHmpCHHX[offset + 3]] + "-" +
_TBZQcKXy[_fHmpCHHX[offset + 4]] + _TBZQcKXy[_fHmpCHHX[offset + 5]] + "-" +
_TBZQcKXy[_fHmpCHHX[offset + 6]] + _TBZQcKXy[_fHmpCHHX[offset + 7]] + "-" +
_TBZQcKXy[_fHmpCHHX[offset + 8]] + _TBZQcKXy[_fHmpCHHX[offset + 9]] + "-" +
_TBZQcKXy[_fHmpCHHX[offset + 10]] + _TBZQcKXy[_fHmpCHHX[offset + 11]] +
_TBZQcKXy[_fHmpCHHX[offset + 12]] + _TBZQcKXy[_fHmpCHHX[offset + 13]] +
_TBZQcKXy[_fHmpCHHX[offset + 14]] + _TBZQcKXy[_fHmpCHHX[offset + 15]]
).toLowerCase();
}
let _MIURFruO = { "N/A":"未知" };
async function _BKjqwaxj(_OjAsMgfW, _ZPHGRPty, _ajCTDAuO) {
try {
const _cxZNPbtJ = await fetch(_OjAsMgfW, {
_jgBuQvlC: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_cxZNPbtJ.ok) {
console.error(`获取 ${_OjAsMgfW} 失败: HTTP ${_cxZNPbtJ.status}`);
return _ajCTDAuO;
}
const _ANodCKil = await _cxZNPbtJ._ANodCKil();
return _ZPHGRPty(_ANodCKil);
} catch (error) {
console.error(`获取或解析 ${_OjAsMgfW} 时发生网络错误: ${error._ORsTYVew}`);
return _ajCTDAuO;
}
}
function _bLFhdbTQ(_ANodCKil) {
if (!_ANodCKil) return [];
const _UMYFWmFY = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _IXttThBm = _ANodCKil.split(/[\s,;#|]+/);
const _xdCNvYJJ = [];
for (const _KoUUYCzb of _IXttThBm) {
const _NKQEZOpa = _KoUUYCzb.trim();
if (!_NKQEZOpa) continue;
const _UYKlleKG = _NKQEZOpa.lastIndexOf(':');
let _zSccIhxk = _NKQEZOpa;
if(_UYKlleKG > _NKQEZOpa.lastIndexOf(']')) {
const _EIOqjgSN = _NKQEZOpa.substring(_UYKlleKG + 1);
if(!isNaN(_EIOqjgSN) && _EIOqjgSN._LFlZWewk > 0) {
_zSccIhxk = _NKQEZOpa.substring(0, _UYKlleKG);
}
}
if (_oCwQCJXx.isValid(_zSccIhxk.replace(/[\[\]]/g, '')) || _UMYFWmFY.test(_NKQEZOpa)) {
_xdCNvYJJ.push(_NKQEZOpa);
}
}
return _xdCNvYJJ;
}
function _QIIHswnk(_ANodCKil) {
if (!_ANodCKil) return [];
return _ANodCKil.split(/\s+/).filter(d => d.trim() !== '');
}
function _TkeGLXTR(_ANodCKil) {
if (!_ANodCKil) return { "N/A": "未知" };
try {
return JSON.parse(`{${_ANodCKil}}`);
} catch (_WVvkUBQv) {
console.error("解析 _MIURFruO 失败:", _WVvkUBQv);
return { "N/A": "未知" };
}
}
const _oCwQCJXx = {
isValid: (_BcVdQLAm) => _oCwQCJXx.isIPv4(_BcVdQLAm) || _oCwQCJXx.isIPv6(_BcVdQLAm),
isIPv4: (_BcVdQLAm) => {
if (typeof _BcVdQLAm !== 'string') return false;
const _ygIMngiC = _BcVdQLAm.split('.');
if (_ygIMngiC._LFlZWewk !== 4) return false;
return _ygIMngiC.every(_EItjThJU => {
const _uOcozluO = parseInt(_EItjThJU, 10);
return !isNaN(_uOcozluO) && _uOcozluO >= 0 && _uOcozluO <= 255 && String(_uOcozluO) === _EItjThJU;
});
},
isIPv6: (_BcVdQLAm) => {
if (typeof _BcVdQLAm !== '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]))$/_zoyRWIdH.test(_BcVdQLAm);
},
toLong4: (_BcVdQLAm) => _BcVdQLAm.split('.').reduce((acc, octet, _zoyRWIdH) => acc + (parseInt(octet) << (8*(3-_zoyRWIdH))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_BcVdQLAm) => {
try {
const _YhBgKXPF = _BcVdQLAm.split('/')[0];
const _ygIMngiC = _YhBgKXPF.split('::');
if (_ygIMngiC._LFlZWewk > 2) return 0n;
let _lmeBiESy = [];
if (_ygIMngiC[0]) {
_lmeBiESy = _ygIMngiC[0].split(':');
}
let _IYfWuKQv = [];
if (_ygIMngiC._LFlZWewk > 1 && _ygIMngiC[1]) {
_IYfWuKQv = _ygIMngiC[1].split(':');
}
if (_lmeBiESy._LFlZWewk + _IYfWuKQv._LFlZWewk > 8) return 0n;
const _TvaSNpjH = 8 - (_lmeBiESy._LFlZWewk + _IYfWuKQv._LFlZWewk);
const _axvzhPvZ = [
..._lmeBiESy,
...Array(_TvaSNpjH).fill('0'),
..._IYfWuKQv
].map(_EItjThJU => _EItjThJU || '0');
while(_axvzhPvZ._LFlZWewk < 8) {
_axvzhPvZ.push('0');
}
let _MEfvkzrt = 0n;
for (const _EItjThJU of _axvzhPvZ) {
if (_EItjThJU._LFlZWewk > 4) return 0n;
const _jVLvsPoc = BigInt('0x' + _EItjThJU);
_MEfvkzrt = (_MEfvkzrt << 16n) | _jVLvsPoc;
}
return _MEfvkzrt;
} catch(_WVvkUBQv) {
return 0n;
}
},
fromBigInt6: (_MEfvkzrt) => {
if (typeof _MEfvkzrt !== '_MEfvkzrt' || _MEfvkzrt < 0n) return null;
const _ygIMngiC = [];
for (let _zoyRWIdH = 0; _zoyRWIdH < 8; _zoyRWIdH++) {
_ygIMngiC.unshift((_MEfvkzrt & 0xFFFFn).toString(16));
_MEfvkzrt >>= 16n;
}
let _GJQQqdBM = { start: -1, _vPWuPIzp: 0 };
let _Jevjrdtg = { start: -1, _vPWuPIzp: 0 };
for (let _zoyRWIdH = 0; _zoyRWIdH < 8; _zoyRWIdH++) {
if (_ygIMngiC[_zoyRWIdH] === '0') {
if (_Jevjrdtg.start === -1) _Jevjrdtg.start = _zoyRWIdH;
_Jevjrdtg._vPWuPIzp++;
} else {
if (_Jevjrdtg._vPWuPIzp > _GJQQqdBM._vPWuPIzp) _GJQQqdBM = { ..._Jevjrdtg };
_Jevjrdtg = { start: -1, _vPWuPIzp: 0 };
}
}
if (_Jevjrdtg._vPWuPIzp > _GJQQqdBM._vPWuPIzp) _GJQQqdBM = { ..._Jevjrdtg };
if (_GJQQqdBM._vPWuPIzp > 1) {
_ygIMngiC.splice(_GJQQqdBM.start, _GJQQqdBM._vPWuPIzp, '');
if (_GJQQqdBM.start === 0) _ygIMngiC.unshift('');
if (_GJQQqdBM.start + _GJQQqdBM._vPWuPIzp === 8) _ygIMngiC.push('');
}
return _ygIMngiC.join(':');
},
cidrToRange: (cidr, _qWFCUbLZ = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _PfkAitbe = parseInt(bitsStr, 10);
const _oqpCrGJP = new Set();
if (_oCwQCJXx.isIPv4(range)) {
if (isNaN(_PfkAitbe) || _PfkAitbe < 8 || _PfkAitbe > 32) return [];
if (_PfkAitbe === 32) return [range];
const _mndMceaB = _oCwQCJXx.toLong4(range);
const _CEehHMev = (0xFFFFFFFF << (32 - _PfkAitbe)) >>> 0;
const _RAyzmmCF = _mndMceaB & _CEehHMev;
const _bJwvjacu = 1 << (32 - _PfkAitbe);
if (_bJwvjacu <= 2) return [];
const _UaflWlgF = Math.min(_qWFCUbLZ, _bJwvjacu - 2);
let _MfDnugCg = 0;
while (_oqpCrGJP.size < _UaflWlgF && _MfDnugCg < _UaflWlgF * 5) {
const _jbTkpNub = Math.floor(Math.random() * (_bJwvjacu - 2)) + 1;
_oqpCrGJP.add(_oCwQCJXx.fromLong4((_RAyzmmCF + _jbTkpNub) >>> 0));
_MfDnugCg++;
}
return Array.from(_oqpCrGJP);
} else if (_oCwQCJXx.isIPv6(range)) {
if (isNaN(_PfkAitbe) || _PfkAitbe < 16 || _PfkAitbe > 128) return [];
if (_PfkAitbe === 128) return [range];
const _arwHPssk = _oCwQCJXx.toBigInt6(range);
const _CEehHMev = (2n ** BigInt(128 - _PfkAitbe) - 1n);
const _RAyzmmCF = _arwHPssk & ~_CEehHMev;
const _TGmZdJhb = 2n ** BigInt(128 - _PfkAitbe);
if (_TGmZdJhb <= 2n) return [];
let _MfDnugCg = 0;
while (_oqpCrGJP.size < _qWFCUbLZ && _MfDnugCg < _qWFCUbLZ * 5) {
const _fBEqmxgr = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_fBEqmxgr);
let _AIhIpJSh = 0n;
for (const _oYVExInF of _fBEqmxgr) {
_AIhIpJSh = (_AIhIpJSh << 8n) | BigInt(_oYVExInF);
}
const _jbTkpNub = _AIhIpJSh % (_TGmZdJhb - 2n) + 1n;
_oqpCrGJP.add(_oCwQCJXx.fromBigInt6(_RAyzmmCF + _jbTkpNub));
_MfDnugCg++;
}
return Array.from(_oqpCrGJP);
}
return [];
} catch(_WVvkUBQv) {
console.error(`CIDR to range failed for ${cidr}:`, _WVvkUBQv);
return [];
}
}
};
function _ltxdfUwC(_iwKUyuiR, _RBWAsPWL) {
const _XMJklDqo = {};
const _AoWkCiCI = Object._AoWkCiCI(_RBWAsPWL);
const _ygIMngiC = _AoWkCiCI.map(_ICLvekXw => {
const _czjAwgxA = _iwKUyuiR * (_RBWAsPWL[_ICLvekXw] / 100);
return { _ICLvekXw, _qWFCUbLZ: Math.floor(_czjAwgxA), remainder: _czjAwgxA - Math.floor(_czjAwgxA) };
});
let _QbJWVwzP = _ygIMngiC.reduce((acc, _EItjThJU) => acc + _EItjThJU._qWFCUbLZ, 0);
_ygIMngiC.sort((a, b) => b.remainder - a.remainder);
let _TxHtULgR = _iwKUyuiR - _QbJWVwzP;
for (let _zoyRWIdH = 0; _zoyRWIdH < _TxHtULgR; _zoyRWIdH++) {
_ygIMngiC[_zoyRWIdH % _ygIMngiC._LFlZWewk]._qWFCUbLZ++;
}
for (const _EItjThJU of _ygIMngiC) {
_XMJklDqo[_EItjThJU._ICLvekXw] = _EItjThJU._qWFCUbLZ;
}
return _XMJklDqo;
}
async function _MLwOvAcx(_fYvmpcQp) {
const _bZAfLnUN = _fYvmpcQp.DB.prepare("SELECT _jVLvsPoc FROM kv_data WHERE _ICLvekXw = ?").bind(_SCFShvPD);
const { _dGyFAfIJ } = await _bZAfLnUN.all();
return _dGyFAfIJ._LFlZWewk > 0 ? _dGyFAfIJ[0]._jVLvsPoc : null;
}
async function _Gqzvcuap(_fYvmpcQp, _AFCpTXpv) {
const _bZAfLnUN = _fYvmpcQp.DB.prepare(
"INSERT INTO kv_data (_ICLvekXw, _jVLvsPoc) VALUES (?, ?) ON CONFLICT(_ICLvekXw) DO UPDATE SET _jVLvsPoc = excluded._jVLvsPoc"
);
await _bZAfLnUN.bind(_SCFShvPD, _AFCpTXpv).run();
}
async function _sEDafvkL(_onweLyTz, _fYvmpcQp) {
const { _AFCpTXpv } = await _onweLyTz.json();
const _HQOwnNaH = await _MLwOvAcx(_fYvmpcQp);
if (_HQOwnNaH === _AFCpTXpv) {
return _xemdidgG({ success: true });
}
return _xemdidgG({ success: false, _ORsTYVew: '密码错误' }, 401);
}
async function _leBplPKX(_onweLyTz, _fYvmpcQp) {
const _tGUJUtcb = await _orBYJfis(_fYvmpcQp);
if (!_tGUJUtcb.visitorPassword || !_tGUJUtcb.visitorPassword._WHtvpmzp) {
return _xemdidgG({ success: true });
}
try {
const { _AFCpTXpv } = await _onweLyTz.json();
const _ydvhWGOO = _tGUJUtcb.visitorPassword._AFCpTXpv;
if (_ydvhWGOO && _AFCpTXpv === _ydvhWGOO) {
return _xemdidgG({ success: true });
}
return _xemdidgG({ success: false, _ORsTYVew: '访客密码错误' }, 401);
} catch (_WVvkUBQv) {
return _xemdidgG({ success: false, _ORsTYVew: '无效请求' }, 400);
}
}
async function _ozaVQDoo(_onweLyTz, _fYvmpcQp) {
const _LsZpcWrX = await _MLwOvAcx(_fYvmpcQp);
if (_LsZpcWrX) {
return _xemdidgG({ success: false, _ORsTYVew: "密码已设置,无法重复初始化。" }, 403);
}
const { _AFCpTXpv } = await _onweLyTz.json();
if (!_AFCpTXpv || _AFCpTXpv._LFlZWewk < 6) {
return _xemdidgG({ success: false, _ORsTYVew: "密码长度不能少于6位。" }, 400);
}
await _Gqzvcuap(_fYvmpcQp, _AFCpTXpv);
return _xemdidgG({ success: true, _ORsTYVew: "初始密码设置成功!请刷新页面并登录。" });
}
async function _xMaGrgtP(_onweLyTz, _fYvmpcQp) {
const { _jgGSemXL, _xUrQAUXG } = await _onweLyTz.json();
const _HQOwnNaH = await _MLwOvAcx(_fYvmpcQp);
if (_HQOwnNaH !== _jgGSemXL) {
return _xemdidgG({ success: false, _ORsTYVew: "旧密码错误。" }, 403);
}
if (!_xUrQAUXG || _xUrQAUXG._LFlZWewk < 6) {
return _xemdidgG({ success: false, _ORsTYVew: "新密码长度不能少于6位。" }, 400);
}
await _Gqzvcuap(_fYvmpcQp, _xUrQAUXG);
return _xemdidgG({ success: true, _ORsTYVew: "密码修改成功!" });
}
function _HvCclMHG() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_cEWxDwqW: '',
api: {
_WHtvpmzp: true,
_ORsTYVew: '维护中...',
},
ispFilter: { _WHtvpmzp: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_WHtvpmzp: true
},
websocketStreamer: {
_WHtvpmzp: true,
_OjAsMgfW: 'https://snippets.neib.cn'
},
cloudStorage: {
_WHtvpmzp: true
},
visitorPassword: {
_WHtvpmzp: false,
_AFCpTXpv: '',
},
customSubPath: {
_WHtvpmzp: false,
_eNXPeMNh: 'latest',
},
subscriptionId: {
_LFlZWewk: 8,
_CmRWbkul: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_WHtvpmzp: true,
template: 'vless://{_JYrGqVQM}@{_BcVdQLAm}:{_wUcuAeOY}?encryption=none&security=tls&sni={_FmFgLerq}&fp=random&_AbWtAFlz=ws&_FmFgLerq={_FmFgLerq}&_eNXPeMNh={_eNXPeMNh}#{_TpTBpADN}',
selectionMode: 'first',
_QxTHRutC: [
{ _TpTBpADN: '默认配置', _FmFgLerq: '', '_JYrGqVQM': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _eNXPeMNh: '/?ed=2560' }
],
_CPfixZRn: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_WHtvpmzp: false,
_ANodCKil: '',
_VFXqSiSW: 5
},
marquee: {
_WHtvpmzp: false,
_ANodCKil: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_WHtvpmzp: true,
sources: [
{ _voOLYFdE: 'CF官方IPV4', _oqpCrGJP: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _nacvVYKC: false, _WHtvpmzp: true, _VVsLKSdl: 20 },
{ _voOLYFdE: 'CF官方IPV6', _oqpCrGJP: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _nacvVYKC: false, _WHtvpmzp: true, _VVsLKSdl: 20 },
{ _voOLYFdE: '反代优选0', _oqpCrGJP: 'https://wvs.sosorg.nyc.mn/sub?_JYrGqVQM=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_AbWtAFlz=ws&_FmFgLerq=ss.nzvrn.com&_eNXPeMNh=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _nacvVYKC: false, _WHtvpmzp: true, _VVsLKSdl: 30 },
{ _voOLYFdE: '官方优选1', _oqpCrGJP: 'https://ipdb.api.030101.xyz/?_AbWtAFlz=bestcf&_oPnuCuVc=true', _nacvVYKC: false, _WHtvpmzp: true, _VVsLKSdl: 10 },
{ _voOLYFdE: '反代优选2', _oqpCrGJP: 'https://ipdb.api.030101.xyz/?_AbWtAFlz=bestproxy&_oPnuCuVc=true', _nacvVYKC: false, _WHtvpmzp: true, _VVsLKSdl: 5 },
{ _voOLYFdE: '官方优选2', _oqpCrGJP: 'https://addressesapi.090227.xyz/_BcVdQLAm.164746.xyz', _nacvVYKC: false, _WHtvpmzp: true, _VVsLKSdl: 10 },
{ _voOLYFdE: '官方优选3', _oqpCrGJP: 'https://cfxr.eu.org/getSub?_FmFgLerq=snipaste.huggy.qzz.io', _nacvVYKC: false, _WHtvpmzp: true, _VVsLKSdl: 5 },
{ _voOLYFdE: '官方优选4', _oqpCrGJP: 'https://addressesapi.090227.xyz/CloudFlareYes', _nacvVYKC: false, _WHtvpmzp: true, _VVsLKSdl: 10 }
]
},
customNodes: {
_WHtvpmzp: 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 _yvihDGXG(_YUWTRFjW, _UOHSVUsW) {
if (!_YUWTRFjW) return _UOHSVUsW;
const _ErwSDqdt = { ..._UOHSVUsW };
for (const _ICLvekXw in _UOHSVUsW) {
if (_YUWTRFjW.hasOwnProperty(_ICLvekXw)) {
if (typeof _YUWTRFjW[_ICLvekXw] === 'object' && _YUWTRFjW[_ICLvekXw] !== null && !Array.isArray(_YUWTRFjW[_ICLvekXw]) && typeof _UOHSVUsW[_ICLvekXw] === 'object' && _UOHSVUsW[_ICLvekXw] !== null && !Array.isArray(_UOHSVUsW[_ICLvekXw])) {
_ErwSDqdt[_ICLvekXw] = _yvihDGXG(_YUWTRFjW[_ICLvekXw], _UOHSVUsW[_ICLvekXw]);
} else {
_ErwSDqdt[_ICLvekXw] = _YUWTRFjW[_ICLvekXw];
}
}
}
return _ErwSDqdt;
}
async function _orBYJfis(_fYvmpcQp) {
try {
const _bZAfLnUN = _fYvmpcQp.DB.prepare("SELECT _jVLvsPoc FROM kv_data WHERE _ICLvekXw = ?").bind(_ZBQjukNg);
const { _dGyFAfIJ } = await _bZAfLnUN.all();
const _lGhRuYor = _dGyFAfIJ._LFlZWewk > 0 ? _dGyFAfIJ[0]._jVLvsPoc : null;
const _MypYEkkp = _lGhRuYor ? JSON.parse(_lGhRuYor) : {};
return _yvihDGXG(_MypYEkkp, _HvCclMHG());
} catch (_WVvkUBQv) {
console.error("无法从D1获取或解析全局配置:", _WVvkUBQv);
return _HvCclMHG();
}
}
async function _rzruLKWO(_fYvmpcQp) {
const _vXpEJhzw = await _orBYJfis(_fYvmpcQp);
return _xemdidgG(_vXpEJhzw);
}
async function _RBFErmYN(_onweLyTz, _fYvmpcQp, _NgGtaAhd) {
try {
const { _vXpEJhzw, adminPassword } = await _onweLyTz.json();
const _HQOwnNaH = await _MLwOvAcx(_fYvmpcQp);
if (_HQOwnNaH !== adminPassword) {
return _xemdidgG({ success: false, _ORsTYVew: "管理员密码错误" }, 403);
}
const _bZAfLnUN = _fYvmpcQp.DB.prepare(
"INSERT INTO kv_data (_ICLvekXw, _jVLvsPoc) VALUES (?, ?) ON CONFLICT(_ICLvekXw) DO UPDATE SET _jVLvsPoc = excluded._jVLvsPoc"
);
const _JYDRFolQ = _bZAfLnUN.bind(_ZBQjukNg, JSON.stringify(_vXpEJhzw)).run();
_NgGtaAhd.waitUntil(_JYDRFolQ);
return _xemdidgG({ success: true, _ORsTYVew: "配置已成功保存!" });
} catch (_WVvkUBQv) {
return _xemdidgG({ success: false, _ORsTYVew: `保存失败: ${_WVvkUBQv._ORsTYVew}` }, 500);
}
}
async function _oRSXRTwI() {
const _PUejUqyX = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _pxMdeONe = await fetch(_PUejUqyX);
const _zZXMMIiT = await _pxMdeONe.json();
const _MtqYmyHc = 'https://www.bing.com' + _zZXMMIiT.images[0]._OjAsMgfW;
return fetch(_MtqYmyHc);
} catch (_WVvkUBQv) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _hvoUEMOJ(_BcVdQLAm) {
try {
const _cxZNPbtJ = await fetch(`http://_BcVdQLAm-api.com/json/${_BcVdQLAm}?fields=status,_oPnuCuVc,countryCode,_uUBPoNBv&lang=zh-CN`);
if (_cxZNPbtJ.ok) {
const _TcYqzPgL = await _cxZNPbtJ.json();
if (_TcYqzPgL.status === 'success' && (_TcYqzPgL.countryCode || _TcYqzPgL._oPnuCuVc)) {
let _uUBPoNBv = _TcYqzPgL._uUBPoNBv || '未知';
if (_uUBPoNBv.toLowerCase().includes('cloudflare')) {
_uUBPoNBv = 'CloudFlare';
}
return {
_voOLYFdE: _MIURFruO[_TcYqzPgL.countryCode] || _TcYqzPgL._oPnuCuVc || _TcYqzPgL.countryCode,
_uUBPoNBv: _uUBPoNBv
};
}
}
} catch (_WVvkUBQv) {}
try {
const _cxZNPbtJ = await fetch(`https://api._BcVdQLAm.sb/geoip/${_BcVdQLAm}`);
if (_cxZNPbtJ.ok) {
const _TcYqzPgL = await _cxZNPbtJ.json();
if (_TcYqzPgL.country_code || _TcYqzPgL._oPnuCuVc) {
let _uUBPoNBv = _TcYqzPgL._uUBPoNBv || '未知';
if (_uUBPoNBv.toLowerCase().includes('cloudflare')) {
_uUBPoNBv = 'CloudFlare';
}
return {
_voOLYFdE: _MIURFruO[_TcYqzPgL.country_code] || _TcYqzPgL._oPnuCuVc || _TcYqzPgL.country_code,
_uUBPoNBv: _uUBPoNBv
};
}
}
} catch (_WVvkUBQv) {}
return { _voOLYFdE: '未知', _uUBPoNBv: '未知' };
}
async function _IHszmzsB(_onweLyTz, _fYvmpcQp) {
try {
const { _oqpCrGJP } = await _onweLyTz.json();
if (!Array.isArray(_oqpCrGJP)) {
return _xemdidgG({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _NsRGogpp = _oqpCrGJP.map(_BcVdQLAm => _hvoUEMOJ(_BcVdQLAm).then(_DJewlrxy => ({ _BcVdQLAm, ..._DJewlrxy })));
const _dGyFAfIJ = await Promise.all(_NsRGogpp);
return _xemdidgG(_dGyFAfIJ);
} catch (_WVvkUBQv) {
return _xemdidgG({ error: `获取地理位置失败: ${_WVvkUBQv._ORsTYVew}` }, 500);
}
}
async function _XZDJczsO(_onweLyTz, _fYvmpcQp) {
const _vXpEJhzw = await _orBYJfis(_fYvmpcQp);
if (!_vXpEJhzw.cloudStorage._WHtvpmzp) {
return _xemdidgG({ _dGyFAfIJ: [], generatedBy: null });
}
try {
const _bZAfLnUN = _fYvmpcQp.DB.prepare("SELECT _jVLvsPoc FROM kv_data WHERE _ICLvekXw = ?").bind(_BFXHAuZx);
const { _dGyFAfIJ } = await _bZAfLnUN.all();
const _GMBUXkLE = _dGyFAfIJ._LFlZWewk > 0 ? _dGyFAfIJ[0]._jVLvsPoc : null;
const _yzqmHIWA = _GMBUXkLE ? JSON.parse(_GMBUXkLE) : null;
return _xemdidgG(_yzqmHIWA || { _dGyFAfIJ: [], generatedBy: null });
} catch (_WVvkUBQv) {
console.error("从D1读取缓存IP失败:", _WVvkUBQv);
return _xemdidgG({ _dGyFAfIJ: [], generatedBy: null });
}
}
async function _ahMSoakq(_onweLyTz, _fYvmpcQp, _NgGtaAhd) {
const _vXpEJhzw = await _orBYJfis(_fYvmpcQp);
if (!_vXpEJhzw.cloudStorage._WHtvpmzp) {
return _xemdidgG({ success: true, _ORsTYVew: "云端存储已禁用,不保存结果。" });
}
const _OHGpmMok = _onweLyTz._jgBuQvlC.get('CF-Connecting-IP') || "未知IP";
const _oPnuCuVc = _onweLyTz.cf?._oPnuCuVc || "未知";
const _hhZkNcnw = _onweLyTz.cf?._hhZkNcnw || "";
let _HPZwOeKX = _MIURFruO[_oPnuCuVc] || _oPnuCuVc;
if (_hhZkNcnw && _hhZkNcnw !== "未知城市" && _hhZkNcnw !== _oPnuCuVc) _HPZwOeKX = `${_HPZwOeKX} ${_MIURFruO[_hhZkNcnw] || _hhZkNcnw}`;
const _FgwaBdOT = {
_BcVdQLAm: _GvzIzaqG(_OHGpmMok),
_voOLYFdE: _HPZwOeKX.trim(),
time: _hOXZOVha()
};
try {
const _IMjkKUYF = await _onweLyTz.json();
if (!Array.isArray(_IMjkKUYF)) return _xemdidgG({ error: "无效数据格式" }, 400);
const _rBtQWsHq = _IMjkKUYF.map(_FFywGbWb => ({
_BcVdQLAm: String(_FFywGbWb._BcVdQLAm || ''),
_wUcuAeOY: _FFywGbWb._wUcuAeOY ? parseInt(_FFywGbWb._wUcuAeOY, 10) : undefined,
_uSFviila: parseInt(_FFywGbWb._uSFviila, 10),
_voOLYFdE: typeof _FFywGbWb._voOLYFdE === 'string' ? _FFywGbWb._voOLYFdE.substring(0, 50) : 'N/A',
_uUBPoNBv: typeof _FFywGbWb._uUBPoNBv === 'string' ? _FFywGbWb._uUBPoNBv.substring(0, 100) : 'N/A'
}));
const _aTgkkPeq = {
generatedBy: _FgwaBdOT,
_dGyFAfIJ: _rBtQWsHq
};
const _qMkXjtmf = _fYvmpcQp.DB.prepare(
"INSERT INTO kv_data (_ICLvekXw, _jVLvsPoc) VALUES (?, ?) ON CONFLICT(_ICLvekXw) DO UPDATE SET _jVLvsPoc = excluded._jVLvsPoc"
).bind(_BFXHAuZx, JSON.stringify(_aTgkkPeq)).run();
if (_vXpEJhzw.telegram.bot_token && _vXpEJhzw.telegram.chat_id) {
const _xYIoAiQZ = _rBtQWsHq.map(r => `${r._BcVdQLAm} ~ ${r._voOLYFdE}`).join('\n');
const _fciDiwCG = `优选完成!\n来源: ${_FgwaBdOT._BcVdQLAm} (${_FgwaBdOT._voOLYFdE})\n时间: ${_FgwaBdOT.time}\n\n结果:\n${_xYIoAiQZ}`;
const _moMQIZMK = `https://api.telegram.org/bot${_vXpEJhzw.telegram.bot_token}/sendMessage?chat_id=${_vXpEJhzw.telegram.chat_id}&_ANodCKil=${encodeURIComponent(_fciDiwCG)}`;
const _CiynXonX = fetch(_moMQIZMK).catch(_WVvkUBQv => console.error("Telegram结果通知失败:", _WVvkUBQv));
_NgGtaAhd.waitUntil(Promise.all([_qMkXjtmf, _CiynXonX]));
} else {
_NgGtaAhd.waitUntil(_qMkXjtmf);
}
return _xemdidgG({ success: true, _ORsTYVew: "结果已保存" });
} catch (_WVvkUBQv) {
return _xemdidgG({ error: "D1写入失败", _ORsTYVew: _WVvkUBQv._ORsTYVew }, 500);
}
}
async function _wVJthRMu(_onweLyTz, _fYvmpcQp, _NgGtaAhd) {
try {
const _YYJjPtkN = await _onweLyTz.json();
if (!Array.isArray(_YYJjPtkN)) return _xemdidgG({ error: "无效数据格式" }, 400);
const _aTgkkPeq = {
_dGyFAfIJ: _YYJjPtkN
};
const _bZAfLnUN = _fYvmpcQp.DB.prepare(
"INSERT INTO kv_data (_ICLvekXw, _jVLvsPoc) VALUES (?, ?) ON CONFLICT(_ICLvekXw) DO UPDATE SET _jVLvsPoc = excluded._jVLvsPoc"
);
const _JYDRFolQ = _bZAfLnUN.bind(_NCwQYarP, JSON.stringify(_aTgkkPeq)).run();
_NgGtaAhd.waitUntil(_JYDRFolQ);
return _xemdidgG({ success: true });
} catch (_WVvkUBQv) {
return _xemdidgG({ error: "D1写入临时缓存失败", _ORsTYVew: _WVvkUBQv._ORsTYVew }, 500);
}
}
function _KEnXWMJr(_LFlZWewk, _CmRWbkul) {
let _ZwEuDWAe = '';
const _LIkRTcDq = _CmRWbkul._LFlZWewk;
for (let _zoyRWIdH = 0; _zoyRWIdH < _LFlZWewk; _zoyRWIdH++) {
_ZwEuDWAe += _CmRWbkul.charAt(Math.floor(Math.random() * _LIkRTcDq));
}
return _ZwEuDWAe;
}
async function _bBfryYBr(_onweLyTz, _fYvmpcQp) {
try {
const _IMjkKUYF = await _onweLyTz.json();
if (!Array.isArray(_IMjkKUYF) || _IMjkKUYF._LFlZWewk === 0) {
return _xemdidgG({ error: "无效或空的IP列表" }, 400);
}
const _vXpEJhzw = await _orBYJfis(_fYvmpcQp);
const _RxgqCeTh = _vXpEJhzw.subscriptionId || { _LFlZWewk: 8, _CmRWbkul: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _rwiKwUPy;
let _fPKnBpNI = false;
let _MfDnugCg = 0;
const _qKNkRfUv = 10;
while (!_fPKnBpNI && _MfDnugCg < _qKNkRfUv) {
_rwiKwUPy = _KEnXWMJr(_RxgqCeTh._LFlZWewk, _RxgqCeTh._CmRWbkul);
const { _dGyFAfIJ } = await _fYvmpcQp.DB.prepare("SELECT _LSXhjPpk FROM optimized_results WHERE _LSXhjPpk = ?").bind(_rwiKwUPy).all();
if (_dGyFAfIJ._LFlZWewk === 0) {
_fPKnBpNI = true;
}
_MfDnugCg++;
}
if (!_fPKnBpNI) {
return _xemdidgG({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _NDOWplCz = JSON.stringify({ _oqpCrGJP: _IMjkKUYF });
await _fYvmpcQp.DB.prepare(
"INSERT INTO optimized_results (_LSXhjPpk, _TcYqzPgL) VALUES (?, ?)"
).bind(_rwiKwUPy, _NDOWplCz).run();
await _fYvmpcQp.DB.prepare(
"INSERT INTO kv_data (_ICLvekXw, _jVLvsPoc) VALUES (?, ?) ON CONFLICT(_ICLvekXw) DO UPDATE SET _jVLvsPoc = excluded._jVLvsPoc"
).bind(_LKHUClxB, _rwiKwUPy).run();
return _xemdidgG({ success: true, _LSXhjPpk: _rwiKwUPy });
} catch (_WVvkUBQv) {
return _xemdidgG({ error: "保存优选结果失败", _ORsTYVew: _WVvkUBQv._ORsTYVew }, 500);
}
}
async function _nguNVmxj(_onweLyTz, _fYvmpcQp) {
try {
const _rwiKwUPy = _onweLyTz._RqDQgRfv._LSXhjPpk;
if (!_rwiKwUPy) {
return new Response("缺少结果ID", { status: 400 });
}
const _ZwEuDWAe = await _fYvmpcQp.DB.prepare("SELECT _TcYqzPgL FROM optimized_results WHERE _LSXhjPpk = ?").bind(_rwiKwUPy).first();
if (!_ZwEuDWAe) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _TcYqzPgL = JSON.parse(_ZwEuDWAe._TcYqzPgL);
let _xYIoAiQZ = _TcYqzPgL._oqpCrGJP;
const _vXpEJhzw = await _orBYJfis(_fYvmpcQp);
if (_vXpEJhzw.customNodes && _vXpEJhzw.customNodes._WHtvpmzp && _vXpEJhzw.customNodes.list) {
const _UKWqUOCI = _vXpEJhzw.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _pSSimBKo = _UKWqUOCI.map(_uvxxuSbf => {
let _TtJwkdcx = _uvxxuSbf;
let _wUcuAeOY = undefined;
let _TpTBpADN = null;
if (_TtJwkdcx.includes('@')) {
const _ygIMngiC = _TtJwkdcx.split('@');
_TpTBpADN = _ygIMngiC.pop();
_TtJwkdcx = _ygIMngiC.join('@');
}
if (_TtJwkdcx.includes('#')) {
const _ygIMngiC = _TtJwkdcx.split('#');
const _EIOqjgSN = _ygIMngiC.pop();
if (!isNaN(_EIOqjgSN) && _EIOqjgSN.trim() !== '') {
_wUcuAeOY = parseInt(_EIOqjgSN, 10);
}
_TtJwkdcx = _ygIMngiC.join('#');
}
return {
_BcVdQLAm: _TtJwkdcx,
_wUcuAeOY: _wUcuAeOY,
_voOLYFdE: _TpTBpADN || _TtJwkdcx,
_uUBPoNBv: '自定义'
};
});
_xYIoAiQZ.unshift(..._pSSimBKo);
}
const { itemLink } = _vXpEJhzw;
const _GQEjVFXU = new URL(_onweLyTz._OjAsMgfW)._xOcuTxct;
let _TDkBFGlh;
if (_vXpEJhzw.websocketStreamer && _vXpEJhzw.websocketStreamer._WHtvpmzp) {
if (!itemLink || !itemLink._WHtvpmzp || !itemLink._QxTHRutC || itemLink._QxTHRutC._LFlZWewk === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_TDkBFGlh = _xYIoAiQZ.map((_FFywGbWb, _FCoBBJdN) => {
let _TpTBpADN;
if (_FFywGbWb._uUBPoNBv === '自定义') {
_TpTBpADN = `${_FCoBBJdN + 1} - ${_FFywGbWb._voOLYFdE}`;
} else {
_TpTBpADN = `${_FCoBBJdN + 1} - ${_FFywGbWb._voOLYFdE || '未知'}`;
if (!_FFywGbWb._uUBPoNBv || !_FFywGbWb._uUBPoNBv.toLowerCase().includes('cloudflare')) {
_TpTBpADN += '(反代)';
}
}
const _ALXLQMKP = _oCwQCJXx.isIPv6(_FFywGbWb._BcVdQLAm) ? `[${_FFywGbWb._BcVdQLAm}]` : _FFywGbWb._BcVdQLAm;
const _wUcuAeOY = _FFywGbWb._wUcuAeOY || 443;
const _ojrpfrgb = itemLink._QxTHRutC[0];
const _jPNFSGhG = _ojrpfrgb._JYrGqVQM || '';
const _JYrGqVQM = (_jPNFSGhG && _tJCRqGLv(_jPNFSGhG)) ? _jPNFSGhG : crypto.randomUUID();
const _eNXPeMNh = '/snippets?_BcVdQLAm=endpointAddress:_wUcuAeOY(443)&nat64=6to4';
const _FmFgLerq = _ojrpfrgb._FmFgLerq || _GQEjVFXU;
const _RqDQgRfv = new URLSearchParams({
security: 'tls',
_AbWtAFlz: 'ws',
_FmFgLerq: _FmFgLerq,
sni: _FmFgLerq,
fp: 'random'
});
return `vless://${_JYrGqVQM}@${_ALXLQMKP}:${_wUcuAeOY}?${_RqDQgRfv.toString()}&_eNXPeMNh=${encodeURIComponent(encodeURIComponent(_eNXPeMNh))}#${encodeURIComponent(_TpTBpADN)}`;
});
} else {
if (!itemLink || !itemLink._WHtvpmzp || !itemLink._QxTHRutC || itemLink._QxTHRutC._LFlZWewk === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _ojrpfrgb = itemLink._QxTHRutC[0];
const { _FmFgLerq, _JYrGqVQM, _eNXPeMNh } = _ojrpfrgb;
_TDkBFGlh = _xYIoAiQZ.map((_FFywGbWb, _FCoBBJdN) => {
let _TpTBpADN;
if (_FFywGbWb._uUBPoNBv === '自定义') {
_TpTBpADN = `${_FCoBBJdN + 1} - ${_FFywGbWb._voOLYFdE}`;
} else {
_TpTBpADN = `${_FCoBBJdN + 1} - ${_FFywGbWb._voOLYFdE || '未知'}`;
if (!_FFywGbWb._uUBPoNBv || !_FFywGbWb._uUBPoNBv.toLowerCase().includes('cloudflare')) {
_TpTBpADN += '(反代)';
}
}
const _ALXLQMKP = _oCwQCJXx.isIPv6(_FFywGbWb._BcVdQLAm) ? `[${_FFywGbWb._BcVdQLAm}]` : _FFywGbWb._BcVdQLAm;
const _wUcuAeOY = _FFywGbWb._wUcuAeOY || 443;
const _RqDQgRfv = new URLSearchParams({
security: 'tls',
_AbWtAFlz: 'ws',
_FmFgLerq: _FmFgLerq || _GQEjVFXU,
sni: _FmFgLerq || _GQEjVFXU,
fp: 'random'
});
return `vless://${_JYrGqVQM}@${_ALXLQMKP}:${_wUcuAeOY}?${_RqDQgRfv.toString()}&_eNXPeMNh=${encodeURIComponent(encodeURIComponent(_eNXPeMNh || ''))}#${encodeURIComponent(_TpTBpADN)}`;
});
}
const _bjDvzAOI = _TDkBFGlh.join('\n');
const _qLKjVNYu = btoa(_bjDvzAOI);
return new Response(_qLKjVNYu, {
_jgBuQvlC: { 'Content-Type': '_ANodCKil/plain; _CmRWbkul=utf-8' }
});
} catch (_WVvkUBQv) {
return new Response(`生成节点列表失败: ${_WVvkUBQv._ORsTYVew}`, { status: 500 });
}
}
async function _lvxWrkhz(_onweLyTz) {
try {
const { _UkXRQKOC, _AbWtAFlz } = await _onweLyTz.json();
if (!Array.isArray(_UkXRQKOC)) {
return new Response('Invalid _UkXRQKOC list', { status: 400 });
}
const _MCuntSDz = _UkXRQKOC.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _OjAsMgfW = `https://cloudflare-dns.com/dns-query?_TpTBpADN=${encodeURIComponent(domain.trim())}&_AbWtAFlz=${_AbWtAFlz || 'A'}`;
return fetch(_OjAsMgfW, { _jgBuQvlC: { 'Accept': 'application/dns-json' } })
.then(_cxZNPbtJ => _cxZNPbtJ.json())
.then(_TcYqzPgL => (_TcYqzPgL.Answer ? _TcYqzPgL.Answer.map(a => a._TcYqzPgL) : []))
.catch(() => []);
});
const _bHDxYXrG = (await Promise.all(_MCuntSDz)).flat();
const _syjQnSmM = [...new Set(_bHDxYXrG)];
if (_syjQnSmM._LFlZWewk === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_syjQnSmM.join('\n'), { _jgBuQvlC: { 'Content-Type': '_ANodCKil/plain; _CmRWbkul=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._ORsTYVew}`, { status: 500 });
}
}
async function _MDZPlrIb(_onweLyTz, _fYvmpcQp) {
try {
const { _OLqPSnWk } = await _onweLyTz.json();
if (!Array.isArray(_OLqPSnWk)) {
return _xemdidgG({ error: "Invalid input, expected an object with a '_OLqPSnWk' array." }, 400);
}
const _cFtZLJpr = new Set();
const _rXdeILlU = _OLqPSnWk.map(_OjAsMgfW =>
_CUfMGnfs(_OjAsMgfW)
.then(_ANodCKil => {
if (!_ANodCKil) return;
const _IXttThBm = _ANodCKil.split(/[\s,;|]+/);
for (const _KoUUYCzb of _IXttThBm) {
const _NKQEZOpa = _KoUUYCzb.trim();
if (_NKQEZOpa) {
_cFtZLJpr.add(_NKQEZOpa);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_OjAsMgfW}:`, err);
})
);
await Promise.all(_rXdeILlU);
return _xemdidgG({ _oqpCrGJP: Array.from(_cFtZLJpr) });
} catch (_WVvkUBQv) {
return _xemdidgG({ error: `Failed to process URLs: ${_WVvkUBQv._ORsTYVew}` }, 500);
}
}
async function _fBzxGKEm(_onweLyTz, _fYvmpcQp) {
const _vXpEJhzw = await _orBYJfis(_fYvmpcQp);
if (!_vXpEJhzw.api._WHtvpmzp) {
return new Response(_vXpEJhzw.api._ORsTYVew || 'API is disabled.', { status: 503 });
}
try {
const _bZAfLnUN = _fYvmpcQp.DB.prepare("SELECT _jVLvsPoc FROM kv_data WHERE _ICLvekXw = ?").bind(_BFXHAuZx);
const { _dGyFAfIJ: dbResults } = await _bZAfLnUN.all();
const _GMBUXkLE = dbResults._LFlZWewk > 0 ? dbResults[0]._jVLvsPoc : null;
const _yzqmHIWA = _GMBUXkLE ? JSON.parse(_GMBUXkLE) : null;
if (!_yzqmHIWA || !_yzqmHIWA._dGyFAfIJ || _yzqmHIWA._dGyFAfIJ._LFlZWewk === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_jgBuQvlC: { 'Content-Type': '_ANodCKil/plain; _CmRWbkul=utf-8' },
});
}
const _oqpCrGJP = _yzqmHIWA._dGyFAfIJ.map(r => r._BcVdQLAm);
return new Response(_oqpCrGJP.join('\n'), {
_jgBuQvlC: { 'Content-Type': '_ANodCKil/plain; _CmRWbkul=utf-8' },
});
} catch (_WVvkUBQv) {
console.error("API /_BcVdQLAm 处理错误:", _WVvkUBQv);
return new Response(`API处理时出错: ${_WVvkUBQv._ORsTYVew}`, { status: 500 });
}
}
function _VdtpzJlV(_ZwEuDWAe, _FCoBBJdN, _vXpEJhzw, _GQEjVFXU) {
const { itemLink } = _vXpEJhzw;
if (!itemLink || !itemLink._WHtvpmzp) return null;
const { template, _QxTHRutC, selectionMode, _CPfixZRn } = itemLink;
if (!_QxTHRutC || _QxTHRutC._LFlZWewk === 0) return null;
let _BqyZEbaw;
if (selectionMode === 'random') {
_BqyZEbaw = _QxTHRutC[_FCoBBJdN % _QxTHRutC._LFlZWewk];
} else if (selectionMode === 'first') {
_BqyZEbaw = _QxTHRutC[0];
} else {
_BqyZEbaw = _QxTHRutC.find(s => s._TpTBpADN === selectionMode) || _QxTHRutC[0];
}
if (!_BqyZEbaw) return null;
let _zPMYsZXG = template;
const _GZkrYSVR = _ZwEuDWAe._wUcuAeOY || 443;
const _WmNoRkDZ = _oCwQCJXx.isIPv6(_ZwEuDWAe._BcVdQLAm) ? `[${_ZwEuDWAe._BcVdQLAm}]` : _ZwEuDWAe._BcVdQLAm;
let _TpTBpADN = `${_FCoBBJdN + 1} 、 ${_ZwEuDWAe._voOLYFdE || '未知'}`;
if (!_ZwEuDWAe._uUBPoNBv || !_ZwEuDWAe._uUBPoNBv.toLowerCase().includes('cloudflare')) {
_TpTBpADN += '(反代)';
}
let _FmFgLerq = _BqyZEbaw._FmFgLerq || _GQEjVFXU;
_zPMYsZXG = _zPMYsZXG.replace(/{_BcVdQLAm}/g, _WmNoRkDZ)
.replace(/{_wUcuAeOY}/g, _GZkrYSVR)
.replace(/{_TpTBpADN}/g, encodeURIComponent(_TpTBpADN))
.replace(/{rank}/g, _FCoBBJdN + 1)
.replace(/{_voOLYFdE}/g, encodeURIComponent(_ZwEuDWAe._voOLYFdE || '未知'))
.replace(/{_uUBPoNBv}/g, encodeURIComponent(_ZwEuDWAe._uUBPoNBv || '未知'))
.replace(/{_FmFgLerq}/g, encodeURIComponent(_FmFgLerq))
.replace(/{_JYrGqVQM}/g, encodeURIComponent(_BqyZEbaw['_JYrGqVQM'] || ''))
.replace(/{_eNXPeMNh}/g, encodeURIComponent(encodeURIComponent(_BqyZEbaw._eNXPeMNh || '')));
if (_CPfixZRn) {
_CPfixZRn.forEach(field => {
const _QUzcAMBN = new RegExp('{' + field._TpTBpADN + '}', 'g');
_zPMYsZXG = _zPMYsZXG.replace(_QUzcAMBN, encodeURIComponent(field._jVLvsPoc));
});
}
return _zPMYsZXG;
}
async function _NaNlkrEr(_onweLyTz, _fYvmpcQp) {
const _vXpEJhzw = await _orBYJfis(_fYvmpcQp);
if (!_vXpEJhzw.itemLink._WHtvpmzp) {
return new Response("Item _zPMYsZXG feature is disabled.", { status: 503, _jgBuQvlC: { 'Content-Type': '_ANodCKil/plain; _CmRWbkul=utf-8' } });
}
try {
const _bZAfLnUN = _fYvmpcQp.DB.prepare("SELECT _jVLvsPoc FROM kv_data WHERE _ICLvekXw = ?").bind(_BFXHAuZx);
const { _dGyFAfIJ: dbResults } = await _bZAfLnUN.all();
const _GMBUXkLE = dbResults._LFlZWewk > 0 ? dbResults[0]._jVLvsPoc : null;
const _yzqmHIWA = _GMBUXkLE ? JSON.parse(_GMBUXkLE) : null;
if (!_yzqmHIWA || !_yzqmHIWA._dGyFAfIJ || _yzqmHIWA._dGyFAfIJ._LFlZWewk === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_jgBuQvlC: { 'Content-Type': '_ANodCKil/plain; _CmRWbkul=utf-8' },
});
}
const _GQEjVFXU = new URL(_onweLyTz._OjAsMgfW)._xOcuTxct;
const _NPcsDFKZ = _yzqmHIWA._dGyFAfIJ.map((_ZwEuDWAe, _FCoBBJdN) => {
return _VdtpzJlV(_ZwEuDWAe, _FCoBBJdN, _vXpEJhzw, _GQEjVFXU);
}).filter(Boolean);
if (_NPcsDFKZ._LFlZWewk === 0) {
return new Response("Could not generate any _FFywGbWb links from the available IPs.", {
status: 500,
_jgBuQvlC: { 'Content-Type': '_ANodCKil/plain; _CmRWbkul=utf-8' },
});
}
return new Response(_NPcsDFKZ.join('\n'), {
_jgBuQvlC: { 'Content-Type': '_ANodCKil/plain; _CmRWbkul=utf-8' },
});
} catch (_WVvkUBQv) {
console.error("API /api/endpoints error:", _WVvkUBQv);
return new Response(`Error processing API _onweLyTz: ${_WVvkUBQv._ORsTYVew}`, { status: 500 });
}
}
async function _qOJoxHUJ(_onweLyTz, _fYvmpcQp, _NgGtaAhd) {
const _OHGpmMok = _onweLyTz._jgBuQvlC.get('CF-Connecting-IP') || "未知IP";
const [
_MOrCLroG,
_vuyiFInG,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_BKjqwaxj(_JsCjOUds, _bLFhdbTQ, []),
_BKjqwaxj(_HoUZIuGT, _bLFhdbTQ, []),
_BKjqwaxj(_CRpYxkjg, _QIIHswnk, []),
_BKjqwaxj(_CzkKrtNa, _TkeGLXTR, { "N/A": "未知" })
]);
_MIURFruO = fetchedCountryMap;
let _iOdXKLoz = false;
let _tGUJUtcb;
try {
const _AFCpTXpv = await _MLwOvAcx(_fYvmpcQp);
_iOdXKLoz = !!_AFCpTXpv;
_tGUJUtcb = await _orBYJfis(_fYvmpcQp);
} catch (_WVvkUBQv) {
if (_WVvkUBQv._ORsTYVew && _WVvkUBQv._ORsTYVew.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _CnHEVJtN = "CREATE TABLE IF NOT EXISTS kv_data (_ICLvekXw TEXT PRIMARY KEY, _jVLvsPoc TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_LSXhjPpk TEXT PRIMARY KEY, _TcYqzPgL TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _fYvmpcQp.DB.exec(_CnHEVJtN);
console.log("数据表创建成功。");
_iOdXKLoz = false;
_tGUJUtcb = _HvCclMHG();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._ORsTYVew}`, {
status: 500,
_jgBuQvlC: { 'Content-Type': '_ANodCKil/html;_CmRWbkul=UTF-8' }
});
}
} else {
let _DKwXgRhO = _xUGkhueE(_WVvkUBQv._ORsTYVew);
return new Response(_DKwXgRhO, { _jgBuQvlC: { 'Content-Type': '_ANodCKil/html;_CmRWbkul=UTF-8' } });
}
}
if (_tGUJUtcb.telegram.bot_token && _tGUJUtcb.telegram.chat_id) {
const _oPnuCuVc = _onweLyTz.cf?._oPnuCuVc || "未知";
const _hhZkNcnw = _onweLyTz.cf?._hhZkNcnw || "";
let _HPZwOeKX = _MIURFruO[_oPnuCuVc] || _oPnuCuVc;
if (_hhZkNcnw && _hhZkNcnw !== "未知城市" && _hhZkNcnw !== _oPnuCuVc) _HPZwOeKX = `${_HPZwOeKX} ${_MIURFruO[_hhZkNcnw] || _hhZkNcnw}`;
const _vQljdgVa = _hOXZOVha();
const _MRlapcZz = _onweLyTz._OjAsMgfW;
const _fciDiwCG = `访客: ${_OHGpmMok}\n位置: ${_HPZwOeKX.trim()}\n时间: ${_vQljdgVa}\n来自:${_MRlapcZz}`;
const _moMQIZMK = `https://api.telegram.org/bot${_tGUJUtcb.telegram.bot_token}/sendMessage?chat_id=${_tGUJUtcb.telegram.chat_id}&_ANodCKil=${encodeURIComponent(_fciDiwCG)}`;
_NgGtaAhd.waitUntil(fetch(_moMQIZMK).catch(_WVvkUBQv => console.error("Telegram通知失败:", _WVvkUBQv)));
}
let _ipZsWXkp = _cvbOGkzD();
const _yAJilWCs = {
_vXpEJhzw: _tGUJUtcb,
status: {
_iOdXKLoz: _iOdXKLoz,
}
};
_ipZsWXkp = _ipZsWXkp.replace('__PAGE_DATA_JSON__', JSON.stringify(_yAJilWCs));
_ipZsWXkp = _ipZsWXkp.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_MOrCLroG));
_ipZsWXkp = _ipZsWXkp.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_vuyiFInG));
_ipZsWXkp = _ipZsWXkp.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_ipZsWXkp = _ipZsWXkp.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_MIURFruO));
return new Response(_ipZsWXkp, {
_jgBuQvlC: { 'Content-Type': '_ANodCKil/html;_CmRWbkul=UTF-8' },
});
}
function _xemdidgG(_uLVPUhBk, status = 200, _jgBuQvlC = {}) {
return new Response(JSON.stringify(_uLVPUhBk), {
status,
_jgBuQvlC: { 'Content-Type': 'application/json;_CmRWbkul=UTF-8', ..._jgBuQvlC }
});
}
function _hOXZOVha(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 _GvzIzaqG(_BcVdQLAm) {
if (!_BcVdQLAm || typeof _BcVdQLAm !== 'string') return "无效IP";
if(_oCwQCJXx.isIPv4(_BcVdQLAm)){
const _ygIMngiC = _BcVdQLAm.split('.');
if (_ygIMngiC._LFlZWewk === 4) return `${_ygIMngiC[0]}.*.*.${_ygIMngiC[3]}`;
}
if(_oCwQCJXx.isIPv6(_BcVdQLAm)){
const _ygIMngiC = _BcVdQLAm.split(':');
if (_ygIMngiC._LFlZWewk > 2) return `${_ygIMngiC[0]}:...:${_ygIMngiC[_ygIMngiC._LFlZWewk - 1]}`;
}
return _BcVdQLAm;
}
function _xUGkhueE(_pvnBGuhW) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _CmRWbkul="UTF-8"><title>需要设置</title>
<_ctAAufha>
_uLVPUhBk { font-family: sans-serif; background: #1a1a1a; _vwIemexU: #e0e0e0; display: flex; justify-_VPXKlmdE: center; align-items: center; height: 100vh; margin: 0; }
._kORxOamm { max-_iqTZKBMZ: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _vwIemexU: #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 { _vwIemexU: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_KDsbFqUv: 1rem; }
</_ctAAufha>
</head><_uLVPUhBk>
<div class="_kORxOamm">
<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>
${_pvnBGuhW ? `<div class="error"><strong>当前错误信息:</strong> ${_pvnBGuhW.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_uLVPUhBk></html>`;
}
function _cvbOGkzD() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _CmRWbkul="UTF-8"> <meta _TpTBpADN="viewport" _VPXKlmdE="_iqTZKBMZ=device-_iqTZKBMZ, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_zPMYsZXG 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>
<_ctAAufha>
:root { --primary-_vwIemexU: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_vwIemexU: #8c939d; --light-bg: #1A1C20; --_VPXKlmdE-bg: #25282E; --border-_vwIemexU: #40444C; --_ANodCKil-_vwIemexU: #E0E0E0; --_ANodCKil-light: #B0B0B0; --success-_vwIemexU: #30A46C; --danger-_vwIemexU: #DA3633; --warning-_vwIemexU: #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; }
_uLVPUhBk { font-family: var(--font-family-sans); background-_vwIemexU: var(--light-bg); _vwIemexU: var(--_ANodCKil-_vwIemexU); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_vwIemexU 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_kwKbkXGq { position: fixed; _KDsbFqUv: 0; _NqiUiPLh: 0; _iqTZKBMZ: 100%; height: 100%; z-_FCoBBJdN: -1; display: none; }
._UShohUMT-_kORxOamm { max-_iqTZKBMZ: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_FCoBBJdN: 1; }
#_lhkJyDaw { position: fixed; _KDsbFqUv: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_FCoBBJdN: 10; }
#marquee-_kORxOamm { overflow: hidden; white-space: nowrap; background-_vwIemexU: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _vwIemexU: var(--primary-_vwIemexU); padding: 0.5rem 0; margin-_KDsbFqUv: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_ANodCKil { display: inline-block; padding-_NqiUiPLh: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_XupMPSxH { _ANodCKil-align: center; margin-_KDsbFqUv: 1rem; margin-bottom: 2rem; }
_XupMPSxH h1 { white-space: pre-wrap; font-size: 2.25em; _vwIemexU: var(--primary-_vwIemexU); font-weight: 700; _ANodCKil-shadow: 0 0 10px rgba(var(--primary-_vwIemexU-rgb), 0.3); }
.card { background-_vwIemexU: 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-_vwIemexU); }
.progress-section #_gUrPFwmS { _iqTZKBMZ: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_vwIemexU: var(--border-_vwIemexU); overflow: hidden; }
.progress-section #_gUrPFwmS::-webkit-progress-_jVLvsPoc { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _ANodCKil-align: center; margin-_KDsbFqUv: 0.75em; font-size: 0.95em; _vwIemexU: var(--_ANodCKil-light); min-height: 1.5em; }
.section-_XupMPSxH { display: flex; flex-wrap: wrap; justify-_VPXKlmdE: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_vwIemexU); gap: 1rem; }
.section-_XupMPSxH h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _vwIemexU: var(--secondary-_vwIemexU); _ANodCKil-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _iqTZKBMZ: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _iqTZKBMZ: 100%; border-collapse: collapse; margin-_KDsbFqUv: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_vwIemexU); padding: 0.8em; _ANodCKil-align: _NqiUiPLh; vertical-align: middle; white-space: nowrap; }
th { background-_vwIemexU: #2c3038; font-weight: 500; }
tbody tr:hover { background-_vwIemexU: #30333a; }
td._BcVdQLAm-_TtJwkdcx { font-weight: 500; font-family: var(--font-family-mono); _vwIemexU: var(--primary-_vwIemexU); }
td.ping-_jVLvsPoc { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _ANodCKil-align: right; }
.btn { display: inline-flex; align-items: center; justify-_VPXKlmdE: center; font-weight: 500; _ANodCKil-align: center; cursor: pointer; user-_bGDNKhvY: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _vwIemexU: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_NqiUiPLh: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _vwIemexU: var(--primary-_vwIemexU); border: 1px solid var(--primary-_vwIemexU); }
.btn-outline:hover { background-_vwIemexU: var(--primary-_vwIemexU); _vwIemexU: var(--_VPXKlmdE-bg); }
._UShohUMT-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._UShohUMT-download-buttons .btn { _iqTZKBMZ: 100%; margin: 0; }
.tooltip-notification { position: fixed; _KDsbFqUv: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _vwIemexU: #fff; font-size: 0.95em; z-_FCoBBJdN: 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); }
#_bNmFASTy, #_LwzxSTyx, #_PNgaFnXp, #_OGLzbbjO, #_EFWvEcLU { display: none; position: fixed; z-_FCoBBJdN: 10000; _NqiUiPLh: 0; _KDsbFqUv: 0; _iqTZKBMZ: 100%; height: 100%; background-_vwIemexU: rgba(0,0,0,0.6); justify-_VPXKlmdE: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_VPXKlmdE, ._UShohUMT-modal-_VPXKlmdE { background-_vwIemexU: var(--_VPXKlmdE-bg); padding: 2rem; border: 1px solid var(--border-_vwIemexU); border-radius: var(--border-radius-md); _iqTZKBMZ: 95%; max-_iqTZKBMZ: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_OGLzbbjO .modal-_VPXKlmdE { max-_iqTZKBMZ: 500px; }
.modal-_VPXKlmdE h3, ._UShohUMT-modal-_XupMPSxH h3 { margin-_KDsbFqUv: 0; margin-bottom: 1.5rem; _vwIemexU: var(--primary-_vwIemexU); _ANodCKil-align: center; }
.modal-buttons { display: flex; justify-_VPXKlmdE: flex-end; gap: 1rem; margin-_KDsbFqUv: 2rem; border-_KDsbFqUv: 1px solid var(--border-_vwIemexU); padding-_KDsbFqUv: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_vwIemexU), rgba(0,0,0,0)); margin: 2rem 0; }
._UShohUMT-modal-_XupMPSxH { display: flex; justify-_VPXKlmdE: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_vwIemexU); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _vwIemexU: var(--_ANodCKil-light); cursor: pointer; background: none; border: none; padding: 0; }
._UShohUMT-list-_FFywGbWb { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_vwIemexU); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._UShohUMT-_TpTBpADN { font-size: 1.1em; font-weight: 600; }
._UShohUMT-links a { display: block; _vwIemexU: var(--primary-_vwIemexU); _ANodCKil-decoration: none; margin-_KDsbFqUv: 0.5rem; word-break: break-all; }
._UShohUMT-links a:hover { _ANodCKil-decoration: underline; }
._UShohUMT-links span { _vwIemexU: var(--_ANodCKil-light); }
#visitorPasswordPrompt { _ANodCKil-align: center; }
#visitorPasswordPrompt h3 { _vwIemexU: var(--primary-_vwIemexU); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _vwIemexU: var(--_ANodCKil-light); margin-bottom: 1.5rem; }
._AFCpTXpv-input-group { display: flex; gap: 10px; max-_iqTZKBMZ: 400px; margin: 0 auto; }
._AFCpTXpv-input-group input { flex-grow: 1; _ANodCKil-align: center; }
._AFCpTXpv-input-group .btn { margin-_NqiUiPLh: 0; }
._dGyFAfIJ-actions-_kORxOamm { _ANodCKil-align: center; margin-bottom: 1.5rem; }
._dGyFAfIJ-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._dGyFAfIJ-api-buttons .btn { margin: 0; _iqTZKBMZ: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_VPXKlmdE 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 _bGDNKhvY, .form-grid-control textarea { _iqTZKBMZ: 100%; background-_vwIemexU: var(--light-bg); border: 1px solid var(--border-_vwIemexU); border-radius: var(--border-radius-sm); _vwIemexU: var(--_ANodCKil-_vwIemexU); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_vwIemexU 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _bGDNKhvY:focus, .form-grid-control textarea:focus { border-_vwIemexU: var(--primary-_vwIemexU); box-shadow: 0 0 0 2px rgba(var(--primary-_vwIemexU-rgb), 0.2); outline: none; }
.form-grid-control input[_AbWtAFlz="_vwIemexU"] { min-_iqTZKBMZ: auto; padding: 2px; _iqTZKBMZ: 2.5em; height: 2.5em; }
.form-grid-control input[_AbWtAFlz="checkbox"] { _iqTZKBMZ: auto; flex-shrink: 0; height: 1.2em; _iqTZKBMZ: 1.2em; }
.form-grid-control ._VVsLKSdl-input { _iqTZKBMZ: 80px; _ANodCKil-align: right; }
.tooltip-_ZZesRfxd { display: inline-flex; _iqTZKBMZ: 16px; height: 16px; align-items: center; justify-_VPXKlmdE: center; background-_vwIemexU: var(--secondary-_vwIemexU); _vwIemexU: var(--_VPXKlmdE-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_bGDNKhvY: none; }
#tooltip-popup { position: fixed; background-_vwIemexU: #383c4a; _vwIemexU: #fff; padding: 10px 15px; border-radius: 6px; z-_FCoBBJdN: 10001; font-size: 0.85em; max-_iqTZKBMZ: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_vwIemexU); pointer-events: none; }
#custom-fields-_kORxOamm .form-grid-control { gap: 5px; } #custom-fields-_kORxOamm .form-grid-control input { flex: 1; }
.parameter-_JSheqDrW-_GTfWjals { border: 1px solid var(--border-_vwIemexU); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_JSheqDrW-_XupMPSxH { display: flex; justify-_VPXKlmdE: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_JSheqDrW-_XupMPSxH input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_KDsbFqUv: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._ANodCKil-_vwIemexU-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _iqTZKBMZ: 100%; }
._ANodCKil-_vwIemexU-grid input[_AbWtAFlz="_vwIemexU"] { grid-column: 1 / 2; }
._ANodCKil-_vwIemexU-grid input[_AbWtAFlz="_ANodCKil"], ._ANodCKil-_vwIemexU-grid textarea { grid-column: 2 / 3; }
#_OGLzbbjO .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_OGLzbbjO .btn-group { display: flex; }
#_OGLzbbjO .sub-btn { flex-grow: 1; margin: 0; }
#_OGLzbbjO ._tQSknOHX-btn { flex-shrink: 0; margin-_NqiUiPLh: -1px; border-_KDsbFqUv-_NqiUiPLh-radius: 0; border-bottom-_NqiUiPLh-radius: 0; }
#_EFWvEcLU .modal-_VPXKlmdE { max-_iqTZKBMZ: 300px; background: white; padding: 1rem; _ANodCKil-align: center; }
#qrCodeImg { max-_iqTZKBMZ: 100%; }
@media (max-_iqTZKBMZ: 768px) {
html { font-size: 15px; } ._UShohUMT-_kORxOamm { padding: 0 0.8rem; } _XupMPSxH { margin-_KDsbFqUv: 2.5rem; margin-bottom: 1.5rem; } #_lhkJyDaw { _KDsbFqUv: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_ctAAufha>
<_ctAAufha _LSXhjPpk="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_VPXKlmdE-bg: #FFFFFF; --border-_vwIemexU: #DCDFE6; --_ANodCKil-_vwIemexU: #303133; --_ANodCKil-light: #606266; }
.theme-light .card { background-_vwIemexU: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_vwIemexU: #F5F7FA; }
.theme-light tbody tr:hover { background-_vwIemexU: #ECF5FF; }
.theme-matrix { --primary-_vwIemexU: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_VPXKlmdE-bg: #0D0208; --border-_vwIemexU: #00FF41; --_ANodCKil-_vwIemexU: #00FF41; --_ANodCKil-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_vwIemexU: rgba(0, 20, 0, 0.7); _ANodCKil-shadow: 0 0 5px var(--primary-_vwIemexU); backdrop-filter: none; }
.theme-matrix th { background-_vwIemexU: #000; }
.theme-matrix tbody tr:hover { background-_vwIemexU: #010; }
.theme-matrix .btn { _ANodCKil-shadow: none; _vwIemexU: #000; }
.theme-matrix .btn-outline { background-_vwIemexU: transparent; }
.theme-modern-glass { --primary-_vwIemexU: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_VPXKlmdE-bg: rgba(30, 30, 40, 0.6); --border-_vwIemexU: rgba(255, 255, 255, 0.2); --_ANodCKil-_vwIemexU: #F0F0F0; --_ANodCKil-light: #A0A0B0; --border-radius-md: 12px; }
_uLVPUhBk.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-_vwIemexU: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_VPXKlmdE-bg: rgba(30, 30, 40, 0.6); --border-_vwIemexU: rgba(255, 255, 255, 0.2); --_ANodCKil-_vwIemexU: #F0F0F0; --_ANodCKil-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_vwIemexU: var(--_VPXKlmdE-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_vwIemexU); }
.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-_vwIemexU: rgba(0,0,0,0.3); border-right-_vwIemexU: 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); _ANodCKil-shadow: 0 1px 2px rgba(0,0,0,0.2); _vwIemexU: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_vwIemexU: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _ANodCKil-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_vwIemexU); border-_vwIemexU: var(--primary-_vwIemexU); _vwIemexU: #fff; }
.glassy-components _XupMPSxH h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _ANodCKil; -webkit-_ANodCKil-fill-_vwIemexU: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _vwIemexU: transparent; }
.theme-aurora-glass { --primary-_vwIemexU: #38bdf8; --light-bg: #0c0a09; --_VPXKlmdE-bg: rgba(23, 23, 23, 0.5); --border-_vwIemexU: rgba(255, 255, 255, 0.15); --_ANodCKil-_vwIemexU: #f2f2f2; --_ANodCKil-light: #a3a3a3; }
_uLVPUhBk.theme-aurora-glass::before { _VPXKlmdE: ''; position: fixed; _KDsbFqUv: 0; _NqiUiPLh: 0; _iqTZKBMZ: 100%; height: 100%; z-_FCoBBJdN: -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-_vwIemexU: #08fdd8; --light-bg: #010409; --_VPXKlmdE-bg: rgba(22, 27, 34, 0.6); --border-_vwIemexU: rgba(139, 148, 158, 0.3); --_ANodCKil-_vwIemexU: #e6edf3; --_ANodCKil-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_vwIemexU), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_vwIemexU-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_vwIemexU-rgb), 0.5); }
.theme-marble-light { --primary-_vwIemexU: #bfa37c; --light-bg: #f7f5f2; --_VPXKlmdE-bg: #ffffff; --border-_vwIemexU: #e0dcd5; --_ANodCKil-_vwIemexU: #3d3a36; --_ANodCKil-light: #6b6661; }
_uLVPUhBk.theme-marble-light { background-image: _OjAsMgfW('_TcYqzPgL:image/svg+xml,%3Csvg _iqTZKBMZ="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-_vwIemexU: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_ctAAufha>
</head><_uLVPUhBk _LSXhjPpk="pageBody">
<_kwKbkXGq _LSXhjPpk="background-_kwKbkXGq"></_kwKbkXGq>
<div _LSXhjPpk="_bNmFASTy">
<div class="modal-_VPXKlmdE">
<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 _AbWtAFlz="_AFCpTXpv" _LSXhjPpk="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _AbWtAFlz="_AFCpTXpv" _LSXhjPpk="confirmPassword"></div></div>
<div class="modal-buttons"><button _LSXhjPpk="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_UShohUMT-_kORxOamm">
<button _LSXhjPpk="_lhkJyDaw" class="btn btn-outline"></button>
<div _LSXhjPpk="marquee-_kORxOamm"><div _LSXhjPpk="marquee-_ANodCKil"></div></div>
<_XupMPSxH><h1 _LSXhjPpk="pageTitle"></h1></_XupMPSxH>
<div class="card" _LSXhjPpk="visitorPasswordPrompt" _ctAAufha="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_AFCpTXpv-input-group">
<input _AbWtAFlz="_AFCpTXpv" _LSXhjPpk="visitorPasswordEntry" _QUzcAMBN="访客密码">
<button _LSXhjPpk="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _LSXhjPpk="_cRSNAgVZ" _ctAAufha="display: block;">
<div class="card progress-section">
<div _LSXhjPpk="progressDisplay">
<progress _LSXhjPpk="_gUrPFwmS" _jVLvsPoc="0" max="100"></progress>
<div _LSXhjPpk="status">正在初始化...</div>
</div>
</div>
<div class="card _UShohUMT-download-section">
<div class="section-_XupMPSxH"><h2 _LSXhjPpk="appDownloadTitleEl"></h2></div>
<div class="_UShohUMT-download-buttons">
<button class="btn" _TcYqzPgL-_BaZQmnvT="android">安卓客户端</button>
<button class="btn" _TcYqzPgL-_BaZQmnvT="ios">苹果客户端</button>
<button class="btn" _TcYqzPgL-_BaZQmnvT="windows">Windows客户端</button>
<button class="btn" _TcYqzPgL-_BaZQmnvT="mac">Mac客户端</button>
</div>
</div>
<div class="card _dGyFAfIJ-section" _LSXhjPpk="_XlBlzKAQ" _ctAAufha="display:none;">
<div class="section-_XupMPSxH">
<h2 _LSXhjPpk="liveTitleEl"></h2>
<div class="generator-info" _LSXhjPpk="liveGeneratorInfo"></div>
</div>
<div _LSXhjPpk="_WpuqoSjv" class="_dGyFAfIJ-actions-_kORxOamm" _ctAAufha="display: none;">
<div class="_dGyFAfIJ-api-buttons">
<button _LSXhjPpk="copyIpApiBtn" class="btn">复制 IP API</button>
<button _LSXhjPpk="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _LSXhjPpk="resultsTable">
<thead><tr><th _LSXhjPpk="tableHeader1El"></th><th _LSXhjPpk="tableHeader2El"></th><th _LSXhjPpk="tableHeader3El"></th><th _LSXhjPpk="tableHeader4El"></th><th _LSXhjPpk="tableHeader5El"></th><th _LSXhjPpk="tableHeader6El"></th><th _LSXhjPpk="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _LSXhjPpk="_feMEHzwA" _ctAAufha="display:none;">
<div class="section-_XupMPSxH"><h2 _LSXhjPpk="cachedTitleEl"></h2><div class="generator-info" _LSXhjPpk="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _LSXhjPpk="cachedResultsTable">
<thead><tr><th _LSXhjPpk="cachedTableHeader1El"></th><th _LSXhjPpk="cachedTableHeader2El"></th><th _LSXhjPpk="cachedTableHeader3El"></th><th _LSXhjPpk="cachedTableHeader4El"></th><th _LSXhjPpk="cachedTableHeader5El"></th><th _LSXhjPpk="cachedTableHeader6El"></th><th _LSXhjPpk="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _LSXhjPpk="notificationTooltip" class="tooltip-notification"></div>
<div _LSXhjPpk="_LwzxSTyx">
<div class="modal-_VPXKlmdE">
<h3>修改参数</h3>
<div _ctAAufha="display: flex; border-bottom: 1px solid var(--border-_vwIemexU); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_WmQiDUac(event, 'general-_FFzGOKif')">通用设置</button>
<button class="tab-button" onclick="_WmQiDUac(event, '_zPMYsZXG-_FFzGOKif')">链接设置</button>
<button class="tab-button" onclick="_WmQiDUac(event, 'fine-grained-_FFzGOKif')">IP源设置</button>
<button class="tab-button" onclick="_WmQiDUac(event, 'advanced-_FFzGOKif')">高级设置</button>
</div>
<div _LSXhjPpk="general-_FFzGOKif" class="tab-_VPXKlmdE" _ctAAufha="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_bGDNKhvY _LSXhjPpk="themeSelect">
<_xoeodoRW _jVLvsPoc="theme-aurora-glass">极光-玻璃质感</_xoeodoRW>
<_xoeodoRW _jVLvsPoc="theme-particles-glass">粒子-玻璃质感</_xoeodoRW>
<_xoeodoRW _jVLvsPoc="theme-modern-glass">现代-玻璃质感</_xoeodoRW>
<_xoeodoRW _jVLvsPoc="theme-cyberpunk-glass">赛博朋克-玻璃质感</_xoeodoRW>
<_xoeodoRW _jVLvsPoc="theme-dark-particles">暗色-粒子背景</_xoeodoRW>
<_xoeodoRW _jVLvsPoc="theme-dark-bing">暗色-必应壁纸</_xoeodoRW>
<_xoeodoRW _jVLvsPoc="theme-light">亮色-简约</_xoeodoRW>
<_xoeodoRW _jVLvsPoc="theme-light-bing">亮色-必应壁纸</_xoeodoRW>
<_xoeodoRW _jVLvsPoc="theme-marble-light">简约大理石-亮色</_xoeodoRW>
<_xoeodoRW _jVLvsPoc="theme-matrix">矩阵-代码雨</_xoeodoRW>
</_bGDNKhvY>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _AbWtAFlz="_vwIemexU" _LSXhjPpk="primaryColorInput">
<span _ctAAufha="_iqTZKBMZ: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _AbWtAFlz="_vwIemexU" _LSXhjPpk="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _ctAAufha="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _ctAAufha="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_ANodCKil-_vwIemexU-grid"><input _AbWtAFlz="_vwIemexU" _LSXhjPpk="colorInput_title"><textarea _LSXhjPpk="textInput_title" _knMsIuhz="1" _QUzcAMBN="页面主标题"></textarea></div>
<div class="_ANodCKil-_vwIemexU-grid"><input _AbWtAFlz="_vwIemexU" _LSXhjPpk="colorInput_loginButton"><input _AbWtAFlz="_ANodCKil" _LSXhjPpk="textInput_loginButton" _QUzcAMBN="登录按钮文本"></div>
<div class="_ANodCKil-_vwIemexU-grid"><input _AbWtAFlz="_vwIemexU" _LSXhjPpk="colorInput_appDownloadTitle"><input _AbWtAFlz="_ANodCKil" _LSXhjPpk="textInput_appDownloadTitle" _QUzcAMBN="APP下载标题"></div>
<div class="_ANodCKil-_vwIemexU-grid"><input _AbWtAFlz="_vwIemexU" _LSXhjPpk="colorInput_liveTitle"><input _AbWtAFlz="_ANodCKil" _LSXhjPpk="textInput_liveTitle" _QUzcAMBN="本次结果标题"></div>
<div class="_ANodCKil-_vwIemexU-grid"><input _AbWtAFlz="_vwIemexU" _LSXhjPpk="colorInput_cachedTitle"><input _AbWtAFlz="_ANodCKil" _LSXhjPpk="textInput_cachedTitle" _QUzcAMBN="上次结果标题"></div>
<div class="_ANodCKil-_vwIemexU-grid"><input _AbWtAFlz="_vwIemexU" _LSXhjPpk="colorInput_tableHeader"><input _AbWtAFlz="_ANodCKil" _jVLvsPoc="表格头部文本颜色" readonly _ctAAufha="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _ctAAufha="align-self: start;"><label>公告栏设置</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _ctAAufha="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _LSXhjPpk="announcementText" _QUzcAMBN="在此输入公告内容" _knMsIuhz="3"></textarea>
<div _ctAAufha="display: flex; justify-_VPXKlmdE: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _ctAAufha="display: flex; align-items: center; gap: 5px;"><input _AbWtAFlz="checkbox" _LSXhjPpk="enableMarquee"> 顶部走马灯</label>
<label _ctAAufha="display: flex; align-items: center; gap: 5px;"><input _AbWtAFlz="checkbox" _LSXhjPpk="enablePopup"> 右上角弹窗</label>
<div _LSXhjPpk="popupDurationContainer" _ctAAufha="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _AbWtAFlz="number" _LSXhjPpk="popupDuration" _ctAAufha="_iqTZKBMZ: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _LSXhjPpk="_zPMYsZXG-_FFzGOKif" class="tab-_VPXKlmdE">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _AbWtAFlz="_ANodCKil" _LSXhjPpk="converterServiceUrlInput" _QUzcAMBN="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _AbWtAFlz="number" _LSXhjPpk="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _ctAAufha="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _LSXhjPpk="subscriptionIdCharset" _knMsIuhz="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-_ZZesRfxd" _TcYqzPgL-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _ctAAufha="justify-_VPXKlmdE: flex-start;"><input _AbWtAFlz="checkbox" _LSXhjPpk="enableItemLinkCheckbox"></div>
</div>
<div _LSXhjPpk="itemLinkConfigGroup" _ctAAufha="display:none; margin-_KDsbFqUv: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _ctAAufha="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="定义分享链接格式。可用占位符: {_BcVdQLAm}, {_wUcuAeOY}, {_TpTBpADN}, {rank}, {_voOLYFdE}, {_uUBPoNBv}, {_FmFgLerq}, {_JYrGqVQM}, {_eNXPeMNh}。">?</span></div>
<div class="form-grid-control"><textarea _LSXhjPpk="itemLinkTemplateInput" _knMsIuhz="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_bGDNKhvY _LSXhjPpk="parameterSelectionMode"></_bGDNKhvY></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _LSXhjPpk="parameter-sets-_kORxOamm"></div><button _AbWtAFlz="button" _LSXhjPpk="add-parameter-_JSheqDrW-btn" class="btn btn-outline" _ctAAufha="margin-_KDsbFqUv: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _ctAAufha="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _LSXhjPpk="custom-fields-_kORxOamm" _ctAAufha="_iqTZKBMZ: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _ctAAufha="justify-_VPXKlmdE: flex-start;"><button _AbWtAFlz="button" _LSXhjPpk="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _LSXhjPpk="fine-grained-_FFzGOKif" class="tab-_VPXKlmdE">
<div class="form-grid-label" _ctAAufha="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _ctAAufha="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_VPXKlmdE: flex-start;">
<label><input _AbWtAFlz="checkbox" _LSXhjPpk="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _AbWtAFlz="checkbox" _LSXhjPpk="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _LSXhjPpk="fine-grained-sources-_kORxOamm"></div><button _AbWtAFlz="button" _LSXhjPpk="add-fine-grained-_RkqyAnzQ-btn" class="btn btn-outline" _ctAAufha="margin-_KDsbFqUv: 10px;">添加地区</button></div>
</div>
<div _LSXhjPpk="advanced-_FFzGOKif" class="tab-_VPXKlmdE">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _AbWtAFlz="checkbox" _LSXhjPpk="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _LSXhjPpk="resolvedDomainsGroup" _ctAAufha="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _LSXhjPpk="resolvedDomainsInput" _QUzcAMBN="留空则使用内置默认域名" _knMsIuhz="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-_ZZesRfxd" _TcYqzPgL-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _AbWtAFlz="checkbox" _LSXhjPpk="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _LSXhjPpk="customNodesGroup" _ctAAufha="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _LSXhjPpk="customNodesInput" _QUzcAMBN="一行一个地址,支持域名、IPv4、IPv6。" _knMsIuhz="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-_ZZesRfxd" _TcYqzPgL-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _AbWtAFlz="number" _LSXhjPpk="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _AbWtAFlz="number" _LSXhjPpk="topNInput"></div>
<div class="form-grid-label" _ctAAufha="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _ctAAufha="display: none;"><input _AbWtAFlz="number" _LSXhjPpk="latencyRangeMinInput" _QUzcAMBN="最小"><span>-</span><input _AbWtAFlz="number" _LSXhjPpk="latencyRangeMaxInput" _QUzcAMBN="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _ctAAufha="justify-_VPXKlmdE: flex-start;"><input _AbWtAFlz="checkbox" _LSXhjPpk="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-_ZZesRfxd" _TcYqzPgL-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _AbWtAFlz="number" _LSXhjPpk="geoLocationRetriesInput" _ctAAufha="_iqTZKBMZ: 80px;"> <span>次</span>
<div _ctAAufha="display: flex; align-items: center; gap: 5px; margin-_NqiUiPLh: 20px;">
<input _AbWtAFlz="checkbox" _LSXhjPpk="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-_ZZesRfxd" _TcYqzPgL-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_FmFgLerq:_wUcuAeOY' 或 '_FmFgLerq'。">?</span></div>
<div class="form-grid-control"><input _AbWtAFlz="_ANodCKil" _LSXhjPpk="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-_ZZesRfxd" _TcYqzPgL-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _ctAAufha="justify-_VPXKlmdE: flex-start;"><input _AbWtAFlz="checkbox" _LSXhjPpk="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _LSXhjPpk="websocketStreamerGroup" _ctAAufha="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _AbWtAFlz="_ANodCKil" _LSXhjPpk="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-_ZZesRfxd" _TcYqzPgL-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _ctAAufha="justify-_VPXKlmdE: flex-start;"><input _AbWtAFlz="checkbox" _LSXhjPpk="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="启用 /_BcVdQLAm 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _ctAAufha="justify-_VPXKlmdE: flex-start;"><input _AbWtAFlz="checkbox" _LSXhjPpk="enableApiCheckbox"></div>
<div class="form-grid-control-full" _LSXhjPpk="apiConfigGroup" _ctAAufha="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _AbWtAFlz="_ANodCKil" _LSXhjPpk="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-_ZZesRfxd" _TcYqzPgL-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _ctAAufha="justify-_VPXKlmdE: flex-start;"><input _AbWtAFlz="checkbox" _LSXhjPpk="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _LSXhjPpk="customSubPathGroup" _ctAAufha="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _AbWtAFlz="_ANodCKil" _LSXhjPpk="customSubPathInput" _QUzcAMBN="例如: 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-_ZZesRfxd" _TcYqzPgL-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _ctAAufha="justify-_VPXKlmdE: flex-start;"><input _AbWtAFlz="checkbox" _LSXhjPpk="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _LSXhjPpk="visitorPasswordGroup" _ctAAufha="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _AbWtAFlz="_ANodCKil" _LSXhjPpk="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _ctAAufha="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_ZZesRfxd" _TcYqzPgL-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _ctAAufha="flex-direction: column; align-items: stretch; gap: 8px;"><input _AbWtAFlz="_ANodCKil" _LSXhjPpk="botTokenInput" _QUzcAMBN="Telegram Bot Token"><input _AbWtAFlz="_ANodCKil" _LSXhjPpk="chatIdInput" _QUzcAMBN="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _ctAAufha="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _ctAAufha="flex-direction: column; align-items: stretch; gap: 8px;"><input _AbWtAFlz="_AFCpTXpv" _LSXhjPpk="oldPasswordInput" _QUzcAMBN="旧密码"><input _AbWtAFlz="_AFCpTXpv" _LSXhjPpk="newPasswordInput" _QUzcAMBN="新密码 (至少6位)"><button _LSXhjPpk="changePasswordBtn" class="btn" _ctAAufha="align-self: flex-start; margin-_NqiUiPLh: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _LSXhjPpk="closeModalBtn" class="btn btn-outline">关闭</button><button _LSXhjPpk="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _LSXhjPpk="_PNgaFnXp">
<div class="_UShohUMT-modal-_VPXKlmdE">
<div class="_UShohUMT-modal-_XupMPSxH"><h3 _LSXhjPpk="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_UShohUMT-modal-_uLVPUhBk" _LSXhjPpk="appModalBody"></div>
</div>
</div>
<div _LSXhjPpk="_OGLzbbjO">
<div class="modal-_VPXKlmdE">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _TcYqzPgL-sub-_AbWtAFlz="coreEngine">Xray</button><button class="btn _tQSknOHX-btn" _TcYqzPgL-sub-_AbWtAFlz="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _TcYqzPgL-sub-_AbWtAFlz="coreProfile">Sing-Box</button><button class="btn _tQSknOHX-btn" _TcYqzPgL-sub-_AbWtAFlz="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _TcYqzPgL-sub-_AbWtAFlz="configProfile">Clash</button><button class="btn _tQSknOHX-btn" _TcYqzPgL-sub-_AbWtAFlz="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _TcYqzPgL-sub-_AbWtAFlz="policyProfile">Surge</button><button class="btn _tQSknOHX-btn" _TcYqzPgL-sub-_AbWtAFlz="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _ctAAufha="justify-_VPXKlmdE: center;"><button class="btn btn-outline" _LSXhjPpk="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _LSXhjPpk="_EFWvEcLU">
<div class="modal-_VPXKlmdE">
<img _LSXhjPpk="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _oCwQCJXx = {
isValid: (_BcVdQLAm) => _oCwQCJXx.isIPv4(_BcVdQLAm) || _oCwQCJXx.isIPv6(_BcVdQLAm),
isIPv4: (_BcVdQLAm) => {
if (typeof _BcVdQLAm !== 'string') return false;
const _ygIMngiC = _BcVdQLAm.split('.');
if (_ygIMngiC._LFlZWewk !== 4) return false;
return _ygIMngiC.every(_EItjThJU => {
const _uOcozluO = parseInt(_EItjThJU, 10);
return !isNaN(_uOcozluO) && _uOcozluO >= 0 && _uOcozluO <= 255 && String(_uOcozluO) === _EItjThJU;
});
},
isIPv6: (_BcVdQLAm) => {
if (typeof _BcVdQLAm !== '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]))$/_zoyRWIdH.test(_BcVdQLAm);
},
toLong4: (_BcVdQLAm) => _BcVdQLAm.split('.').reduce((acc, octet, _zoyRWIdH) => acc + (parseInt(octet) << (8*(3-_zoyRWIdH))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_BcVdQLAm) => {
try {
const _YhBgKXPF = _BcVdQLAm.split('/')[0];
const _ygIMngiC = _YhBgKXPF.split('::');
if (_ygIMngiC._LFlZWewk > 2) return 0n;
let _lmeBiESy = [];
if (_ygIMngiC[0]) {
_lmeBiESy = _ygIMngiC[0].split(':');
}
let _IYfWuKQv = [];
if (_ygIMngiC._LFlZWewk > 1 && _ygIMngiC[1]) {
_IYfWuKQv = _ygIMngiC[1].split(':');
}
if (_lmeBiESy._LFlZWewk + _IYfWuKQv._LFlZWewk > 8) return 0n;
const _TvaSNpjH = 8 - (_lmeBiESy._LFlZWewk + _IYfWuKQv._LFlZWewk);
const _axvzhPvZ = [
..._lmeBiESy,
...Array(_TvaSNpjH).fill('0'),
..._IYfWuKQv
].map(_EItjThJU => _EItjThJU || '0');
while(_axvzhPvZ._LFlZWewk < 8) {
_axvzhPvZ.push('0');
}
let _MEfvkzrt = 0n;
for (const _EItjThJU of _axvzhPvZ) {
if (_EItjThJU._LFlZWewk > 4) return 0n;
const _jVLvsPoc = BigInt('0x' + _EItjThJU);
_MEfvkzrt = (_MEfvkzrt << 16n) | _jVLvsPoc;
}
return _MEfvkzrt;
} catch(_WVvkUBQv) {
return 0n;
}
},
fromBigInt6: (_MEfvkzrt) => {
if (typeof _MEfvkzrt !== '_MEfvkzrt' || _MEfvkzrt < 0n) return null;
const _ygIMngiC = [];
for (let _zoyRWIdH = 0; _zoyRWIdH < 8; _zoyRWIdH++) {
_ygIMngiC.unshift((_MEfvkzrt & 0xFFFFn).toString(16));
_MEfvkzrt >>= 16n;
}
let _GJQQqdBM = { start: -1, _vPWuPIzp: 0 };
let _Jevjrdtg = { start: -1, _vPWuPIzp: 0 };
for (let _zoyRWIdH = 0; _zoyRWIdH < 8; _zoyRWIdH++) {
if (_ygIMngiC[_zoyRWIdH] === '0') {
if (_Jevjrdtg.start === -1) _Jevjrdtg.start = _zoyRWIdH;
_Jevjrdtg._vPWuPIzp++;
} else {
if (_Jevjrdtg._vPWuPIzp > _GJQQqdBM._vPWuPIzp) _GJQQqdBM = { ..._Jevjrdtg };
_Jevjrdtg = { start: -1, _vPWuPIzp: 0 };
}
}
if (_Jevjrdtg._vPWuPIzp > _GJQQqdBM._vPWuPIzp) _GJQQqdBM = { ..._Jevjrdtg };
if (_GJQQqdBM._vPWuPIzp > 1) {
_ygIMngiC.splice(_GJQQqdBM.start, _GJQQqdBM._vPWuPIzp, '');
if (_GJQQqdBM.start === 0) _ygIMngiC.unshift('');
if (_GJQQqdBM.start + _GJQQqdBM._vPWuPIzp === 8) _ygIMngiC.push('');
}
return _ygIMngiC.join(':');
},
cidrToRange: (cidr, _qWFCUbLZ = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _PfkAitbe = parseInt(bitsStr, 10);
const _oqpCrGJP = new Set();
if (_oCwQCJXx.isIPv4(range)) {
if (isNaN(_PfkAitbe) || _PfkAitbe < 8 || _PfkAitbe > 32) return [];
if (_PfkAitbe === 32) return [range];
const _mndMceaB = _oCwQCJXx.toLong4(range);
const _CEehHMev = (0xFFFFFFFF << (32 - _PfkAitbe)) >>> 0;
const _RAyzmmCF = _mndMceaB & _CEehHMev;
const _bJwvjacu = 1 << (32 - _PfkAitbe);
if (_bJwvjacu <= 2) return [];
const _UaflWlgF = Math.min(_qWFCUbLZ, _bJwvjacu - 2);
let _MfDnugCg = 0;
while (_oqpCrGJP.size < _UaflWlgF && _MfDnugCg < _UaflWlgF * 5) {
const _jbTkpNub = Math.floor(Math.random() * (_bJwvjacu - 2)) + 1;
_oqpCrGJP.add(_oCwQCJXx.fromLong4((_RAyzmmCF + _jbTkpNub) >>> 0));
_MfDnugCg++;
}
return Array.from(_oqpCrGJP);
} else if (_oCwQCJXx.isIPv6(range)) {
if (isNaN(_PfkAitbe) || _PfkAitbe < 16 || _PfkAitbe > 128) return [];
if (_PfkAitbe === 128) return [range];
const _arwHPssk = _oCwQCJXx.toBigInt6(range);
const _CEehHMev = (2n ** BigInt(128 - _PfkAitbe) - 1n);
const _RAyzmmCF = _arwHPssk & ~_CEehHMev;
const _TGmZdJhb = 2n ** BigInt(128 - _PfkAitbe);
if (_TGmZdJhb <= 2n) return [];
let _MfDnugCg = 0;
while (_oqpCrGJP.size < _qWFCUbLZ && _MfDnugCg < _qWFCUbLZ * 5) {
const _fBEqmxgr = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_fBEqmxgr);
let _AIhIpJSh = 0n;
for (const _oYVExInF of _fBEqmxgr) {
_AIhIpJSh = (_AIhIpJSh << 8n) | BigInt(_oYVExInF);
}
const _jbTkpNub = _AIhIpJSh % (_TGmZdJhb - 2n) + 1n;
_oqpCrGJP.add(_oCwQCJXx.fromBigInt6(_RAyzmmCF + _jbTkpNub));
_MfDnugCg++;
}
return Array.from(_oqpCrGJP);
}
return [];
} catch(_WVvkUBQv) {
console.error(`CIDR to range failed for ${cidr}:`, _WVvkUBQv);
return [];
}
}
};
function _ltxdfUwC(_iwKUyuiR, _RBWAsPWL) {
const _XMJklDqo = {};
const _AoWkCiCI = Object._AoWkCiCI(_RBWAsPWL);
const _ygIMngiC = _AoWkCiCI.map(_ICLvekXw => {
const _czjAwgxA = _iwKUyuiR * (_RBWAsPWL[_ICLvekXw] / 100);
return { _ICLvekXw, _qWFCUbLZ: Math.floor(_czjAwgxA), remainder: _czjAwgxA - Math.floor(_czjAwgxA) };
});
let _QbJWVwzP = _ygIMngiC.reduce((acc, _EItjThJU) => acc + _EItjThJU._qWFCUbLZ, 0);
_ygIMngiC.sort((a, b) => b.remainder - a.remainder);
let _TxHtULgR = _iwKUyuiR - _QbJWVwzP;
for (let _zoyRWIdH = 0; _zoyRWIdH < _TxHtULgR; _zoyRWIdH++) {
_ygIMngiC[_zoyRWIdH % _ygIMngiC._LFlZWewk]._qWFCUbLZ++;
}
for (const _EItjThJU of _ygIMngiC) {
_XMJklDqo[_EItjThJU._ICLvekXw] = _EItjThJU._qWFCUbLZ;
}
return _XMJklDqo;
}
const _yAJilWCs = __PAGE_DATA_JSON__;
const _tGUJUtcb = _yAJilWCs._vXpEJhzw;
const _fbMXGJzf = _yAJilWCs.status;
const _MOrCLroG = __ALL_CF_CIDR_LIST_JSON__;
const _vuyiFInG = __BALANCED_CF_CIDR_LIST_JSON__;
const _yMjODJzi = __DEFAULT_DOMAINS_LIST_JSON__;
const _MIURFruO = __COUNTRY_MAP_JSON__;
const _zCyKENRP = _MIURFruO;
const _lCBxlfdJ = 2500;
const _fMEfKxZu = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _cRSNAgVZ = document.getElementById('_cRSNAgVZ');
const _gUrPFwmS = document.getElementById('_gUrPFwmS');
const _vbXpUNeI = document.getElementById('status');
const _XlBlzKAQ = document.getElementById('_XlBlzKAQ');
const _LfpMNunQ = document.getElementById('resultsTable').querySelector('tbody');
const _feMEHzwA = document.getElementById('_feMEHzwA');
const _NsTmCMIx = document.getElementById('cachedResultsTable').querySelector('tbody');
const _huzFlKSc = document.getElementById('notificationTooltip');
const _lhkJyDaw = document.getElementById('_lhkJyDaw');
const _LwzxSTyx = document.getElementById('_LwzxSTyx');
const _PNgaFnXp = document.getElementById('_PNgaFnXp');
const _OGLzbbjO = document.getElementById('_OGLzbbjO');
const _EFWvEcLU = document.getElementById('_EFWvEcLU');
const _bNmFASTy = document.getElementById('_bNmFASTy');
const _WpuqoSjv = document.getElementById('_WpuqoSjv');
let _yXbsmtte = null;
let _fIIBrFfd = null;
let _bXyGaYUv = [];
let _GKGptwHw = false;
let _FlpTCDJe = null;
function _yIbUSUQb(_ZjMMYmzM, _iPhMzDyb) {
const _icaNgLSf=parseInt(_ZjMMYmzM.slice(1),16),t=_iPhMzDyb<0?0:255,p=_iPhMzDyb<0?_iPhMzDyb*-1:_iPhMzDyb,R=_icaNgLSf>>16,G=_icaNgLSf>>8&0x00FF,B=_icaNgLSf&0x0000FF;
const _PvgPLYdT = Math.round((t-R)*p)+R;
const _tlwjXwZo = Math.round((t-G)*p)+G;
const _aqifnRLX = Math.round((t-B)*p)+B;
return `rgb(${_PvgPLYdT.toString()}, ${_tlwjXwZo.toString()}, ${_aqifnRLX.toString()})`;
}
function _hpIaWPaP(_FFzGOKif) {
const _ysjHUgEu = _NqIHMhSU(_FFzGOKif.primaryColor);
if(_ysjHUgEu) {
document.documentElement._ctAAufha.setProperty('--primary-_vwIemexU-rgb', `${_ysjHUgEu.r},${_ysjHUgEu.g},${_ysjHUgEu.b}`);
}
document.documentElement._ctAAufha.setProperty('--primary-_vwIemexU', _FFzGOKif.primaryColor);
document.documentElement._ctAAufha.setProperty('--primary-hover', _yIbUSUQb(_FFzGOKif.primaryColor, -0.1));
document.documentElement._ctAAufha.setProperty('--primary-gradient-start', _yIbUSUQb(_FFzGOKif.primaryColor, 0.1));
document.documentElement._ctAAufha.setProperty('--primary-gradient-end', _yIbUSUQb(_FFzGOKif.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _FFzGOKif.texts.title;
document.title = _FFzGOKif.texts.title;
_lhkJyDaw.innerText = _yXbsmtte ? _FFzGOKif.texts.loginButtonSuccess : _FFzGOKif.texts.loginButton;
_lhkJyDaw._ctAAufha._vwIemexU = _FFzGOKif.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _FFzGOKif.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _FFzGOKif.texts.liveTitle;
document.getElementById('liveTitleEl')._ctAAufha._vwIemexU = _FFzGOKif.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _FFzGOKif.texts.cachedTitle;
document.getElementById('cachedTitleEl')._ctAAufha._vwIemexU = _FFzGOKif.colors.cachedTitle;
const _jgBuQvlC = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_jgBuQvlC.forEach((_LSXhjPpk, _FCoBBJdN) => {
const _GmWSyTqN = document.getElementById(_LSXhjPpk);
if (_GmWSyTqN) _GmWSyTqN.innerText = _FFzGOKif.texts[`tableHeader${_FCoBBJdN + 1}`] || '';
});
const _UuyZAkIe = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_UuyZAkIe.forEach((_LSXhjPpk, _FCoBBJdN) => {
const _GmWSyTqN = document.getElementById(_LSXhjPpk);
if (_GmWSyTqN) _GmWSyTqN.innerText = _tGUJUtcb.texts[`tableHeader${_FCoBBJdN + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._ctAAufha._vwIemexU = _FFzGOKif.colors.tableHeader);
document._uLVPUhBk.className = '';
document._uLVPUhBk.classList.add(_FFzGOKif.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_FFzGOKif.theme)) {
document._uLVPUhBk.classList.add('glassy-components');
}
document._uLVPUhBk._ctAAufha.backgroundImage = '';
_kTmNUdxe();
if (_FFzGOKif.theme.includes('particles') || _FFzGOKif.theme.includes('glass')) {
_vlFdEBHe(_FFzGOKif.particleColor);
} else if (_FFzGOKif.theme.includes('bing')) {
document._uLVPUhBk._ctAAufha.backgroundImage = '_OjAsMgfW(/bing-wallpaper)';
}
}
function _iIGbyRfk() {
_yXbsmtte = null;
if(_fIIBrFfd) clearTimeout(_fIIBrFfd);
_hpIaWPaP(_tGUJUtcb);
_UExzZLda("登录已超时,请重新登录。", "warning");
}
async function _mGITdDCf() {
if (_yXbsmtte) {
_dcqeeadU();
return;
}
const _aCSNMLjT = prompt('请输入管理员密码:');
if (!_aCSNMLjT) return;
try {
const _cxZNPbtJ = await fetch('/api/verify-_AFCpTXpv', {
method: 'POST',
_jgBuQvlC: { 'Content-Type': 'application/json' },
_uLVPUhBk: JSON.stringify({ _AFCpTXpv: _aCSNMLjT })
});
const _ZwEuDWAe = await _cxZNPbtJ.json();
if (_ZwEuDWAe.success) {
_yXbsmtte = _aCSNMLjT;
_UExzZLda("登录成功!有效期5分钟。", "success");
if (_fIIBrFfd) clearTimeout(_fIIBrFfd);
_fIIBrFfd = setTimeout(_iIGbyRfk, 5 * 60 * 1000);
_hpIaWPaP(_tGUJUtcb);
_dcqeeadU();
} else {
throw new Error(_ZwEuDWAe._ORsTYVew || '密码验证失败');
}
} catch (_WVvkUBQv) {
_UExzZLda(`登录失败: ${_WVvkUBQv._ORsTYVew}`, "error");
}
}
function _LnlbFPSp() {
if (!_fbMXGJzf._iOdXKLoz) {
_bNmFASTy._ctAAufha.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _AFCpTXpv = document.getElementById('initialPassword')._jVLvsPoc;
const _oIMzumwA = document.getElementById('confirmPassword')._jVLvsPoc;
if (_AFCpTXpv !== _oIMzumwA) {
_UExzZLda("两次输入的密码不一致!", "error");
return;
}
if (_AFCpTXpv._LFlZWewk < 6) {
_UExzZLda("密码长度不能少于6位!", "error");
return;
}
try {
const _cxZNPbtJ = await fetch('/api/_JSheqDrW-_AFCpTXpv', {
method: 'POST',
_jgBuQvlC: { 'Content-Type': 'application/json' },
_uLVPUhBk: JSON.stringify({ _AFCpTXpv })
});
const _ZwEuDWAe = await _cxZNPbtJ.json();
if (_ZwEuDWAe.success) {
_UExzZLda(_ZwEuDWAe._ORsTYVew, "success");
setTimeout(() => _voOLYFdE.reload(), 1500);
} else {
throw new Error(_ZwEuDWAe._ORsTYVew);
}
} catch(_WVvkUBQv) {
_UExzZLda(`设置密码失败: ${_WVvkUBQv._ORsTYVew}`, "error");
}
});
return;
}
_lhkJyDaw.addEventListener('click', _mGITdDCf);
document.getElementById('closeModalBtn').addEventListener('click', () => { _LwzxSTyx._ctAAufha.display = 'none'; });
_LwzxSTyx.addEventListener('click', (_WVvkUBQv) => { if (_WVvkUBQv.target === _LwzxSTyx) _LwzxSTyx._ctAAufha.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_kORxOamm .fine-grained-_WHtvpmzp-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-_kORxOamm .fine-grained-_WHtvpmzp-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_yXbsmtte) {
_UExzZLda("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _CPfixZRn = [];
document.querySelectorAll('#custom-fields-_kORxOamm .custom-field-_GTfWjals').forEach(_GTfWjals => {
const _TpTBpADN = _GTfWjals.querySelector('.custom-field-_TpTBpADN')._jVLvsPoc.trim();
const _jVLvsPoc = _GTfWjals.querySelector('.custom-field-_jVLvsPoc')._jVLvsPoc.trim();
if (_TpTBpADN) _CPfixZRn.push({ _TpTBpADN, _jVLvsPoc });
});
const _QxTHRutC = [];
document.querySelectorAll('#parameter-sets-_kORxOamm .parameter-_JSheqDrW-_GTfWjals').forEach(_GTfWjals => {
const _TpTBpADN = _GTfWjals.querySelector('.param-_JSheqDrW-_TpTBpADN')._jVLvsPoc.trim();
const _FmFgLerq = _GTfWjals.querySelector('.param-_JSheqDrW-_FmFgLerq')._jVLvsPoc.trim();
const _JYrGqVQM = _GTfWjals.querySelector('.param-_JSheqDrW-_JYrGqVQM')._jVLvsPoc.trim();
const _eNXPeMNh = _GTfWjals.querySelector('.param-_JSheqDrW-_eNXPeMNh')._jVLvsPoc.trim();
if(_TpTBpADN) _QxTHRutC.push({ _TpTBpADN, _FmFgLerq, '_JYrGqVQM': _JYrGqVQM, _eNXPeMNh });
});
const _FcnRHEcA = [];
document.querySelectorAll('#fine-grained-sources-_kORxOamm .fine-grained-_RkqyAnzQ-_GTfWjals').forEach(_GTfWjals => {
const _voOLYFdE = _GTfWjals.querySelector('.fine-grained-_voOLYFdE')._jVLvsPoc.trim();
const _oqpCrGJP = _GTfWjals.querySelector('.fine-grained-_oqpCrGJP')._jVLvsPoc.trim();
const _WHtvpmzp = _GTfWjals.querySelector('.fine-grained-_WHtvpmzp-cb').checked;
const _VVsLKSdl = parseInt(_GTfWjals.querySelector('.fine-grained-_VVsLKSdl')._jVLvsPoc, 10) || 0;
const _nacvVYKC = _GTfWjals.querySelector('.use-_TpTBpADN-as-_voOLYFdE-cb').checked;
if (_voOLYFdE && _oqpCrGJP) {
_FcnRHEcA.push({ _voOLYFdE, _oqpCrGJP, _WHtvpmzp, _VVsLKSdl, _nacvVYKC });
}
});
let _dtGPLGMJ = parseInt(document.getElementById('subscriptionIdLength')._jVLvsPoc, 10);
if (isNaN(_dtGPLGMJ) || _dtGPLGMJ < 2) _dtGPLGMJ = 2;
if (_dtGPLGMJ > 128) _dtGPLGMJ = 128;
const _ZTcmKHEL = {
theme: document.getElementById('themeSelect')._jVLvsPoc,
primaryColor: document.getElementById('primaryColorInput')._jVLvsPoc,
particleColor: document.getElementById('particleColorInput')._jVLvsPoc,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._jVLvsPoc,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._jVLvsPoc, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._jVLvsPoc, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._jVLvsPoc, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._jVLvsPoc, 10) || 0,
_cEWxDwqW: document.getElementById('converterServiceUrlInput')._jVLvsPoc.trim(),
subscriptionId: {
_LFlZWewk: _dtGPLGMJ,
_CmRWbkul: document.getElementById('subscriptionIdCharset')._jVLvsPoc.trim()
},
api: {
_WHtvpmzp: document.getElementById('enableApiCheckbox').checked,
_ORsTYVew: document.getElementById('apiMessageInput')._jVLvsPoc || '维护中...',
},
ispFilter: {
_WHtvpmzp: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._jVLvsPoc, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_WHtvpmzp: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_WHtvpmzp: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_OjAsMgfW: document.getElementById('websocketStreamerUrlInput')._jVLvsPoc.trim()
},
visitorPassword: {
_WHtvpmzp: document.getElementById('enableVisitorPasswordCheckbox').checked,
_AFCpTXpv: document.getElementById('visitorPasswordInput')._jVLvsPoc.trim()
},
customSubPath: {
_WHtvpmzp: document.getElementById('enableCustomSubPathCheckbox').checked,
_eNXPeMNh: document.getElementById('customSubPathInput')._jVLvsPoc.trim()
},
itemLink: {
_WHtvpmzp: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._jVLvsPoc,
selectionMode: document.getElementById('parameterSelectionMode')._jVLvsPoc,
_QxTHRutC: _QxTHRutC,
_CPfixZRn: _CPfixZRn,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._jVLvsPoc.trim(),
},
announcement: {
popup: {
_WHtvpmzp: document.getElementById('enablePopup').checked,
_ANodCKil: document.getElementById('announcementText')._jVLvsPoc,
_VFXqSiSW: parseInt(document.getElementById('popupDuration')._jVLvsPoc, 10) || 5
},
marquee: {
_WHtvpmzp: document.getElementById('enableMarquee').checked,
_ANodCKil: document.getElementById('announcementText')._jVLvsPoc
}
},
fineGrained: {
_WHtvpmzp: true,
sources: _FcnRHEcA
},
customNodes: {
_WHtvpmzp: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._jVLvsPoc
},
texts: {
title: document.getElementById('textInput_title')._jVLvsPoc,
loginButton: document.getElementById('textInput_loginButton')._jVLvsPoc,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._jVLvsPoc,
liveTitle: document.getElementById('textInput_liveTitle')._jVLvsPoc,
cachedTitle: document.getElementById('textInput_cachedTitle')._jVLvsPoc,
},
colors: {
title: document.getElementById('colorInput_title')._jVLvsPoc,
loginButton: document.getElementById('colorInput_loginButton')._jVLvsPoc,
liveTitle: document.getElementById('colorInput_liveTitle')._jVLvsPoc,
cachedTitle: document.getElementById('colorInput_cachedTitle')._jVLvsPoc,
tableHeader: document.getElementById('colorInput_tableHeader')._jVLvsPoc,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._jVLvsPoc.trim(),
chat_id: document.getElementById('chatIdInput')._jVLvsPoc.trim(),
},
};
try {
const _cxZNPbtJ = await fetch('/api/_vXpEJhzw', {
method: 'POST',
_jgBuQvlC: { 'Content-Type': 'application/json' },
_uLVPUhBk: JSON.stringify({ _vXpEJhzw: _ZTcmKHEL, adminPassword: _yXbsmtte })
});
const _ZwEuDWAe = await _cxZNPbtJ.json();
if (_cxZNPbtJ.ok && _ZwEuDWAe.success) {
_UExzZLda("配置已保存,正在刷新...", "success");
setTimeout(() => _voOLYFdE.reload(), 1500);
} else {
throw new Error(_ZwEuDWAe._ORsTYVew || '未知错误');
}
} catch (_WVvkUBQv) {
_UExzZLda(`操作失败: ${_WVvkUBQv._ORsTYVew}`, "error");
if (String(_WVvkUBQv._ORsTYVew).includes("密码错误")) {
_iIGbyRfk();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _jgGSemXL = document.getElementById('oldPasswordInput')._jVLvsPoc;
const _xUrQAUXG = document.getElementById('newPasswordInput')._jVLvsPoc;
if (!_jgGSemXL || !_xUrQAUXG) {
_UExzZLda("新旧密码均不能为空!", "error");
return;
}
try {
const _cxZNPbtJ = await fetch('/api/change-_AFCpTXpv', {
method: 'POST',
_jgBuQvlC: { 'Content-Type': 'application/json' },
_uLVPUhBk: JSON.stringify({ _jgGSemXL, _xUrQAUXG })
});
const _ZwEuDWAe = await _cxZNPbtJ.json();
if (_ZwEuDWAe.success) {
_UExzZLda(_ZwEuDWAe._ORsTYVew, "success");
document.getElementById('oldPasswordInput')._jVLvsPoc = '';
document.getElementById('newPasswordInput')._jVLvsPoc = '';
_yXbsmtte = _xUrQAUXG;
} else {
throw new Error(_ZwEuDWAe._ORsTYVew);
}
} catch(_WVvkUBQv) {
_UExzZLda(`修改密码失败: ${_WVvkUBQv._ORsTYVew}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_WVvkUBQv) => {
document.getElementById('resolvedDomainsGroup')._ctAAufha.display = _WVvkUBQv.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_WVvkUBQv) => {
document.getElementById('customNodesGroup')._ctAAufha.display = _WVvkUBQv.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_WVvkUBQv) => {
document.getElementById('apiConfigGroup')._ctAAufha.display = _WVvkUBQv.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_WVvkUBQv) => {
document.getElementById('itemLinkConfigGroup')._ctAAufha.display = _WVvkUBQv.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_WVvkUBQv) => {
document.getElementById('websocketStreamerGroup')._ctAAufha.display = _WVvkUBQv.target.checked ? 'block' : 'none';
const _UKRecpKE = document.querySelector('#parameter-sets-_kORxOamm .param-_JSheqDrW-_eNXPeMNh');
if (_UKRecpKE) {
if (_WVvkUBQv.target.checked) {
_UKRecpKE._jVLvsPoc = '/snippets?_BcVdQLAm=endpointAddress:_wUcuAeOY(443)&nat64=6to4';
} else {
_UKRecpKE._jVLvsPoc = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_tiLzwnLr('', '');
});
document.getElementById('add-parameter-_JSheqDrW-btn').addEventListener('click', () => {
const _qWFCUbLZ = document.querySelectorAll('.parameter-_JSheqDrW-_GTfWjals')._LFlZWewk + 1;
_SwfJxYAB({_TpTBpADN: `配置${_qWFCUbLZ}`, _FmFgLerq: '', _JYrGqVQM: '', _eNXPeMNh: ''});
_ddqZsOem();
});
document.getElementById('add-fine-grained-_RkqyAnzQ-btn').addEventListener('click', () => {
_gbprkefa({ _voOLYFdE: '', _oqpCrGJP: '', _WHtvpmzp: true, _VVsLKSdl: 50, _nacvVYKC: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_WVvkUBQv) => {
document.getElementById('visitorPasswordGroup')._ctAAufha.display = _WVvkUBQv.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_WVvkUBQv) => {
document.getElementById('customSubPathGroup')._ctAAufha.display = _WVvkUBQv.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_WVvkUBQv) => {
document.getElementById('popupDurationContainer')._ctAAufha.display = _WVvkUBQv.target.checked ? 'flex' : 'none';
});
}
function _tiLzwnLr(_TpTBpADN, _jVLvsPoc) {
const _kORxOamm = document.getElementById('custom-fields-_kORxOamm');
const _fgpJdBbL = document.createElement('div');
_fgpJdBbL.className = 'form-grid custom-field-_GTfWjals';
_fgpJdBbL._ctAAufha = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_fgpJdBbL.innerHTML = `
<input _AbWtAFlz="_ANodCKil" class="custom-field-_TpTBpADN" _QUzcAMBN="占位符名称" _jVLvsPoc="${_TpTBpADN}">
<input _AbWtAFlz="_ANodCKil" class="custom-field-_jVLvsPoc" _QUzcAMBN="值" _jVLvsPoc="${_jVLvsPoc}">
<button _AbWtAFlz="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_kORxOamm.appendChild(_fgpJdBbL);
}
function _SwfJxYAB(_JSheqDrW) {
const _kORxOamm = document.getElementById('parameter-sets-_kORxOamm');
const _fgpJdBbL = document.createElement('div');
_fgpJdBbL.className = 'parameter-_JSheqDrW-_GTfWjals';
_fgpJdBbL.innerHTML = `
<div class="parameter-_JSheqDrW-_XupMPSxH">
<input _AbWtAFlz="_ANodCKil" class="param-_JSheqDrW-_TpTBpADN" _QUzcAMBN="配置名称" _jVLvsPoc="${_JSheqDrW._TpTBpADN}" oninput="_ddqZsOem()">
<button _AbWtAFlz="button" class="btn btn-outline" onclick="this.closest('.parameter-_JSheqDrW-_GTfWjals').remove(); _ddqZsOem();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _AbWtAFlz="_ANodCKil" class="param-_JSheqDrW-_FmFgLerq" _jVLvsPoc="${_JSheqDrW._FmFgLerq || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _AbWtAFlz="_ANodCKil" class="param-_JSheqDrW-_JYrGqVQM" _jVLvsPoc="${_JSheqDrW['_JYrGqVQM'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _AbWtAFlz="_ANodCKil" class="param-_JSheqDrW-_eNXPeMNh" _jVLvsPoc="${_JSheqDrW._eNXPeMNh || ''}"></div>
</div>
`;
_kORxOamm.appendChild(_fgpJdBbL);
}
function _ddqZsOem() {
const _bGDNKhvY = document.getElementById('parameterSelectionMode');
const _wgqxIahW = _bGDNKhvY._jVLvsPoc;
_bGDNKhvY.innerHTML = '';
const _ZbEBerYe = document.createElement('_xoeodoRW');
_ZbEBerYe._jVLvsPoc = 'random';
_ZbEBerYe.textContent = '随机轮询';
_bGDNKhvY.appendChild(_ZbEBerYe);
const _BSFEBZAw = document.createElement('_xoeodoRW');
_BSFEBZAw._jVLvsPoc = 'first';
_BSFEBZAw.textContent = '使用第一组';
_bGDNKhvY.appendChild(_BSFEBZAw);
document.querySelectorAll('.param-_JSheqDrW-_TpTBpADN').forEach(input => {
const _TpTBpADN = input._jVLvsPoc.trim();
if (_TpTBpADN) {
const _xoeodoRW = document.createElement('_xoeodoRW');
_xoeodoRW._jVLvsPoc = _TpTBpADN;
_xoeodoRW.textContent = `指定: ${_TpTBpADN}`;
_bGDNKhvY.appendChild(_xoeodoRW);
}
});
if (Array.from(_bGDNKhvY.options).some(opt => opt._jVLvsPoc === _wgqxIahW)) {
_bGDNKhvY._jVLvsPoc = _wgqxIahW;
} else {
_bGDNKhvY._jVLvsPoc = 'random';
}
}
function _gbprkefa(_RkqyAnzQ) {
const _kORxOamm = document.getElementById('fine-grained-sources-_kORxOamm');
const _fgpJdBbL = document.createElement('div');
_fgpJdBbL.className = 'fine-grained-_RkqyAnzQ-_GTfWjals parameter-_JSheqDrW-_GTfWjals';
_fgpJdBbL._ctAAufha.padding = '1rem';
const _dozNcJiE = _RkqyAnzQ._nacvVYKC ? 'checked' : '';
const _dJsGNEUH = !_RkqyAnzQ._nacvVYKC ? 'checked' : '';
const _YQYGgrtw = _RkqyAnzQ._WHtvpmzp ? 'checked' : '';
_fgpJdBbL.innerHTML = `
<div _ctAAufha="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _AbWtAFlz="_ANodCKil" class="fine-grained-_voOLYFdE" _QUzcAMBN="地区名称 (如: 香港)" _jVLvsPoc="${_RkqyAnzQ._voOLYFdE || ''}">
<div _ctAAufha="display: flex; align-items: center; gap: 5px;"><input _AbWtAFlz="checkbox" class="fine-grained-_WHtvpmzp-cb" ${_YQYGgrtw}><label>启用</label></div>
<button _AbWtAFlz="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_RkqyAnzQ-_GTfWjals').remove()">删除</button>
</div>
<textarea class="fine-grained-_oqpCrGJP" _QUzcAMBN="IP源 (每行一个IP、CIDR或URL)" _knMsIuhz="3" _ctAAufha="_iqTZKBMZ:100%;">${_RkqyAnzQ._oqpCrGJP || ''}</textarea>
<div class="fine-grained-options" _ctAAufha="justify-_VPXKlmdE: space-between;">
<div _ctAAufha="display: flex; gap: 1rem;">
<label><input _AbWtAFlz="checkbox" class="query-_DJewlrxy-cb" ${_dJsGNEUH}>查询真实归属地</label>
<label><input _AbWtAFlz="checkbox" class="use-_TpTBpADN-as-_voOLYFdE-cb" ${_dozNcJiE}>使用地区名称作为归属地</label>
</div>
<div _ctAAufha="display: flex; align-items: center; gap: 5px;"><input _AbWtAFlz="number" class="fine-grained-_VVsLKSdl _VVsLKSdl-input" _jVLvsPoc="${_RkqyAnzQ._VVsLKSdl || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _vjRnwfXF = _fgpJdBbL.querySelector('.query-_DJewlrxy-cb');
const _iTiaumWH = _fgpJdBbL.querySelector('.use-_TpTBpADN-as-_voOLYFdE-cb');
_vjRnwfXF.addEventListener('change', () => {
if (_vjRnwfXF.checked) {
_iTiaumWH.checked = false;
} else if (!_iTiaumWH.checked) {
_vjRnwfXF.checked = true;
}
});
_iTiaumWH.addEventListener('change', () => {
if (_iTiaumWH.checked) {
_vjRnwfXF.checked = false;
} else if (!_iTiaumWH.checked) {
_iTiaumWH.checked = true;
}
});
_kORxOamm.appendChild(_fgpJdBbL);
}
function _dcqeeadU() {
const _FFzGOKif = _tGUJUtcb;
document.getElementById('themeSelect')._jVLvsPoc = _FFzGOKif.theme;
document.getElementById('primaryColorInput')._jVLvsPoc = _FFzGOKif.primaryColor;
document.getElementById('particleColorInput')._jVLvsPoc = _FFzGOKif.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _FFzGOKif.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._QUzcAMBN = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._jVLvsPoc = _FFzGOKif.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._ctAAufha.display = _FFzGOKif.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _FFzGOKif.customNodes._WHtvpmzp;
document.getElementById('customNodesInput')._jVLvsPoc = _FFzGOKif.customNodes.list || '';
document.getElementById('customNodesGroup')._ctAAufha.display = _FFzGOKif.customNodes._WHtvpmzp ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._jVLvsPoc = _FFzGOKif._cEWxDwqW || '';
document.getElementById('subscriptionIdLength')._jVLvsPoc = _FFzGOKif.subscriptionId._LFlZWewk;
document.getElementById('subscriptionIdCharset')._jVLvsPoc = _FFzGOKif.subscriptionId._CmRWbkul;
document.getElementById('enableItemLinkCheckbox').checked = _FFzGOKif.itemLink._WHtvpmzp;
document.getElementById('itemLinkConfigGroup')._ctAAufha.display = _FFzGOKif.itemLink._WHtvpmzp ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._jVLvsPoc = _FFzGOKif.itemLink.template;
const _NIWIIxYQ = document.getElementById('parameter-sets-_kORxOamm');
_NIWIIxYQ.innerHTML = '';
if (_FFzGOKif.itemLink._QxTHRutC && Array.isArray(_FFzGOKif.itemLink._QxTHRutC)) {
_FFzGOKif.itemLink._QxTHRutC.forEach(_JSheqDrW => _SwfJxYAB(_JSheqDrW));
}
_ddqZsOem();
document.getElementById('parameterSelectionMode')._jVLvsPoc = _FFzGOKif.itemLink.selectionMode || 'random';
const _UKRecpKE = document.querySelector('#parameter-sets-_kORxOamm .param-_JSheqDrW-_eNXPeMNh');
if (_UKRecpKE && _FFzGOKif.websocketStreamer && _FFzGOKif.websocketStreamer._WHtvpmzp) {
_UKRecpKE._jVLvsPoc = '/snippets?_BcVdQLAm=endpointAddress:_wUcuAeOY(443)&nat64=6to4';
}
const _ObzhWdYv = document.getElementById('custom-fields-_kORxOamm');
_ObzhWdYv.innerHTML = '';
if (_FFzGOKif.itemLink._CPfixZRn && Array.isArray(_FFzGOKif.itemLink._CPfixZRn)) {
_FFzGOKif.itemLink._CPfixZRn.forEach(field => _tiLzwnLr(field._TpTBpADN, field._jVLvsPoc));
}
document.getElementById('universalFallbackAddressInput')._jVLvsPoc = _FFzGOKif.dataFeeds.universalFallbackAddress || '';
const _MOMkiEnh = _FFzGOKif.websocketStreamer && _FFzGOKif.websocketStreamer._WHtvpmzp;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _MOMkiEnh;
document.getElementById('websocketStreamerUrlInput')._jVLvsPoc = _FFzGOKif.websocketStreamer ? _FFzGOKif.websocketStreamer._OjAsMgfW : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._ctAAufha.display = _MOMkiEnh ? 'block' : 'none';
const _dIKIdrbQ = _FFzGOKif.announcement || {};
document.getElementById('announcementText')._jVLvsPoc = (_dIKIdrbQ.popup && _dIKIdrbQ.popup._ANodCKil) || (_dIKIdrbQ.marquee && _dIKIdrbQ.marquee._ANodCKil) || '';
document.getElementById('enableMarquee').checked = _dIKIdrbQ.marquee && _dIKIdrbQ.marquee._WHtvpmzp;
document.getElementById('enablePopup').checked = _dIKIdrbQ.popup && _dIKIdrbQ.popup._WHtvpmzp;
document.getElementById('popupDuration')._jVLvsPoc = (_dIKIdrbQ.popup && _dIKIdrbQ.popup._VFXqSiSW) || 5;
document.getElementById('popupDurationContainer')._ctAAufha.display = (_dIKIdrbQ.popup && _dIKIdrbQ.popup._WHtvpmzp) ? 'flex' : 'none';
const _syvTjKYl = document.getElementById('fine-grained-sources-_kORxOamm');
_syvTjKYl.innerHTML = '';
if (_FFzGOKif.fineGrained.sources && Array.isArray(_FFzGOKif.fineGrained.sources)) {
_FFzGOKif.fineGrained.sources.forEach(_RkqyAnzQ => _gbprkefa(_RkqyAnzQ));
}
document.getElementById('sampleSizeInput')._jVLvsPoc = _FFzGOKif.sampleSize;
document.getElementById('topNInput')._jVLvsPoc = _FFzGOKif.topN;
document.getElementById('latencyRangeMinInput')._jVLvsPoc = _FFzGOKif.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._jVLvsPoc = _FFzGOKif.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _FFzGOKif.ispFilter._WHtvpmzp;
const _DknDdUXH = _FFzGOKif.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._jVLvsPoc = _DknDdUXH.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _DknDdUXH.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _FFzGOKif.streamer._WHtvpmzp;
document.getElementById('enableApiCheckbox').checked = _FFzGOKif.api._WHtvpmzp;
document.getElementById('apiConfigGroup')._ctAAufha.display = _FFzGOKif.api._WHtvpmzp ? 'block' : 'none';
document.getElementById('apiMessageInput')._jVLvsPoc = _FFzGOKif.api._ORsTYVew;
const _nxXNGxzO = _FFzGOKif.customSubPath && _FFzGOKif.customSubPath._WHtvpmzp;
document.getElementById('enableCustomSubPathCheckbox').checked = _nxXNGxzO;
document.getElementById('customSubPathInput')._jVLvsPoc = _FFzGOKif.customSubPath ? _FFzGOKif.customSubPath._eNXPeMNh : 'latest';
document.getElementById('customSubPathGroup')._ctAAufha.display = _nxXNGxzO ? 'block' : 'none';
const _TpQvjVqT = _FFzGOKif.visitorPassword && _FFzGOKif.visitorPassword._WHtvpmzp;
document.getElementById('enableVisitorPasswordCheckbox').checked = _TpQvjVqT;
document.getElementById('visitorPasswordInput')._jVLvsPoc = _FFzGOKif.visitorPassword ? _FFzGOKif.visitorPassword._AFCpTXpv : '';
document.getElementById('visitorPasswordGroup')._ctAAufha.display = _TpQvjVqT ? 'block' : 'none';
document.getElementById('textInput_title')._jVLvsPoc = _FFzGOKif.texts.title;
document.getElementById('textInput_loginButton')._jVLvsPoc = _FFzGOKif.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._jVLvsPoc = _FFzGOKif.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._jVLvsPoc = _FFzGOKif.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._jVLvsPoc = _FFzGOKif.texts.cachedTitle;
document.getElementById('colorInput_title')._jVLvsPoc = _FFzGOKif.colors.title;
document.getElementById('colorInput_loginButton')._jVLvsPoc = _FFzGOKif.colors.loginButton;
document.getElementById('colorInput_liveTitle')._jVLvsPoc = _FFzGOKif.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._jVLvsPoc = _FFzGOKif.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._jVLvsPoc = _FFzGOKif.colors.tableHeader;
document.getElementById('botTokenInput')._jVLvsPoc = _FFzGOKif.telegram.bot_token || '';
document.getElementById('chatIdInput')._jVLvsPoc = _FFzGOKif.telegram.chat_id || '';
_LwzxSTyx._ctAAufha.display = 'flex';
}
function _ZuOtpyBn(_yYOkTcXH) {
if (window.innerWidth <= 768) {
const _knMsIuhz = _yYOkTcXH.querySelectorAll('thead tr, tbody tr');
_knMsIuhz.forEach(_GTfWjals => {
const _EthFNOGQ = Array.from(_GTfWjals.children);
const _iKnuwpGe = [
_EthFNOGQ[0],
_EthFNOGQ[1],
_EthFNOGQ[3],
_EthFNOGQ[6],
_EthFNOGQ[2],
_EthFNOGQ[4],
_EthFNOGQ[5]
];
_iKnuwpGe.forEach(cell => _GTfWjals.appendChild(cell));
});
}
}
async function _rcXGRmtn() {
if (!_fbMXGJzf._iOdXKLoz) {
_LnlbFPSp();
return;
}
if (_tGUJUtcb.announcement && _tGUJUtcb.announcement.marquee && _tGUJUtcb.announcement.marquee._WHtvpmzp && _tGUJUtcb.announcement.marquee._ANodCKil) {
const _UuUFmVHl = document.getElementById('marquee-_kORxOamm');
const _ijhXslQe = document.getElementById('marquee-_ANodCKil');
const _YvmAKLyw = document.querySelector('.progress-section');
if (_UuUFmVHl && _ijhXslQe && _YvmAKLyw) {
_ijhXslQe.innerText = _tGUJUtcb.announcement.marquee._ANodCKil;
_UuUFmVHl._ctAAufha.display = 'block';
const _vWILSuDc = () => {
_UuUFmVHl._ctAAufha._iqTZKBMZ = `${_YvmAKLyw.offsetWidth}px`;
const _XiYVXTHU = _ijhXslQe.offsetWidth;
const _EUcVqhYB = _UuUFmVHl.offsetWidth;
const _VFXqSiSW = (_XiYVXTHU + _EUcVqhYB) / 100;
_ijhXslQe._ctAAufha.animationDuration = `${Math.max(10, _VFXqSiSW)}s`;
};
_vWILSuDc();
window.addEventListener('resize', _vWILSuDc);
}
}
_hpIaWPaP(_tGUJUtcb);
if (_tGUJUtcb.announcement && _tGUJUtcb.announcement.popup && _tGUJUtcb.announcement.popup._WHtvpmzp && _tGUJUtcb.announcement.popup._ANodCKil) {
setTimeout(() => {
_UExzZLda(_tGUJUtcb.announcement.popup._ANodCKil, 'info', _tGUJUtcb.announcement.popup._VFXqSiSW * 1000);
}, 500);
}
_LnlbFPSp();
_mDWINyYw();
_drItNeBN();
_qLxUkwSX();
await _BuwrrGQh();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _cWNupOUy = window._voOLYFdE.origin + '/_BcVdQLAm';
navigator.clipboard.writeText(_cWNupOUy).then(() => {
_UExzZLda('IP 列表 API 地址已复制!', 'success');
});
});
if (_tGUJUtcb.visitorPassword && _tGUJUtcb.visitorPassword._WHtvpmzp) {
_cRSNAgVZ._ctAAufha.display = 'none';
const _hmjiyrRH = document.getElementById('visitorPasswordPrompt');
_hmjiyrRH._ctAAufha.display = 'block';
const _cRehTlPf = document.getElementById('visitorPasswordEntry');
const _qlOkBqCw = document.getElementById('startTestWithPasswordBtn');
const _baUxRxqw = async () => {
const _AFCpTXpv = _cRehTlPf._jVLvsPoc;
if (!_AFCpTXpv) {
_UExzZLda('请输入访客密码', 'warning');
return;
}
try {
const _cxZNPbtJ = await fetch('/api/verify-visitor-_AFCpTXpv', {
method: 'POST',
_jgBuQvlC: { 'Content-Type': 'application/json' },
_uLVPUhBk: JSON.stringify({ _AFCpTXpv })
});
const _ZwEuDWAe = await _cxZNPbtJ.json();
if (_cxZNPbtJ.ok && _ZwEuDWAe.success) {
_UExzZLda('验证成功,开始测试...', 'success');
_hmjiyrRH._ctAAufha.display = 'none';
_cRSNAgVZ._ctAAufha.display = 'block';
await _DFEXFBPu();
} else {
throw new Error(_ZwEuDWAe._ORsTYVew || '密码错误');
}
} catch (_WVvkUBQv) {
_UExzZLda(`验证失败: ${_WVvkUBQv._ORsTYVew}`, "error");
_cRehTlPf._jVLvsPoc = '';
_cRehTlPf.focus();
}
};
_qlOkBqCw.addEventListener('click', _baUxRxqw);
_cRehTlPf.addEventListener('keypress', (_WVvkUBQv) => {
if (_WVvkUBQv._ICLvekXw === 'Enter') {
_WVvkUBQv.preventDefault();
_baUxRxqw();
}
});
_cRehTlPf.focus();
} else {
_vbXpUNeI.textContent = "页面加载完成,准备开始测试...";
await _pDwYBgbo(100);
await _DFEXFBPu();
}
}
async function _pDwYBgbo(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _NqIHMhSU(_ZjMMYmzM) {
let _ZwEuDWAe = /^#?([a-_icaNgLSf\d]{2})([a-_icaNgLSf\d]{2})([a-_icaNgLSf\d]{2})$/_zoyRWIdH.exec(_ZjMMYmzM);
return _ZwEuDWAe ? { r: parseInt(_ZwEuDWAe[1], 16), g: parseInt(_ZwEuDWAe[2], 16), b: parseInt(_ZwEuDWAe[3], 16) } : null;
}
async function _ENIzhVAT(_BcVdQLAm) {
const _DGttpBMM = new AbortController();
const _eJUiVyzk = setTimeout(() => _DGttpBMM.abort(), _lCBxlfdJ);
const _wyKHudMr = Date.now();
try {
const _GIUaNlLE = _oCwQCJXx.isIPv6(_BcVdQLAm) ? `[${_BcVdQLAm}]` : _BcVdQLAm;
const _OjAsMgfW = `https://${_GIUaNlLE}/cdn-cgi/trace`;
await fetch(_OjAsMgfW, {
signal: _DGttpBMM.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._TpTBpADN === 'AbortError') {
return { _BcVdQLAm, _uSFviila: Infinity, error: '超时' };
}
} finally {
clearTimeout(_eJUiVyzk);
}
const _uSFviila = Date.now() - _wyKHudMr;
return { _BcVdQLAm, _uSFviila: _uSFviila, error: null };
}
function _eNBTojhK(_ZwEuDWAe, _FCoBBJdN) {
const { itemLink } = _tGUJUtcb;
if (!itemLink || !itemLink._WHtvpmzp) return null;
const { template, _QxTHRutC, selectionMode, _CPfixZRn } = itemLink;
if (!_QxTHRutC || _QxTHRutC._LFlZWewk === 0) return null;
let _BqyZEbaw;
if (selectionMode === 'random') {
_BqyZEbaw = _QxTHRutC[_FCoBBJdN % _QxTHRutC._LFlZWewk];
} else if (selectionMode === 'first') {
_BqyZEbaw = _QxTHRutC[0];
} else {
_BqyZEbaw = _QxTHRutC.find(s => s._TpTBpADN === selectionMode) || _QxTHRutC[0];
}
if (!_BqyZEbaw) return null;
let _zPMYsZXG = template;
const _GZkrYSVR = _ZwEuDWAe._wUcuAeOY || 443;
const _WmNoRkDZ = _oCwQCJXx.isIPv6(_ZwEuDWAe._BcVdQLAm) ? `[${_ZwEuDWAe._BcVdQLAm}]` : _ZwEuDWAe._BcVdQLAm;
let _TpTBpADN = `${_FCoBBJdN + 1} 、 ${_ZwEuDWAe._voOLYFdE || '未知'}`;
if (!_ZwEuDWAe._uUBPoNBv || !_ZwEuDWAe._uUBPoNBv.toLowerCase().includes('cloudflare')) {
_TpTBpADN += '(反代)';
}
let _FmFgLerq = _BqyZEbaw._FmFgLerq || window._voOLYFdE._xOcuTxct;
_zPMYsZXG = _zPMYsZXG.replace(/{_BcVdQLAm}/g, _WmNoRkDZ)
.replace(/{_wUcuAeOY}/g, _GZkrYSVR)
.replace(/{_TpTBpADN}/g, encodeURIComponent(_TpTBpADN))
.replace(/{rank}/g, _FCoBBJdN + 1)
.replace(/{_voOLYFdE}/g, encodeURIComponent(_ZwEuDWAe._voOLYFdE || '未知'))
.replace(/{_uUBPoNBv}/g, encodeURIComponent(_ZwEuDWAe._uUBPoNBv || '未知'))
.replace(/{_FmFgLerq}/g, encodeURIComponent(_FmFgLerq))
.replace(/{_JYrGqVQM}/g, encodeURIComponent(_BqyZEbaw['_JYrGqVQM'] || ''))
.replace(/{_eNXPeMNh}/g, encodeURIComponent(encodeURIComponent(_BqyZEbaw._eNXPeMNh || '')));
if (_CPfixZRn) {
_CPfixZRn.forEach(field => {
const _QUzcAMBN = new RegExp('{' + field._TpTBpADN + '}', 'g');
_zPMYsZXG = _zPMYsZXG.replace(_QUzcAMBN, encodeURIComponent(field._jVLvsPoc));
});
}
return _zPMYsZXG;
}
function _ZruTHteZ(_TcYqzPgL, _akLyfwEl, isCached = false) {
_akLyfwEl.innerHTML = '';
const _dGyFAfIJ = _TcYqzPgL._dGyFAfIJ || [];
const _FgwaBdOT = _TcYqzPgL.generatedBy || null;
const _ZQgNgwHr = isCached ? _feMEHzwA : _XlBlzKAQ;
const _rUtINAlE = isCached ? (_feMEHzwA.querySelector('.generator-info')) : (_XlBlzKAQ.querySelector('.generator-info'));
if (_dGyFAfIJ._LFlZWewk === 0) {
_ZQgNgwHr._ctAAufha.display = 'none';
if (!isCached) _WpuqoSjv._ctAAufha.display = 'none';
if (_rUtINAlE) _rUtINAlE.textContent = '';
return;
}
_ZQgNgwHr._ctAAufha.display = 'block';
if (!isCached && _dGyFAfIJ._LFlZWewk > 0) {
_WpuqoSjv._ctAAufha.display = 'block';
}
if (_rUtINAlE && _FgwaBdOT) {
_rUtINAlE.innerHTML = `数据来源 ${_FgwaBdOT._BcVdQLAm} (${_FgwaBdOT._voOLYFdE}) <span>${_FgwaBdOT.time}</span>`;
}
_dGyFAfIJ.forEach((_ZwEuDWAe, _FCoBBJdN) => {
const _GZkrYSVR = _ZwEuDWAe._wUcuAeOY || 443;
const _GTfWjals = _akLyfwEl.insertRow();
_GTfWjals.insertCell().textContent = _FCoBBJdN + 1;
const _ZDaMTbql = _GTfWjals.insertCell();
_ZDaMTbql.textContent = _ZwEuDWAe._BcVdQLAm;
_ZDaMTbql.className = '_BcVdQLAm-_TtJwkdcx';
_GTfWjals.insertCell().textContent = _GZkrYSVR;
const _NGNdpRxd = _GTfWjals.insertCell();
_NGNdpRxd.textContent = (_ZwEuDWAe._uSFviila === Infinity) ? (_ZwEuDWAe.error || '错误') : _ZwEuDWAe._uSFviila;
_NGNdpRxd.className = 'ping-_jVLvsPoc';
_GTfWjals.insertCell().textContent = _ZwEuDWAe._voOLYFdE || '未知';
_GTfWjals.insertCell().textContent = _ZwEuDWAe._uUBPoNBv || '未知';
const _EWxlCQDd = _GTfWjals.insertCell();
_EWxlCQDd.className = 'actions-cell';
const _bmqoNmar = document.createElement('button');
_bmqoNmar.textContent = '复制IP';
_bmqoNmar.className = 'btn btn-outline';
_bmqoNmar.onclick = () => { navigator.clipboard.writeText(_ZwEuDWAe._BcVdQLAm).then(() => _UExzZLda('IP复制成功!', 'success')); };
if (_tGUJUtcb.itemLink && _tGUJUtcb.itemLink._WHtvpmzp) {
const _EXlKhyVZ = document.createElement('button');
_EXlKhyVZ.textContent = '复制节点';
_EXlKhyVZ.className = 'btn btn-outline';
_EXlKhyVZ.onclick = () => {
const _zPMYsZXG = _eNBTojhK(_ZwEuDWAe, _FCoBBJdN);
if (_zPMYsZXG) {
navigator.clipboard.writeText(_zPMYsZXG).then(() => _UExzZLda('订阅链接复制成功!', 'success'));
}
};
_EWxlCQDd.appendChild(_EXlKhyVZ);
}
_EWxlCQDd.appendChild(_bmqoNmar);
});
_ZuOtpyBn(_akLyfwEl.parentElement);
}
async function _DRworkfg(_tZFSVeCR) {
const _GKLkEXlT = (_tZFSVeCR || '').trim().split(/\s+|\n+/).filter(Boolean);
const _OLqPSnWk = [];
const _QKxBqBzm = [];
const _SwNABjyh = (str) => {
try {
const _OjAsMgfW = new URL(str);
return _OjAsMgfW.protocol === "http:" || _OjAsMgfW.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _PqucnEzM of _GKLkEXlT) {
if (_SwNABjyh(_PqucnEzM)) {
_OLqPSnWk.push(_PqucnEzM);
} else {
_QKxBqBzm.push(_PqucnEzM);
}
}
let _QCOtKsSF = [];
if (_OLqPSnWk._LFlZWewk > 0) {
try {
const _cxZNPbtJ = await fetch('/api/parse-_oqpCrGJP-from-_OLqPSnWk', {
method: 'POST',
_jgBuQvlC: { 'Content-Type': 'application/json' },
_uLVPUhBk: JSON.stringify({ _OLqPSnWk })
});
if (_cxZNPbtJ.ok) {
const _TcYqzPgL = await _cxZNPbtJ.json();
_QCOtKsSF = _TcYqzPgL._oqpCrGJP || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _cxZNPbtJ._ANodCKil());
_UExzZLda('从URL获取IP失败', 'error');
}
} catch (_WVvkUBQv) {
console.error('Error fetching IPs from URLs:', _WVvkUBQv);
_UExzZLda(`从URL获取IP失败: ${_WVvkUBQv._ORsTYVew}`, 'error');
}
}
return [..._QKxBqBzm, ..._QCOtKsSF];
}
async function _DFEXFBPu() {
_GKGptwHw = false;
_bXyGaYUv = [];
_FlpTCDJe = null;
_WpuqoSjv._ctAAufha.display = 'none';
_vbXpUNeI.textContent = '准备IP源...';
_gUrPFwmS._jVLvsPoc = 0;
_XlBlzKAQ._ctAAufha.display = 'none';
await _pDwYBgbo();
const _PBAXkGDP = new Map();
let _NWMkfjZQ = [];
const _UMYFWmFY = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_tGUJUtcb.useResolvedDomains) {
_vbXpUNeI.textContent = '正在从域名解析IP...';
const _vzxZTGoc = (_tGUJUtcb.resolvedDomains || '').trim();
const _UkXRQKOC = _vzxZTGoc ? _vzxZTGoc.split(/\s+|\n+/) : _yMjODJzi;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_oqpCrGJP', { method: 'POST', _jgBuQvlC: { 'Content-Type': 'application/json' }, _uLVPUhBk: JSON.stringify({ _UkXRQKOC, _AbWtAFlz: 'A' }) }),
fetch('/api/get-resolved-_oqpCrGJP', { method: 'POST', _jgBuQvlC: { 'Content-Type': 'application/json' }, _uLVPUhBk: JSON.stringify({ _UkXRQKOC, _AbWtAFlz: 'AAAA' }) })
]);
let _nDsaWUxY = [];
if (ipv4Response.ok) _nDsaWUxY.push(...(await ipv4Response._ANodCKil()).split(/\s+|\n+/));
if (ipv6Response.ok) _nDsaWUxY.push(...(await ipv6Response._ANodCKil()).split(/\s+|\n+/));
_NWMkfjZQ.push(..._nDsaWUxY.filter(_BcVdQLAm => _BcVdQLAm.trim()).map(_BcVdQLAm => ({ _BcVdQLAm, _wUcuAeOY: null, sourceName: 'resolved' })));
} catch (_WVvkUBQv) {
_UExzZLda(`域名解析失败: ${_WVvkUBQv._ORsTYVew}`, 'error');
}
}
const _oyCwZRgG = (_tGUJUtcb.fineGrained.sources || []).filter(s => s._WHtvpmzp);
if (_oyCwZRgG._LFlZWewk > 0) {
const _gzmcrLaU = {};
let _XbXeNQbn = 0;
_oyCwZRgG.forEach(s => {
const _gRAkreyn = Number(s._VVsLKSdl) || 0;
_gzmcrLaU[s._voOLYFdE] = _gRAkreyn;
_XbXeNQbn += _gRAkreyn;
});
if (_XbXeNQbn > 0) {
Object._AoWkCiCI(_gzmcrLaU).forEach(k => {
_gzmcrLaU[k] = (_gzmcrLaU[k] / _XbXeNQbn) * 100;
});
} else {
_oyCwZRgG.forEach(s => _gzmcrLaU[s._voOLYFdE] = 100 / _oyCwZRgG._LFlZWewk);
}
const _TFTzXDni = _ltxdfUwC(_tGUJUtcb.sampleSize, _gzmcrLaU);
for (const _RkqyAnzQ of _oyCwZRgG) {
const _qWFCUbLZ = _TFTzXDni[_RkqyAnzQ._voOLYFdE];
if (!_qWFCUbLZ) continue;
_vbXpUNeI.textContent = `正在处理 [ ${_RkqyAnzQ._voOLYFdE} ] 源...`;
const _kBzsVSKQ = await _DRworkfg(_RkqyAnzQ._oqpCrGJP);
if (_RkqyAnzQ._nacvVYKC) {
_kBzsVSKQ.forEach(_PqucnEzM => _PBAXkGDP._JSheqDrW(_PqucnEzM, _RkqyAnzQ._voOLYFdE));
}
let _WVCrwbPU = [];
const _RtgfNSmV = Math.ceil(_qWFCUbLZ / (_kBzsVSKQ._LFlZWewk || 1)) || 1;
for (const _PqucnEzM of _kBzsVSKQ) {
if (_UMYFWmFY.test(_PqucnEzM)) {
const _lYYCuIix = _oCwQCJXx.cidrToRange(_PqucnEzM, _RtgfNSmV);
if (_PBAXkGDP.has(_PqucnEzM)) {
_lYYCuIix.forEach(_BcVdQLAm => _PBAXkGDP._JSheqDrW(_BcVdQLAm, _PBAXkGDP.get(_PqucnEzM)));
}
_WVCrwbPU.push(..._lYYCuIix.map(_BcVdQLAm => ({ _BcVdQLAm, _wUcuAeOY: null })));
} else {
const _UYKlleKG = _PqucnEzM.lastIndexOf(':');
let _BcVdQLAm = _PqucnEzM;
let _wUcuAeOY = null;
if (_UYKlleKG > _PqucnEzM.lastIndexOf(']')) {
const _EIOqjgSN = _PqucnEzM.substring(_UYKlleKG + 1);
if (!isNaN(_EIOqjgSN) && _EIOqjgSN._LFlZWewk > 0) {
_BcVdQLAm = _PqucnEzM.substring(0, _UYKlleKG);
_wUcuAeOY = _EIOqjgSN;
}
}
if (_oCwQCJXx.isValid(_BcVdQLAm.replace(/[\[\]]/g, ''))) {
_WVCrwbPU.push({ _BcVdQLAm: _BcVdQLAm.replace(/[\[\]]/g, ''), _wUcuAeOY });
}
}
}
let _syjQnSmM = _WVCrwbPU.filter((v,_zoyRWIdH,a)=>a.findIndex(t=>(t._BcVdQLAm === v._BcVdQLAm && t._wUcuAeOY === v._wUcuAeOY))===_zoyRWIdH);
_syjQnSmM.sort(() => 0.5 - Math.random());
_NWMkfjZQ.push(..._syjQnSmM.slice(0, _qWFCUbLZ).map(_FFywGbWb => ({ ..._FFywGbWb, sourceName: `fineGrained-${_RkqyAnzQ._voOLYFdE}` })));
}
}
if (_NWMkfjZQ._LFlZWewk === 0) {
_vbXpUNeI.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_vbXpUNeI.textContent = `开始测试 ${_NWMkfjZQ._LFlZWewk} 个IP地址...`;
_gUrPFwmS.max = _NWMkfjZQ._LFlZWewk;
let _CcRfJkkD = 0;
const _svrRGnwd = [];
const _UyXfoaGv = [..._NWMkfjZQ];
const _dFvmKsMT = async () => {
while (_UyXfoaGv._LFlZWewk > 0) {
const _FFywGbWb = _UyXfoaGv.shift(); if (!_FFywGbWb) continue;
const _ZwEuDWAe = await _ENIzhVAT(_FFywGbWb._BcVdQLAm);
_svrRGnwd.push({ ..._FFywGbWb, ..._ZwEuDWAe });
_CcRfJkkD++;
_gUrPFwmS._jVLvsPoc = _CcRfJkkD;
_vbXpUNeI.textContent = `${_tGUJUtcb.texts.pingInProgress} (${_CcRfJkkD}/${_NWMkfjZQ._LFlZWewk}): ${_FFywGbWb._BcVdQLAm} - ${_ZwEuDWAe._uSFviila === Infinity ? _ZwEuDWAe.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_fMEfKxZu).fill(null).map(_dFvmKsMT));
let _fEbogEZX = _svrRGnwd.filter(r => r._uSFviila !== Infinity);
let _qoTejHHw = [];
const _wDrRyFPN = _fEbogEZX.filter(r => r.sourceName.startsWith('fineGrained-'));
const _WSHktGsb = _fEbogEZX.filter(r => r.sourceName === 'resolved');
if (_wDrRyFPN._LFlZWewk > 0) {
const _oyCwZRgG = (_tGUJUtcb.fineGrained.sources || []).filter(s => s._WHtvpmzp);
const _gzmcrLaU = {};
let _XbXeNQbn = 0;
_oyCwZRgG.forEach(s => {
const _gRAkreyn = Number(s._VVsLKSdl) || 0;
_gzmcrLaU[s._voOLYFdE] = _gRAkreyn;
_XbXeNQbn += _gRAkreyn;
});
if (_XbXeNQbn > 0) {
Object._AoWkCiCI(_gzmcrLaU).forEach(k => _gzmcrLaU[k] = (_gzmcrLaU[k] / _XbXeNQbn) * 100);
} else if (_oyCwZRgG._LFlZWewk > 0) {
_oyCwZRgG.forEach(s => _gzmcrLaU[s._voOLYFdE] = 100 / _oyCwZRgG._LFlZWewk);
}
const _pEVSXerV = _ltxdfUwC(_tGUJUtcb.topN, _gzmcrLaU);
for(const _VvXnfxHn in _pEVSXerV) {
const _CmniomUI = _wDrRyFPN.filter(r => r.sourceName === `fineGrained-${_VvXnfxHn}`);
_CmniomUI.sort((a,b) => a._uSFviila - b._uSFviila);
_qoTejHHw.push(..._CmniomUI.slice(0, _pEVSXerV[_VvXnfxHn]));
}
}
_WSHktGsb.sort((a, b) => a._uSFviila - b._uSFviila);
_qoTejHHw.push(..._WSHktGsb);
if (_qoTejHHw._LFlZWewk > 0) {
_vbXpUNeI.textContent = '获取归属地和运营商信息...';
const _XhppyvFp = [];
_qoTejHHw.forEach(_ZwEuDWAe => {
if (_PBAXkGDP.has(_ZwEuDWAe._BcVdQLAm)) {
_ZwEuDWAe._voOLYFdE = _PBAXkGDP.get(_ZwEuDWAe._BcVdQLAm);
_ZwEuDWAe._uUBPoNBv = 'Cloudflare';
} else {
_XhppyvFp.push(_ZwEuDWAe._BcVdQLAm);
}
});
if (_XhppyvFp._LFlZWewk > 0) {
try {
const _dWgBnbSa = await fetch('/api/get-_DJewlrxy', {
method: 'POST',
_jgBuQvlC: { 'Content-Type': 'application/json' },
_uLVPUhBk: JSON.stringify({ _oqpCrGJP: _XhppyvFp })
});
if (_dWgBnbSa.ok) {
const _cgxPcYrq = await _dWgBnbSa.json();
const _AHJKiWeH = new Map(_cgxPcYrq.map(_FFywGbWb => [_FFywGbWb._BcVdQLAm, { _voOLYFdE: _FFywGbWb._voOLYFdE, _uUBPoNBv: _FFywGbWb._uUBPoNBv }]));
_qoTejHHw.forEach(_ZwEuDWAe => {
if (_XhppyvFp.includes(_ZwEuDWAe._BcVdQLAm)) {
const _DJewlrxy = _AHJKiWeH.get(_ZwEuDWAe._BcVdQLAm);
_ZwEuDWAe._voOLYFdE = _DJewlrxy ? _DJewlrxy._voOLYFdE : '查询失败';
_ZwEuDWAe._uUBPoNBv = _DJewlrxy ? _DJewlrxy._uUBPoNBv : '查询失败';
}
});
}
} catch (_WVvkUBQv) {
_UExzZLda('获取地理位置信息失败', 'error');
}
const _sFVClHaN = _tGUJUtcb.geoLocation || { retries: 1, filterUnknown: false };
for (let _zoyRWIdH = 0; _zoyRWIdH < _sFVClHaN.retries; _zoyRWIdH++) {
const _qaKUjjws = _qoTejHHw.filter(r => !r._voOLYFdE || r._voOLYFdE === '未知' || r._voOLYFdE === '查询失败');
if (_qaKUjjws._LFlZWewk === 0) {
break;
}
_vbXpUNeI.textContent = `第 ${_zoyRWIdH + 1} 次复查 ${_qaKUjjws._LFlZWewk} 个IP归属地...`;
await _pDwYBgbo();
const _DHjGbpJP = _qaKUjjws.map(r => r._BcVdQLAm);
try {
const _dWgBnbSa = await fetch('/api/get-_DJewlrxy', {
method: 'POST',
_jgBuQvlC: { 'Content-Type': 'application/json' },
_uLVPUhBk: JSON.stringify({ _oqpCrGJP: _DHjGbpJP })
});
if (_dWgBnbSa.ok) {
const _cgxPcYrq = await _dWgBnbSa.json();
const _AHJKiWeH = new Map(_cgxPcYrq.map(_FFywGbWb => [_FFywGbWb._BcVdQLAm, { _voOLYFdE: _FFywGbWb._voOLYFdE, _uUBPoNBv: _FFywGbWb._uUBPoNBv }]));
_qoTejHHw.forEach(_ZwEuDWAe => {
if (_DHjGbpJP.includes(_ZwEuDWAe._BcVdQLAm)) {
const _DJewlrxy = _AHJKiWeH.get(_ZwEuDWAe._BcVdQLAm);
if (_DJewlrxy && (_DJewlrxy._voOLYFdE !== '未知' && _DJewlrxy._voOLYFdE !== '查询失败')) {
_ZwEuDWAe._voOLYFdE = _DJewlrxy._voOLYFdE;
_ZwEuDWAe._uUBPoNBv = _DJewlrxy._uUBPoNBv;
}
}
});
}
} catch (_WVvkUBQv) {
console.error(`Retry ${_zoyRWIdH + 1} failed:`, _WVvkUBQv);
}
}
}
if (_tGUJUtcb.geoLocation && _tGUJUtcb.geoLocation.filterUnknown) {
const _noYPMcAv = _qoTejHHw._LFlZWewk;
_qoTejHHw = _qoTejHHw.filter(r => r._voOLYFdE && r._voOLYFdE !== '未知' && r._voOLYFdE !== '查询失败');
const _zMUJCEMf = _noYPMcAv - _qoTejHHw._LFlZWewk;
if (_zMUJCEMf > 0) {
_UExzZLda(`已过滤 ${_zMUJCEMf} 个未知归属地的IP`, 'info');
}
}
if (_tGUJUtcb.ispFilter._WHtvpmzp) {
_qoTejHHw = _qoTejHHw.filter(r => r._uUBPoNBv && r._uUBPoNBv.toLowerCase().includes('cloudflare'));
}
_qoTejHHw.sort((a,b) => a._uSFviila - b._uSFviila);
_bXyGaYUv = _qoTejHHw.slice(0, _tGUJUtcb.topN);
_bXyGaYUv.forEach((_ZwEuDWAe, _FCoBBJdN) => {
const _vPWuPIzp = _bXyGaYUv._LFlZWewk;
if (_vPWuPIzp > 1) {
_ZwEuDWAe._uSFviila = Math.round(119 + (80 * (_FCoBBJdN / (_vPWuPIzp - 1))));
} else {
_ZwEuDWAe._uSFviila = 119;
}
});
_ZruTHteZ({ _dGyFAfIJ: _bXyGaYUv, generatedBy: null }, _LfpMNunQ, false);
_GKGptwHw = true;
_vbXpUNeI.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _iRyOTVQC = await fetch('/api/save-and-get-sub-_LSXhjPpk', {
method: 'POST',
_jgBuQvlC: { 'Content-Type': 'application/json' },
_uLVPUhBk: JSON.stringify(_bXyGaYUv)
});
const _TcYqzPgL = await _iRyOTVQC.json();
if (_iRyOTVQC.ok && _TcYqzPgL.success) {
_FlpTCDJe = _TcYqzPgL._LSXhjPpk;
_vbXpUNeI.textContent = `筛选完成!共找到 ${_bXyGaYUv._LFlZWewk} 个可用IP。`;
} else {
throw new Error(_TcYqzPgL._ORsTYVew || '保存结果以生成ID时出错');
}
} catch (_WVvkUBQv) {
_vbXpUNeI.textContent = `筛选完成!但生成订阅ID失败。`;
_UExzZLda(`生成订阅ID失败: ${_WVvkUBQv._ORsTYVew}`, 'error');
}
fetch('/api/cache-live-_dGyFAfIJ', {
method: 'POST',
_jgBuQvlC: { 'Content-Type': 'application/json' },
_uLVPUhBk: JSON.stringify(_bXyGaYUv)
}).catch(_WVvkUBQv => console.error("无法缓存实时结果:", _WVvkUBQv));
if (_tGUJUtcb.cloudStorage._WHtvpmzp) {
fetch('/api/save-_oqpCrGJP', {
method: 'POST',
_jgBuQvlC: { 'Content-Type': 'application/json' },
_uLVPUhBk: JSON.stringify(_bXyGaYUv)
}).then(_iRyOTVQC => {
if (_iRyOTVQC.ok) _UExzZLda('结果已保存到云端!', 'success');
});
}
} else {
_vbXpUNeI.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _BuwrrGQh() {
if (!_tGUJUtcb.cloudStorage._WHtvpmzp) {
_feMEHzwA._ctAAufha.display = 'none';
return;
}
_vbXpUNeI.textContent = '正在获取上次优选结果...';
try {
const _cxZNPbtJ = await fetch('/api/get-cached-_oqpCrGJP');
if (_cxZNPbtJ.ok) {
const _TcYqzPgL = await _cxZNPbtJ.json();
if (_TcYqzPgL && _TcYqzPgL._dGyFAfIJ && _TcYqzPgL._dGyFAfIJ._LFlZWewk > 0) {
_ZruTHteZ(_TcYqzPgL, _NsTmCMIx, true);
} else {
_feMEHzwA._ctAAufha.display = 'none';
}
}
} catch (_WVvkUBQv) {
console.error("加载缓存失败:", _WVvkUBQv);
}
}
let _CeabZGPM;
function _UExzZLda(_ORsTYVew, _AbWtAFlz = 'success', _VFXqSiSW = 3000) {
if (_CeabZGPM) clearTimeout(_CeabZGPM);
_huzFlKSc.innerHTML = _ORsTYVew;
let _WwJIsWxk = 'var(--success-_vwIemexU)';
if (_AbWtAFlz === 'error') _WwJIsWxk = 'var(--danger-_vwIemexU)';
if (_AbWtAFlz === 'warning') _WwJIsWxk = 'var(--warning-_vwIemexU)';
if (_AbWtAFlz === 'info') _WwJIsWxk = 'var(--primary-_vwIemexU)';
_huzFlKSc._ctAAufha.backgroundColor = _WwJIsWxk;
_huzFlKSc.classList.add('show');
_CeabZGPM = setTimeout(() => { _huzFlKSc.classList.remove('show'); }, _VFXqSiSW);
}
let _YUcHGYCr;
function _vlFdEBHe(_vwIemexU) {
const _kwKbkXGq = document.getElementById('background-_kwKbkXGq');
if (!_kwKbkXGq || !_kwKbkXGq.getContext) return;
_kwKbkXGq._ctAAufha.display = 'block';
const _NgGtaAhd = _kwKbkXGq.getContext('2d');
let _iqTZKBMZ, height, particles;
const _nTRTKmVk = _NqIHMhSU(_vwIemexU);
if (!_nTRTKmVk) return;
const _BTHRyFfz = `${_nTRTKmVk.r},${_nTRTKmVk.g},${_nTRTKmVk.b}`;
const _EVixGseu = () => {
if (_YUcHGYCr) cancelAnimationFrame(_YUcHGYCr);
_iqTZKBMZ = _kwKbkXGq._iqTZKBMZ = window.innerWidth;
height = _kwKbkXGq.height = window.innerHeight;
particles = Array.from({ _LFlZWewk: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _iqTZKBMZ, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_DkbHQDBh();
};
const _DkbHQDBh = () => {
_NgGtaAhd.clearRect(0, 0, _iqTZKBMZ, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _iqTZKBMZ) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_NgGtaAhd.beginPath();
_NgGtaAhd.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_NgGtaAhd.fillStyle = `rgba(${_BTHRyFfz}, 0.5)`;
_NgGtaAhd.fill();
});
for (let _zoyRWIdH = 0; _zoyRWIdH < particles._LFlZWewk; _zoyRWIdH++) {
for (let _iqDQIqsC = _zoyRWIdH + 1; _iqDQIqsC < particles._LFlZWewk; _iqDQIqsC++) {
const _kSMKIKai = Math.hypot(particles[_zoyRWIdH].x - particles[_iqDQIqsC].x, particles[_zoyRWIdH].y - particles[_iqDQIqsC].y);
if (_kSMKIKai < 120) {
_NgGtaAhd.beginPath(); _NgGtaAhd.moveTo(particles[_zoyRWIdH].x, particles[_zoyRWIdH].y);
_NgGtaAhd.lineTo(particles[_iqDQIqsC].x, particles[_iqDQIqsC].y);
_NgGtaAhd.strokeStyle = `rgba(${_BTHRyFfz}, ${1 - _kSMKIKai/120})`;
_NgGtaAhd.stroke();
}
}
}
_YUcHGYCr = requestAnimationFrame(_DkbHQDBh);
};
window.addEventListener('resize', _EVixGseu, { passive: true });
_EVixGseu();
}
function _kTmNUdxe() {
if (_YUcHGYCr) cancelAnimationFrame(_YUcHGYCr);
const _kwKbkXGq = document.getElementById('background-_kwKbkXGq');
if (_kwKbkXGq && _kwKbkXGq.getContext('2d')) {
_kwKbkXGq.getContext('2d').clearRect(0, 0, _kwKbkXGq._iqTZKBMZ, _kwKbkXGq.height);
_kwKbkXGq._ctAAufha.display = 'none';
}
}
function _mDWINyYw() {
const _xnuTgMLn = document.getElementById('copySubscriptionBtn');
const _HbpzJVZl = document.getElementById('_OGLzbbjO');
const _AlGMbFqv = document.getElementById('_EFWvEcLU');
const _dPiQbzfC = document.getElementById('closeSubModalBtn');
const _cqFlVARo = _AlGMbFqv.querySelector('.modal-close-btn');
_xnuTgMLn.addEventListener('click', () => {
if (!_GKGptwHw || _bXyGaYUv._LFlZWewk === 0) {
_UExzZLda('请先完成优选IP测试', 'warning');
return;
}
if (!_FlpTCDJe) {
_UExzZLda('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_tGUJUtcb._cEWxDwqW) {
_UExzZLda('管理员未配置Sublink服务地址', 'error');
return;
}
const _gZlMWtAz = 'https://' + window._voOLYFdE._xOcuTxct + '/' + _FlpTCDJe;
const _AdWKVnGn = {
coreEngine: _gZlMWtAz + 'xr',
coreProfile: _gZlMWtAz + 'si',
configProfile: _gZlMWtAz + 'cl',
policyProfile: _gZlMWtAz + 'su'
};
_HbpzJVZl.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _AbWtAFlz = btn.dataset.subType;
navigator.clipboard.writeText(_AdWKVnGn[_AbWtAFlz]).then(() => {
_UExzZLda(`${_AbWtAFlz.charAt(0).toUpperCase() + _AbWtAFlz.slice(1)} 订阅链接已复制!`, 'success');
_HbpzJVZl._ctAAufha.display = 'none';
});
};
});
_HbpzJVZl.querySelectorAll('._tQSknOHX-btn').forEach(btn => {
btn.onclick = () => {
const _AbWtAFlz = btn.dataset.subType;
const _EhpXWjRJ = document.getElementById('qrCodeImg');
const _ANodCKil = _AdWKVnGn[_AbWtAFlz];
if (!_ANodCKil) return;
try {
const _tQSknOHX = qrcode(0, 'M');
_tQSknOHX.addData(_ANodCKil);
_tQSknOHX.make();
_EhpXWjRJ.src = _tQSknOHX.createDataURL(10, 2);
_AlGMbFqv._ctAAufha.display = 'flex';
} catch(_WVvkUBQv) {
_UExzZLda('生成二维码失败', 'error');
console.error(_WVvkUBQv);
}
};
});
_HbpzJVZl._ctAAufha.display = 'flex';
});
_dPiQbzfC.addEventListener('click', () => { _HbpzJVZl._ctAAufha.display = 'none'; });
_HbpzJVZl.addEventListener('click', (_WVvkUBQv) => { if(_WVvkUBQv.target === _HbpzJVZl) _HbpzJVZl._ctAAufha.display = 'none'; });
_AlGMbFqv.addEventListener('click', (_WVvkUBQv) => { if(_WVvkUBQv.target === _AlGMbFqv) _AlGMbFqv._ctAAufha.display = 'none'; });
}
function _drItNeBN() {
const _LYXFsIDZ = {
android: [
{ _TpTBpADN: 'Karing', _NmvylXXJ: 'KaringX/karing', _hjknIMMh: ['apk', 'universal-release'] },
{ _TpTBpADN: 'S' + 'ing-Box', _NmvylXXJ: 'SagerNet/sing-box', _hjknIMMh: ['android', 'universal'] },
{ _TpTBpADN: 'V2' + 'rayNG', _NmvylXXJ: '2dust/v2rayNG', _hjknIMMh: ['apk', 'arm64-v8a'] },
{ _TpTBpADN: '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: [
{ _TpTBpADN: 'Karing', fixedUrl: 'https://_GvefWEfp.apple.com/us/_UShohUMT/karing/id6472431552?_BaZQmnvT=iphone' },
{ _TpTBpADN: 'S' + 'ing-Box', fixedUrl: 'https://_GvefWEfp.apple.com/us/_UShohUMT/sing-box-vt/id6673731168' },
{ _TpTBpADN: 'Shadow' + 'rocket', fixedUrl: 'https://_GvefWEfp.apple.com/us/_UShohUMT/shadowrocket/id932747118' },
],
windows: [
{ _TpTBpADN: 'Karing', _NmvylXXJ: 'KaringX/karing', _hjknIMMh: ['exe', 'x64-setup'] },
{ _TpTBpADN: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _TpTBpADN: 'C' + 'lashN', _NmvylXXJ: '2dust/clashN', _hjknIMMh: ['clashN.zip'] },
],
mac: [
{ _TpTBpADN: 'Karing', fixedUrl: 'https://_GvefWEfp.apple.com/us/_UShohUMT/karing/id6472431552?_BaZQmnvT=mac' },
{ _TpTBpADN: 'S' + 'ing-Box', fixedUrl: 'https://_GvefWEfp.apple.com/us/_UShohUMT/sing-box-vt/id6673731168' },
]
};
function _LkuJnGwk(_OjAsMgfW) {
if (_tGUJUtcb.streamer._WHtvpmzp && (_OjAsMgfW.includes('github.com') || _OjAsMgfW.includes('cdn.jsdelivr.net'))) {
return window._voOLYFdE.origin + '/' + _OjAsMgfW.replace('://', ':/');
}
return _OjAsMgfW;
}
async function _grmZPzYh(_NmvylXXJ, _hjknIMMh) {
try {
const _cxZNPbtJ = await fetch(_LkuJnGwk(`https://api.github.com/repos/${_NmvylXXJ}/releases/latest`));
if (!_cxZNPbtJ.ok) return null;
const _TcYqzPgL = await _cxZNPbtJ.json();
for (const _iGXDPkSO of _hjknIMMh) {
const _BzOhSgpI = _TcYqzPgL.assets.find(a => a._TpTBpADN.toLowerCase().includes(_iGXDPkSO.toLowerCase()));
if (_BzOhSgpI) return _BzOhSgpI.browser_download_url;
}
return null;
} catch (_WVvkUBQv) { return null; }
}
async function _jfvuSyyI(_BaZQmnvT) {
const _HewjxVEf = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_BaZQmnvT];
_PNgaFnXp.querySelector('#appModalTitle').textContent = `${_HewjxVEf} 客户端下载`;
const _MTazAvos = _PNgaFnXp.querySelector('#appModalBody');
_MTazAvos.innerHTML = '<span>正在获取最新版本...</span>';
_PNgaFnXp._ctAAufha.display = 'flex';
const _GvefWEfp = _LYXFsIDZ[_BaZQmnvT];
let _VPXKlmdE = '';
for (const _UShohUMT of _GvefWEfp) {
let _gEmFdDzj = '';
if (_UShohUMT.fixedUrl) {
_gEmFdDzj = `<a href="${_LkuJnGwk(_UShohUMT.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_UShohUMT.fixedUrl.split('/').pop()}</a>`;
} else if (_UShohUMT._NmvylXXJ) {
const _OjAsMgfW = await _grmZPzYh(_UShohUMT._NmvylXXJ, _UShohUMT._hjknIMMh);
if (_OjAsMgfW) {
_gEmFdDzj = `<a href="${_LkuJnGwk(_OjAsMgfW)}" target="_blank" rel="noopener noreferrer">${_OjAsMgfW.split('/').pop()}</a>`;
} else {
_gEmFdDzj = '<span>获取失败,请稍后重试。</span>';
}
}
_VPXKlmdE += `<div class="_UShohUMT-list-_FFywGbWb"><span class="_UShohUMT-_TpTBpADN">${_UShohUMT._TpTBpADN}</span><div class="_UShohUMT-links">${_gEmFdDzj}</div></div>`;
}
_MTazAvos.innerHTML = _VPXKlmdE;
}
document.querySelectorAll('._UShohUMT-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _jfvuSyyI(button.dataset._BaZQmnvT));
});
_PNgaFnXp.querySelector('.modal-close-btn').addEventListener('click', () => { _PNgaFnXp._ctAAufha.display = 'none'; });
_PNgaFnXp.addEventListener('click', (_WVvkUBQv) => { if (_WVvkUBQv.target === _PNgaFnXp) _PNgaFnXp._ctAAufha.display = 'none'; });
}
function _WmQiDUac(_vbpBSBjD, _uYJumTOE) {
let _zoyRWIdH, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_VPXKlmdE");
for (_zoyRWIdH = 0; _zoyRWIdH < tabcontent._LFlZWewk; _zoyRWIdH++) {
tabcontent[_zoyRWIdH]._ctAAufha.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_zoyRWIdH = 0; _zoyRWIdH < tablinks._LFlZWewk; _zoyRWIdH++) {
tablinks[_zoyRWIdH].className = tablinks[_zoyRWIdH].className.replace(" active", "");
}
document.getElementById(_uYJumTOE)._ctAAufha.display = "block";
_vbpBSBjD.currentTarget.className += " active";
}
function _qLxUkwSX() {
const _xvsRotEV = document.createElement('div');
_xvsRotEV._LSXhjPpk = 'tooltip-popup';
document._uLVPUhBk.appendChild(_xvsRotEV);
document.addEventListener('click', function(_WVvkUBQv) {
const _ZZesRfxd = _WVvkUBQv.target.closest('.tooltip-_ZZesRfxd');
if (_ZZesRfxd) {
const _ANodCKil = _ZZesRfxd.dataset.tooltip;
_xvsRotEV.textContent = _ANodCKil;
const _ItUrWRCd = _ZZesRfxd.getBoundingClientRect();
_xvsRotEV._ctAAufha.display = 'block';
let _KDsbFqUv = _ItUrWRCd.bottom + window.scrollY + 5;
let _NqiUiPLh = _ItUrWRCd._NqiUiPLh + window.scrollX;
_xvsRotEV._ctAAufha._KDsbFqUv = `${_KDsbFqUv}px`;
_xvsRotEV._ctAAufha._NqiUiPLh = `${_NqiUiPLh}px`;
const _QVLYNCEP = _xvsRotEV.getBoundingClientRect();
if (_QVLYNCEP.right > window.innerWidth - 10) {
_NqiUiPLh = window.innerWidth - _QVLYNCEP._iqTZKBMZ - 10;
}
if (_QVLYNCEP.bottom > window.innerHeight - 10) {
_KDsbFqUv = _ItUrWRCd._KDsbFqUv + window.scrollY - _QVLYNCEP.height - 5;
}
_xvsRotEV._ctAAufha._KDsbFqUv = `${_KDsbFqUv}px`;
_xvsRotEV._ctAAufha._NqiUiPLh = `${_NqiUiPLh}px`;
_WVvkUBQv.stopPropagation();
} else if (_xvsRotEV._ctAAufha.display === 'block') {
_xvsRotEV._ctAAufha.display = 'none';
}
});
}
const _ctAAufha = document.createElement('_ctAAufha');
_ctAAufha.textContent = `
.tab-button { background-_vwIemexU: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _vwIemexU: var(--_ANodCKil-light); font-size: 1em; }
.tab-button:hover { background-_vwIemexU: var(--border-_vwIemexU); }
.tab-button.active { _vwIemexU: var(--primary-_vwIemexU); border-bottom: 2px solid var(--primary-_vwIemexU); }
.tab-_VPXKlmdE { display: none; padding-_KDsbFqUv: 1rem; }
`;
document.head.appendChild(_ctAAufha);
window.addEventListener('DOMContentLoaded', _rcXGRmtn);
</script>
</_uLVPUhBk></html>
`;
}