import { connect } from "cloudflare:sockets";
const _eatyxIxj = "3b4d4cd8-cb92-4421-bf86-fb51570fc038";
const _YqNRSMAM = ["UpstreamAddress.SG.CMLiussss.net"];
const _kqqwolDJ = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%86%85%E7%BD%AEIP';
const _ZpPHRpfd = 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/%E5%9D%87%E8%A1%A1IP';
const _IAFHVsyR = '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 _liChpaeb = '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 _UfBntfDo(_IxrLQWZq) {
if (Array.isArray(_IxrLQWZq)) {
try {
return String.fromCharCode.apply(null, _IxrLQWZq);
} catch (_UQsFbFsZ) {
return '';
}
}
return _IxrLQWZq;
}
function _DOCiPENj(_XItBVrFU) {
return /^[0-9a-_QcKgtEtx]{8}-[0-9a-_QcKgtEtx]{4}-[4][0-9a-_QcKgtEtx]{3}-[89ab][0-9a-_QcKgtEtx]{3}-[0-9a-_QcKgtEtx]{12}$/_LzBQhpmd.test(_XItBVrFU);
}
const _HhqOqBkO = "optimized_ips_v4";
const _pIxYFgkO = "global_config_v4";
const _WYaMwXlS = "admin_password_v4";
const _IPFloQZt = "live_results_temp_v1";
const _GNBhRUEW = "latest_sub_id_v1";
export default {
async fetch(_IzHLhEGJ, _fRlqVqCR, _RDoWEHOn) {
try {
if (!_fRlqVqCR.DB) {
const _TtvzioYR = _iDpgbbSE("D1 数据库 'DB' 未绑定。");
return new Response(_TtvzioYR, { status: 503, _nQQyxIvQ: { 'Content-Type': '_YjWVVcUA/html;_wtqCubuY=UTF-8' }});
}
_RDoWEHOn.waitUntil(
_fRlqVqCR.DB.exec(`
CREATE TABLE IF NOT EXISTS kv_data (_WwdZHVsG TEXT PRIMARY KEY, _IxrLQWZq TEXT);
CREATE TABLE IF NOT EXISTS optimized_results (_XItBVrFU TEXT PRIMARY KEY, _EXQSsAbG TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
`).catch(_UQsFbFsZ => console.error("DB Init Error:", _UQsFbFsZ._YzuxBjrd))
);
const _uHSLwcDj = new URL(_IzHLhEGJ._uHSLwcDj);
const _jzqYlrFe = _uHSLwcDj.pathname;
const _pxTndKnb = _IzHLhEGJ._nQQyxIvQ.get("Upgrade");
const _VWOaYrNv = await _KlZgCIHm(_fRlqVqCR);
if (_VWOaYrNv.websocketStreamer && _VWOaYrNv.websocketStreamer._RHiGlNGb && _pxTndKnb && _pxTndKnb.toLowerCase() === "websocket") {
const _dxWjwwRt = _VWOaYrNv.websocketStreamer._uHSLwcDj;
if (_dxWjwwRt && _dxWjwwRt.trim().startsWith('https://')) {
try {
const _uolWbQgI = new Request(_dxWjwwRt.trim() + _uHSLwcDj.pathname + _uHSLwcDj.search, _IzHLhEGJ);
return await fetch(_uolWbQgI);
} catch (_UQsFbFsZ) {
return new Response(`Upstream WebSocket gateway failed: ${_UQsFbFsZ._YzuxBjrd}`, { status: 502 });
}
}
return new Response("WebSocket reverse gateway URL is not configured or is invalid.", { status: 502 });
}
if (_pxTndKnb && _pxTndKnb.toLowerCase() === "websocket") {
return await _TsvtuFjx(_IzHLhEGJ, _fRlqVqCR, _VWOaYrNv);
}
const _QnRqOGRA = _jzqYlrFe._oXzxHYhu(/^\/([a-zA-Z0-9-_.]{2,128})(xr|si|cl|su)$/);
if (_QnRqOGRA) {
const [, _nWJKBZJF, typeSuffix] = _QnRqOGRA;
const _vTMflxAD = _VWOaYrNv._vTMflxAD;
if (!_vTMflxAD || _vTMflxAD.trim() === '') {
return new Response("订阅转换(Sublink)服务器地址未配置。", { status: 503, _nQQyxIvQ: { 'Content-Type': '_YjWVVcUA/plain; _wtqCubuY=utf-8' } });
}
const _bIDFptcq = { 'xr': 'coreEngine', 'si': 'coreProfile', 'cl': 'configProfile', 'su': 'policyProfile' };
const _TYsuVITA = _bIDFptcq[typeSuffix];
const _YnsWVFER = _vTMflxAD.replace(/\/$/, '');
const _XttcCVwE = `${_uHSLwcDj.origin}/${_nWJKBZJF}`;
const _SBXbOrij = `${_YnsWVFER}/${_TYsuVITA}?_VWOaYrNv=${encodeURIComponent(_XttcCVwE)}`;
try {
const _bZxeLCuY = await fetch(_SBXbOrij, { _nQQyxIvQ: { 'User-Agent': _IzHLhEGJ._nQQyxIvQ.get('User-Agent') || 'Cloudflare-Worker-Sub-Fetcher/1.0' } });
const _cKPoPsmx = new Headers(_bZxeLCuY._nQQyxIvQ);
_cKPoPsmx._YZJNJqsS('Access-Control-Allow-Origin', '*');
return new Response(_bZxeLCuY._xiSDFndW, { status: _bZxeLCuY.status, statusText: _bZxeLCuY.statusText, _nQQyxIvQ: _cKPoPsmx });
} catch (_UQsFbFsZ) {
return new Response(`获取上游订阅失败: ${_UQsFbFsZ._YzuxBjrd}`, { status: 502, _nQQyxIvQ: { 'Content-Type': '_YjWVVcUA/plain; _wtqCubuY=utf-8' } });
}
}
if (_jzqYlrFe.startsWith('/https:/') || _jzqYlrFe.startsWith('/http:/')) {
return _YOILxXeX(_IzHLhEGJ, _VWOaYrNv);
}
if (_VWOaYrNv.customSubPath && _VWOaYrNv.customSubPath._RHiGlNGb && _VWOaYrNv.customSubPath._jzqYlrFe && _jzqYlrFe === '/' + _VWOaYrNv.customSubPath._jzqYlrFe.trim()) {
const _rxHoczFd = _fRlqVqCR.DB.prepare("SELECT _IxrLQWZq FROM kv_data WHERE _WwdZHVsG = ?").bind(_GNBhRUEW);
const { _QaSvivmg } = await _rxHoczFd.all();
const _YiUxCUQJ = _QaSvivmg._aXvlfeii > 0 ? _QaSvivmg[0]._IxrLQWZq : null;
if (_YiUxCUQJ) {
return _IeAcZAUB({ _EhWeuwtF: { _XItBVrFU: _YiUxCUQJ }, _uHSLwcDj: _IzHLhEGJ._uHSLwcDj }, _fRlqVqCR);
} else {
return new Response("未找到最新的优选结果集。", { status: 404, _nQQyxIvQ: { 'Content-Type': '_YjWVVcUA/plain; _wtqCubuY=utf-8' } });
}
}
const _HnLrgaLt = _jzqYlrFe.split('/').filter(Boolean);
if (_HnLrgaLt._aXvlfeii === 1 && !_jzqYlrFe.startsWith('/api/')) {
const _nWJKBZJF = _HnLrgaLt[0];
return _IeAcZAUB({ _EhWeuwtF: { _XItBVrFU: _nWJKBZJF }, _uHSLwcDj: _IzHLhEGJ._uHSLwcDj }, _fRlqVqCR);
}
if (_jzqYlrFe.startsWith('/api/')) {
if (_jzqYlrFe === '/api/_VWOaYrNv' && _IzHLhEGJ.method === 'POST') return _IsuFaPGn(_IzHLhEGJ, _fRlqVqCR, _RDoWEHOn);
if (_jzqYlrFe === '/api/_YZJNJqsS-_PbKatdDE') return _qHymETtQ(_IzHLhEGJ, _fRlqVqCR);
if (_jzqYlrFe === '/api/change-_PbKatdDE') return _DReQXHLh(_IzHLhEGJ, _fRlqVqCR);
if (_jzqYlrFe === '/api/verify-_PbKatdDE') return _XGkYfole(_IzHLhEGJ, _fRlqVqCR);
if (_jzqYlrFe === '/api/verify-visitor-_PbKatdDE' && _IzHLhEGJ.method === 'POST') return _zvfZTEjr(_IzHLhEGJ, _fRlqVqCR);
if (_jzqYlrFe === '/api/cache-live-_QaSvivmg' && _IzHLhEGJ.method === 'POST') return _VmXEUIss(_IzHLhEGJ, _fRlqVqCR, _RDoWEHOn);
if (_jzqYlrFe === '/api/get-_Ygipgubb' && _IzHLhEGJ.method === 'POST') return _powCXolo(_IzHLhEGJ, _fRlqVqCR);
if (_jzqYlrFe === '/api/get-cached-_eHoapFhh') return _IhbehSHn(_IzHLhEGJ, _fRlqVqCR);
if (_jzqYlrFe === '/api/save-_eHoapFhh') return _wKAXeIha(_IzHLhEGJ, _fRlqVqCR, _RDoWEHOn);
if (_jzqYlrFe === '/api/save-and-get-sub-_XItBVrFU' && _IzHLhEGJ.method === 'POST') return _ravTHgoO(_IzHLhEGJ, _fRlqVqCR);
if (_jzqYlrFe.startsWith('/api/get-_fcHQUaic/')) {
const _nWJKBZJF = _jzqYlrFe.split('/').pop();
return _IeAcZAUB({ _EhWeuwtF: { _XItBVrFU: _nWJKBZJF }, _uHSLwcDj: _IzHLhEGJ._uHSLwcDj }, _fRlqVqCR);
}
if (_jzqYlrFe === '/api/_VWOaYrNv' && _IzHLhEGJ.method === 'GET') return _AtCDIeEa(_fRlqVqCR);
if (_jzqYlrFe === '/api/get-resolved-_eHoapFhh') return _hqQErygz(_IzHLhEGJ);
if (_jzqYlrFe === '/api/parse-_eHoapFhh-from-_OUKPxFzd' && _IzHLhEGJ.method === 'POST') return _avDFBUXi(_IzHLhEGJ, _fRlqVqCR);
if (_jzqYlrFe === '/api/endpoints') return _VssdmWeb(_IzHLhEGJ, _fRlqVqCR);
if (_jzqYlrFe === '/api/ping') return new Response(null, { status: 204 });
return new Response("API not found", { status: 404 });
}
if (_jzqYlrFe === '/_WHEPWUJQ') return _JnMsNcrd(_IzHLhEGJ, _fRlqVqCR);
if (_jzqYlrFe === '/bing-wallpaper') return _vbIjzxXX();
return _xvOlDQTH(_IzHLhEGJ, _fRlqVqCR, _RDoWEHOn);
} catch (err) {
let _UQsFbFsZ = err;
return new Response(_UQsFbFsZ.toString(), { status: 500 });
}
}
};
const _XUXRxobm = { 'Accept': '_YjWVVcUA/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 _eQsAtboL(_uHSLwcDj, _MRqFAmJB) {
const _AaBQCexz = await fetch(_uHSLwcDj, { _nQQyxIvQ: { ..._XUXRxobm, 'Referer': _MRqFAmJB.referer } });
if (_AaBQCexz.ok) return _AaBQCexz._YjWVVcUA();
return null;
}
async function _VWQUmAoB(_uHSLwcDj, _MRqFAmJB) {
const _JSNSAWTf = `https://translate.google.com/translate?sl=auto&tl=en&u=${encodeURIComponent(_uHSLwcDj)}`;
const _AaBQCexz = await fetch(_JSNSAWTf, { _nQQyxIvQ: { ..._XUXRxobm, 'Referer': _MRqFAmJB.referer } });
if (!_AaBQCexz.ok) return null;
const _xiSDFndW = await _AaBQCexz._YjWVVcUA();
const _oXzxHYhu = _xiSDFndW._oXzxHYhu(/<pre[^>]*>([\s\S]*?)<\/pre>/_LzBQhpmd);
return _oXzxHYhu && _oXzxHYhu[1] ? _oXzxHYhu[1].replace(/&/g, '&') : null;
}
function _WpsuvhPG(_jGOnnFBw) {
let _ruleHGYe;
try {
_ruleHGYe = atob(_jGOnnFBw.replace(/\s/g, ''));
} catch (_UQsFbFsZ) {
_ruleHGYe = _jGOnnFBw;
}
const _fcHQUaic = _ruleHGYe.split(/[\s\n\r,]+/).filter(line => line.trim());
const _fivUmUZJ = new Set();
const _blPrKItQ = /@([^?#]+?):(\d+)/;
for (const _FJBpMokz of _fcHQUaic) {
let _UQUUFArf = '';
let _hZFhznoG = '';
try {
if (_FJBpMokz.startsWith('vmess://')) {
const _UDXgyHoj = atob(_FJBpMokz.substring(8));
const _VWOaYrNv = JSON.parse(_UDXgyHoj);
_UQUUFArf = _VWOaYrNv.add;
_hZFhznoG = _VWOaYrNv._hZFhznoG;
} else {
const _oXzxHYhu = _FJBpMokz._oXzxHYhu(_blPrKItQ);
if (_oXzxHYhu && _oXzxHYhu[1] && _oXzxHYhu[2]) {
_UQUUFArf = _oXzxHYhu[1].replace(/[\[\]]/g, '');
_hZFhznoG = _oXzxHYhu[2];
}
}
} catch (_UQsFbFsZ) {
console.warn(`Could not parse _FJBpMokz: ${_FJBpMokz}`);
}
if (_UQUUFArf && _hZFhznoG) {
_fivUmUZJ.add(`${_UQUUFArf}:${_hZFhznoG}`);
}
}
return Array.from(_fivUmUZJ);
}
async function _mKFhOqOU(_TNwwePBG) {
try {
const _AaBQCexz = await fetch(_TNwwePBG, { _nQQyxIvQ: _XUXRxobm });
if (!_AaBQCexz.ok) {
console.error(`Failed to fetch subscription: ${_AaBQCexz.status}`);
return [];
}
const _jGOnnFBw = await _AaBQCexz._YjWVVcUA();
return _WpsuvhPG(_jGOnnFBw);
} catch (error) {
console.error(`Error processing subscription ${_TNwwePBG}:`, error);
return [];
}
}
async function _PqQZFqjx(_vYeMoSlI) {
const _grsmmpsD = _vYeMoSlI.trim();
const _yfoaQEdm = /^(vless|vmess|trojan|ss):\/\//.test(_grsmmpsD);
const _uURvUcTg = (() => {
if (_grsmmpsD._aXvlfeii < 20 || _grsmmpsD.startsWith('http')) return false;
const _fTWvnHsm = _grsmmpsD.replace(/\s/g, '');
if (_fTWvnHsm._aXvlfeii % 4 !== 0 && !_fTWvnHsm.includes('=')) return false;
try {
atob(_fTWvnHsm);
return true;
} catch (_UQsFbFsZ) {
return false;
}
})();
if (_yfoaQEdm || _uURvUcTg) {
return _WpsuvhPG(_grsmmpsD).join('\n');
}
const _pkTLIETg = [
'https://ipdb.api.030101.xyz/?_OZZMoDle=bestcf&_UYlmFqeX=true',
'https://ipdb.api.030101.xyz/?_OZZMoDle=bestproxy&_UYlmFqeX=true'
];
const _WXBEkqNP = /^(https?:\/\/)?([\w.-]+)\.([a-z]{2,})(\/.*)?(sub|clash|v2)/_LzBQhpmd.test(_vYeMoSlI) || _vYeMoSlI.includes('?_rwOMWNnH=');
if (_WXBEkqNP) {
const _eHoapFhh = await _mKFhOqOU(_vYeMoSlI);
return _eHoapFhh.join('\n');
}
let _jGOnnFBw = '';
if (_pkTLIETg.includes(_vYeMoSlI)) {
_jGOnnFBw = await _eQsAtboL(_vYeMoSlI, { referer: _vYeMoSlI });
if (!_jGOnnFBw || _jGOnnFBw._aXvlfeii < 8) {
_jGOnnFBw = await _VWQUmAoB(_vYeMoSlI, { referer: _vYeMoSlI });
}
} else {
try {
const _XyPGHhwU = await fetch(_vYeMoSlI, { _nQQyxIvQ: { 'User-Agent': 'Cloudflare-Worker' } });
if (_XyPGHhwU.ok) {
_jGOnnFBw = await _XyPGHhwU._YjWVVcUA();
} else {
console.warn(`Failed to fetch URL ${_vYeMoSlI}: ${_XyPGHhwU.status}`);
}
} catch (_UQsFbFsZ) {
console.error(`Error fetching URL ${_vYeMoSlI}:`, _UQsFbFsZ);
}
}
const _ayqOGFGV = _WpsuvhPG(_jGOnnFBw);
if (_ayqOGFGV._aXvlfeii > 0) {
return _ayqOGFGV.join('\n');
}
return _jGOnnFBw || '';
}
async function _YOILxXeX(_IzHLhEGJ, _VWOaYrNv) {
if (!_VWOaYrNv.streamer._RHiGlNGb) {
return new Response('远程流功能未开启', { status: 403 });
}
const _uHSLwcDj = new URL(_IzHLhEGJ._uHSLwcDj);
const _nAEUZxIn = _uHSLwcDj.pathname.substring(1).replace(':/', '://');
try {
const _SBXbOrij = new URL(_nAEUZxIn);
const _AguvEeps = ['github.com', 'objects.githubusercontent.com', 'cdn.jsdelivr.net'];
if (!_AguvEeps.some(domain => _SBXbOrij._UQUUFArf.endsWith(domain))) {
return new Response('不支持的远程流域名', { status: 400 });
}
const _HdpFQNWS = new Headers(_IzHLhEGJ._nQQyxIvQ);
_HdpFQNWS._YZJNJqsS('Host', _SBXbOrij._UQUUFArf);
_HdpFQNWS._YZJNJqsS('User-Agent', 'CF-Worker-Streamer/1.0');
const _LasrysoY = await fetch(_SBXbOrij.toString(), {
method: _IzHLhEGJ.method,
_nQQyxIvQ: _HdpFQNWS,
_xiSDFndW: _IzHLhEGJ._xiSDFndW,
});
const _cKPoPsmx = new Headers(_LasrysoY._nQQyxIvQ);
_cKPoPsmx._YZJNJqsS('Access-Control-Allow-Origin', '*');
_cKPoPsmx._YZJNJqsS('Access-Control-Allow-Methods', 'GET, HEAD, POST, PUT, DELETE, OPTIONS');
_cKPoPsmx._YZJNJqsS('Access-Control-Allow-Headers', '*');
_cKPoPsmx._YZJNJqsS('Cache-Control', 'public, max-age=86400');
_cKPoPsmx._YZJNJqsS('X-Streamer-Source', 'CF-Worker');
_cKPoPsmx.delete('_jGOnnFBw-security-policy');
_cKPoPsmx.delete('x-_jGOnnFBw-security-policy');
_cKPoPsmx.delete('x-webkit-csp');
return new Response(_LasrysoY._xiSDFndW, {
status: _LasrysoY.status,
statusText: _LasrysoY.statusText,
_nQQyxIvQ: _cKPoPsmx,
});
} catch (_UQsFbFsZ) {
return new Response('无效的目标URL', { status: 400 });
}
}
async function _TsvtuFjx(_IzHLhEGJ, _fRlqVqCR, _VWOaYrNv) {
try {
const _suecgqge = _VWOaYrNv || await _KlZgCIHm(_fRlqVqCR);
const _gyeByGJv = (_suecgqge.itemLink._LziXBEPf && _suecgqge.itemLink._LziXBEPf[0]) || {};
const _ByRSPghN = _gyeByGJv['_rwOMWNnH'] || _UfBntfDo(_eatyxIxj);
if (!_DOCiPENj(_ByRSPghN)) {
throw new Error("Configured user _nMOGxCIe is not valid.");
}
const _ezeSjlDr = _suecgqge.dataFeeds.universalFallbackAddress;
let _yPXtaBzJ = {};
const _eJUtcDfz = _UfBntfDo(_YqNRSMAM[0] || "");
if (_ezeSjlDr) {
const [_QovRIXIW, _hZFhznoG = '443'] = _ezeSjlDr.split(':');
_yPXtaBzJ = { _QovRIXIW, _hZFhznoG };
} else {
const [_QovRIXIW, _hZFhznoG = '443'] = _eJUtcDfz.split(':');
_yPXtaBzJ = { _QovRIXIW, _hZFhznoG };
}
const _uHSLwcDj = new URL(_IzHLhEGJ._uHSLwcDj);
const _jzqYlrFe = _uHSLwcDj.pathname;
let _xIRSFAox = '';
const _usCcKHKd = _uHSLwcDj.searchParams.get('remote');
if (_usCcKHKd) {
_xIRSFAox = atob(_usCcKHKd);
} else if (_jzqYlrFe.startsWith('/endpoint=')) {
_xIRSFAox = _jzqYlrFe.substring(10);
} else if (_jzqYlrFe._aXvlfeii > 1 && _jzqYlrFe.substring(1).includes('.')) {
_xIRSFAox = _jzqYlrFe.substring(1);
}
if (_xIRSFAox) {
const [_QovRIXIW, _hZFhznoG = '443'] = _xIRSFAox.split(':');
_yPXtaBzJ = { _QovRIXIW, _hZFhznoG };
}
return await _YPFsMQzP(_IzHLhEGJ, _ByRSPghN, _yPXtaBzJ);
} catch (err) {
return new Response(err.toString(), { status: 500 });
}
}
async function _YPFsMQzP(_IzHLhEGJ, _nMOGxCIe, _yPXtaBzJ) {
const _DkwQGjUX = new WebSocketPair();
const [clientEnd, _kdEYnFql] = Object.values(_DkwQGjUX);
_kdEYnFql.accept();
let _jJvyeCCD = { _OaueNlGE: null };
const _MDikCBTy = _IzHLhEGJ._nQQyxIvQ.get("sec-websocket-protocol") || "";
const _jxBMyroA = _MajInASX(_kdEYnFql, _MDikCBTy);
_jxBMyroA.pipeTo(new WritableStream({
async write(chunk) {
if (_jJvyeCCD._OaueNlGE) {
const _qLFjMmtn = _jJvyeCCD._OaueNlGE.writable.getWriter();
await _qLFjMmtn.write(chunk);
_qLFjMmtn.releaseLock();
return;
}
const { error, details } = await _omYXVPQH(chunk, _nMOGxCIe);
if (error) {
throw new Error(details);
}
const _OZlgnrwJ = new Uint8Array([details._GzHBjrdz[0], 0]);
const _vBNxHLYz = chunk.slice(details.payloadIndex);
await _ksIAMXcr(_jJvyeCCD, details._yqXaiMkr, details._phGrOGZh, _vBNxHLYz, _kdEYnFql, _OZlgnrwJ, _yPXtaBzJ);
}
})).catch((err) => {
console.error("Stream processing error:", err);
_DjzyzXhX(_kdEYnFql);
});
return new Response(null, { status: 101, webSocket: clientEnd });
}
async function _ksIAMXcr(_jJvyeCCD, _yqXaiMkr, _phGrOGZh, _ebQNUozQ, _QjGYFSBu, _OZlgnrwJ, _wAnmCsIX) {
const _SZiTFMlz = async (_QovRIXIW, _hZFhznoG) => {
let _vfPalhGE = _QovRIXIW;
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(_QovRIXIW)) {
_vfPalhGE = `${atob('d3d3Lg==')}${_QovRIXIW}${atob('LnNzbGlwLmlv')}`;
}
const _OaueNlGE = connect({ _UQUUFArf: _vfPalhGE, _hZFhznoG });
_jJvyeCCD._OaueNlGE = _OaueNlGE;
const _qLFjMmtn = _OaueNlGE.writable.getWriter();
await _qLFjMmtn.write(_ebQNUozQ);
_qLFjMmtn.releaseLock();
return _OaueNlGE;
};
const _kyUmlsLH = async () => {
if (!_wAnmCsIX._QovRIXIW) return;
console.log(`Direct connection failed, falling back to gateway: ${_wAnmCsIX._QovRIXIW}`);
const _UGVBACxN = await _SZiTFMlz(_wAnmCsIX._QovRIXIW, parseInt(_wAnmCsIX._hZFhznoG, 10));
_UGVBACxN.closed.catch(() => {}).finally(() => _DjzyzXhX(_QjGYFSBu));
_NfPhXlzc(_UGVBACxN, _QjGYFSBu, _OZlgnrwJ, null);
};
try {
const _PowwrUSx = await _SZiTFMlz(_yqXaiMkr, _phGrOGZh);
_NfPhXlzc(_PowwrUSx, _QjGYFSBu, _OZlgnrwJ, _kyUmlsLH);
} catch (err) {
console.error("Primary connection failed:", err);
await _kyUmlsLH();
}
}
function _MajInASX(_kdEYnFql, _MDikCBTy) {
let _tJbiQsGR = false;
return new ReadableStream({
start(_kLPWFJdW) {
_kdEYnFql.addEventListener("_YzuxBjrd", (event) => { if (_tJbiQsGR) return; _kLPWFJdW.enqueue(event._EXQSsAbG); });
_kdEYnFql.addEventListener("close", () => { _DjzyzXhX(_kdEYnFql); if (_tJbiQsGR) return; _kLPWFJdW.close(); });
_kdEYnFql.addEventListener("error", (err) => _kLPWFJdW.error(err));
if (_MDikCBTy) {
try {
const _KFYzzhVo = atob(_MDikCBTy.replace(/-/g, "+").replace(/_/g, "/"));
_kLPWFJdW.enqueue(Uint8Array.from(_KFYzzhVo, c => c.charCodeAt(0))._GeOZCbBA);
} catch (_UQsFbFsZ) { console.error("Failed to decode early _EXQSsAbG:", _UQsFbFsZ); }
}
},
cancel() { _tJbiQsGR = true; _DjzyzXhX(_kdEYnFql); },
});
}
async function _omYXVPQH(_GeOZCbBA, _nMOGxCIe) {
if (_GeOZCbBA.byteLength < 24) return { error: true, details: "Invalid packet size" };
const _GzHBjrdz = new Uint8Array(_GeOZCbBA.slice(0, 1));
const _MSvpnMWD = _sZGepLLj(new Uint8Array(_GeOZCbBA.slice(1, 17)));
if (_MSvpnMWD !== _nMOGxCIe) return { error: true, details: "Invalid _nMOGxCIe" };
const _kfpRaQSC = new Uint8Array(_GeOZCbBA.slice(17, 18))[0];
const _weGJSgfP = new Uint8Array(_GeOZCbBA.slice(18 + _kfpRaQSC, 19 + _kfpRaQSC))[0];
if (_weGJSgfP !== 1) return { error: true, details: `Unsupported _weGJSgfP: ${_weGJSgfP}` };
const _azzkeAws = 19 + _kfpRaQSC;
const _phGrOGZh = new DataView(_GeOZCbBA.slice(_azzkeAws, _azzkeAws + 2)).getUint16(0);
let _nasOiekm = _azzkeAws + 2;
const _bFfeWNLk = new Uint8Array(_GeOZCbBA.slice(_nasOiekm, _nasOiekm + 1))[0];
let _WpUxiNFI = 0;
let _JZrziYYI = _nasOiekm + 1;
let _yqXaiMkr = "";
switch (_bFfeWNLk) {
case 1: _WpUxiNFI = 4; _yqXaiMkr = new Uint8Array(_GeOZCbBA.slice(_JZrziYYI, _JZrziYYI + _WpUxiNFI)).join("."); break;
case 2: _WpUxiNFI = new Uint8Array(_GeOZCbBA.slice(_JZrziYYI, _JZrziYYI + 1))[0]; _JZrziYYI++; _yqXaiMkr = new TextDecoder().decode(_GeOZCbBA.slice(_JZrziYYI, _JZrziYYI + _WpUxiNFI)); break;
case 3: _WpUxiNFI = 16; const _bFsofaqD = new DataView(_GeOZCbBA.slice(_JZrziYYI, _JZrziYYI + _WpUxiNFI)); const _pcSTngrT = []; for (let _LzBQhpmd = 0; _LzBQhpmd < 8; _LzBQhpmd++) _pcSTngrT.push(_bFsofaqD.getUint16(_LzBQhpmd * 2).toString(16)); _yqXaiMkr = _pcSTngrT.join(":"); break;
default: return { error: true, details: `Invalid _WTImSQLA _OZZMoDle: ${_bFfeWNLk}` };
}
if (!_yqXaiMkr) return { error: true, details: "Target _QovRIXIW is empty" };
return { error: false, details: { _yqXaiMkr, _phGrOGZh, _GzHBjrdz, payloadIndex: _JZrziYYI + _WpUxiNFI } };
}
async function _NfPhXlzc(_OaueNlGE, _QjGYFSBu, _QzJtcmPz, _hRidXDbF) {
let _GIniaklg = _QzJtcmPz;
let _TRKEkjUv = false;
let _QEGGFqMf = _OaueNlGE._jxBMyroA.pipeTo(new WritableStream({
write(chunk) {
_TRKEkjUv = true;
if (_QjGYFSBu.readyState !== 1) throw new Error("Channel is not open");
if (_GIniaklg) {
const _bHWvsGMr = new Uint8Array(_GIniaklg.byteLength + chunk.byteLength);
_bHWvsGMr._YZJNJqsS(new Uint8Array(_GIniaklg));
_bHWvsGMr._YZJNJqsS(new Uint8Array(chunk), _GIniaklg.byteLength);
_QjGYFSBu.send(_bHWvsGMr._GeOZCbBA);
_GIniaklg = null;
} else {
_QjGYFSBu.send(chunk);
}
},
close() {}
}), { signal: new AbortController().signal }).catch((err) => {
console.error("Pipe to _QjGYFSBu error:", err._YzuxBjrd);
});
await _QEGGFqMf;
if (!_TRKEkjUv && _hRidXDbF) {
_hRidXDbF();
}
}
function _DjzyzXhX(_QjGYFSBu) {
try { if (_QjGYFSBu.readyState === 1 || _QjGYFSBu.readyState === 2) _QjGYFSBu.close(); } catch (_UQsFbFsZ) {}
}
const _AalEjiWN = Array.from({ _aXvlfeii: 256 }, (_, _LzBQhpmd) => (_LzBQhpmd + 256).toString(16).slice(1));
function _sZGepLLj(_NLkoudNA, offset = 0) {
return (
_AalEjiWN[_NLkoudNA[offset]] + _AalEjiWN[_NLkoudNA[offset + 1]] + _AalEjiWN[_NLkoudNA[offset + 2]] + _AalEjiWN[_NLkoudNA[offset + 3]] + "-" +
_AalEjiWN[_NLkoudNA[offset + 4]] + _AalEjiWN[_NLkoudNA[offset + 5]] + "-" +
_AalEjiWN[_NLkoudNA[offset + 6]] + _AalEjiWN[_NLkoudNA[offset + 7]] + "-" +
_AalEjiWN[_NLkoudNA[offset + 8]] + _AalEjiWN[_NLkoudNA[offset + 9]] + "-" +
_AalEjiWN[_NLkoudNA[offset + 10]] + _AalEjiWN[_NLkoudNA[offset + 11]] +
_AalEjiWN[_NLkoudNA[offset + 12]] + _AalEjiWN[_NLkoudNA[offset + 13]] +
_AalEjiWN[_NLkoudNA[offset + 14]] + _AalEjiWN[_NLkoudNA[offset + 15]]
).toLowerCase();
}
let _ZuaBDvTh = { "N/A":"未知" };
async function _KDYmvXSP(_uHSLwcDj, _OhPGAFjc, _hRidXDbF) {
try {
const _AaBQCexz = await fetch(_uHSLwcDj, {
_nQQyxIvQ: { 'User-Agent': 'Cloudflare-Worker-IP-Scanner' }
});
if (!_AaBQCexz.ok) {
console.error(`获取 ${_uHSLwcDj} 失败: HTTP ${_AaBQCexz.status}`);
return _hRidXDbF;
}
const _YjWVVcUA = await _AaBQCexz._YjWVVcUA();
return _OhPGAFjc(_YjWVVcUA);
} catch (error) {
console.error(`获取或解析 ${_uHSLwcDj} 时发生网络错误: ${error._YzuxBjrd}`);
return _hRidXDbF;
}
}
function _gzreHkGw(_YjWVVcUA) {
if (!_YjWVVcUA) return [];
const _ebzlZgAi = /^(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}|[0-9a-fA-F:]+\/\d{1,3})$/;
const _szmRZjXd = _YjWVVcUA.split(/[\s,;#|]+/);
const _FTbokEbG = [];
for (const _DnqUVMvP of _szmRZjXd) {
const _UWfoXSOv = _DnqUVMvP.trim();
if (!_UWfoXSOv) continue;
const _clHsYBvA = _UWfoXSOv.lastIndexOf(':');
let _sIrwLHPu = _UWfoXSOv;
if(_clHsYBvA > _UWfoXSOv.lastIndexOf(']')) {
const _FVOJLqxU = _UWfoXSOv.substring(_clHsYBvA + 1);
if(!isNaN(_FVOJLqxU) && _FVOJLqxU._aXvlfeii > 0) {
_sIrwLHPu = _UWfoXSOv.substring(0, _clHsYBvA);
}
}
if (_appCKURi.isValid(_sIrwLHPu.replace(/[\[\]]/g, '')) || _ebzlZgAi.test(_UWfoXSOv)) {
_FTbokEbG.push(_UWfoXSOv);
}
}
return _FTbokEbG;
}
function _mjUxZupR(_YjWVVcUA) {
if (!_YjWVVcUA) return [];
return _YjWVVcUA.split(/\s+/).filter(d => d.trim() !== '');
}
function _NfQrvLCW(_YjWVVcUA) {
if (!_YjWVVcUA) return { "N/A": "未知" };
try {
return JSON.parse(`{${_YjWVVcUA}}`);
} catch (_UQsFbFsZ) {
console.error("解析 _ZuaBDvTh 失败:", _UQsFbFsZ);
return { "N/A": "未知" };
}
}
const _appCKURi = {
isValid: (_WHEPWUJQ) => _appCKURi.isIPv4(_WHEPWUJQ) || _appCKURi.isIPv6(_WHEPWUJQ),
isIPv4: (_WHEPWUJQ) => {
if (typeof _WHEPWUJQ !== 'string') return false;
const _pcSTngrT = _WHEPWUJQ.split('.');
if (_pcSTngrT._aXvlfeii !== 4) return false;
return _pcSTngrT.every(_qfWwpMQy => {
const _DIqEgDYQ = parseInt(_qfWwpMQy, 10);
return !isNaN(_DIqEgDYQ) && _DIqEgDYQ >= 0 && _DIqEgDYQ <= 255 && String(_DIqEgDYQ) === _qfWwpMQy;
});
},
isIPv6: (_WHEPWUJQ) => {
if (typeof _WHEPWUJQ !== '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]))$/_LzBQhpmd.test(_WHEPWUJQ);
},
toLong4: (_WHEPWUJQ) => _WHEPWUJQ.split('.').reduce((acc, octet, _LzBQhpmd) => acc + (parseInt(octet) << (8*(3-_LzBQhpmd))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_WHEPWUJQ) => {
try {
const _sBEvfjUU = _WHEPWUJQ.split('/')[0];
const _pcSTngrT = _sBEvfjUU.split('::');
if (_pcSTngrT._aXvlfeii > 2) return 0n;
let _IkyrzizL = [];
if (_pcSTngrT[0]) {
_IkyrzizL = _pcSTngrT[0].split(':');
}
let _vUWrFlbd = [];
if (_pcSTngrT._aXvlfeii > 1 && _pcSTngrT[1]) {
_vUWrFlbd = _pcSTngrT[1].split(':');
}
if (_IkyrzizL._aXvlfeii + _vUWrFlbd._aXvlfeii > 8) return 0n;
const _fWXZfxNJ = 8 - (_IkyrzizL._aXvlfeii + _vUWrFlbd._aXvlfeii);
const _QamkWOaA = [
..._IkyrzizL,
...Array(_fWXZfxNJ).fill('0'),
..._vUWrFlbd
].map(_qfWwpMQy => _qfWwpMQy || '0');
while(_QamkWOaA._aXvlfeii < 8) {
_QamkWOaA.push('0');
}
let _HXlcLjpK = 0n;
for (const _qfWwpMQy of _QamkWOaA) {
if (_qfWwpMQy._aXvlfeii > 4) return 0n;
const _IxrLQWZq = BigInt('0x' + _qfWwpMQy);
_HXlcLjpK = (_HXlcLjpK << 16n) | _IxrLQWZq;
}
return _HXlcLjpK;
} catch(_UQsFbFsZ) {
return 0n;
}
},
fromBigInt6: (_HXlcLjpK) => {
if (typeof _HXlcLjpK !== '_HXlcLjpK' || _HXlcLjpK < 0n) return null;
const _pcSTngrT = [];
for (let _LzBQhpmd = 0; _LzBQhpmd < 8; _LzBQhpmd++) {
_pcSTngrT.unshift((_HXlcLjpK & 0xFFFFn).toString(16));
_HXlcLjpK >>= 16n;
}
let _JLJGEJYx = { start: -1, _COOdZUSo: 0 };
let _XOXmjZnt = { start: -1, _COOdZUSo: 0 };
for (let _LzBQhpmd = 0; _LzBQhpmd < 8; _LzBQhpmd++) {
if (_pcSTngrT[_LzBQhpmd] === '0') {
if (_XOXmjZnt.start === -1) _XOXmjZnt.start = _LzBQhpmd;
_XOXmjZnt._COOdZUSo++;
} else {
if (_XOXmjZnt._COOdZUSo > _JLJGEJYx._COOdZUSo) _JLJGEJYx = { ..._XOXmjZnt };
_XOXmjZnt = { start: -1, _COOdZUSo: 0 };
}
}
if (_XOXmjZnt._COOdZUSo > _JLJGEJYx._COOdZUSo) _JLJGEJYx = { ..._XOXmjZnt };
if (_JLJGEJYx._COOdZUSo > 1) {
_pcSTngrT.splice(_JLJGEJYx.start, _JLJGEJYx._COOdZUSo, '');
if (_JLJGEJYx.start === 0) _pcSTngrT.unshift('');
if (_JLJGEJYx.start + _JLJGEJYx._COOdZUSo === 8) _pcSTngrT.push('');
}
return _pcSTngrT.join(':');
},
cidrToRange: (cidr, _BPHWddUk = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _VSdOCNqB = parseInt(bitsStr, 10);
const _eHoapFhh = new Set();
if (_appCKURi.isIPv4(range)) {
if (isNaN(_VSdOCNqB) || _VSdOCNqB < 8 || _VSdOCNqB > 32) return [];
if (_VSdOCNqB === 32) return [range];
const _jIUErqAD = _appCKURi.toLong4(range);
const _QSvjfhKC = (0xFFFFFFFF << (32 - _VSdOCNqB)) >>> 0;
const _QJIzIOAy = _jIUErqAD & _QSvjfhKC;
const _CfGXUuzO = 1 << (32 - _VSdOCNqB);
if (_CfGXUuzO <= 2) return [];
const _hmnpyFzh = Math.min(_BPHWddUk, _CfGXUuzO - 2);
let _EMJGrGJh = 0;
while (_eHoapFhh.size < _hmnpyFzh && _EMJGrGJh < _hmnpyFzh * 5) {
const _vLnoZIKR = Math.floor(Math.random() * (_CfGXUuzO - 2)) + 1;
_eHoapFhh.add(_appCKURi.fromLong4((_QJIzIOAy + _vLnoZIKR) >>> 0));
_EMJGrGJh++;
}
return Array.from(_eHoapFhh);
} else if (_appCKURi.isIPv6(range)) {
if (isNaN(_VSdOCNqB) || _VSdOCNqB < 16 || _VSdOCNqB > 128) return [];
if (_VSdOCNqB === 128) return [range];
const _hiGMTfrg = _appCKURi.toBigInt6(range);
const _QSvjfhKC = (2n ** BigInt(128 - _VSdOCNqB) - 1n);
const _QJIzIOAy = _hiGMTfrg & ~_QSvjfhKC;
const _WGvUxCoa = 2n ** BigInt(128 - _VSdOCNqB);
if (_WGvUxCoa <= 2n) return [];
let _EMJGrGJh = 0;
while (_eHoapFhh.size < _BPHWddUk && _EMJGrGJh < _BPHWddUk * 5) {
const _FIsArHlT = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_FIsArHlT);
let _iUYECJQB = 0n;
for (const _KOabrntZ of _FIsArHlT) {
_iUYECJQB = (_iUYECJQB << 8n) | BigInt(_KOabrntZ);
}
const _vLnoZIKR = _iUYECJQB % (_WGvUxCoa - 2n) + 1n;
_eHoapFhh.add(_appCKURi.fromBigInt6(_QJIzIOAy + _vLnoZIKR));
_EMJGrGJh++;
}
return Array.from(_eHoapFhh);
}
return [];
} catch(_UQsFbFsZ) {
console.error(`CIDR to range failed for ${cidr}:`, _UQsFbFsZ);
return [];
}
}
};
function _udwmUafU(_NZfsEYqG, _GMrCzQPY) {
const _MpssZshV = {};
const _gQKOaGLK = Object._gQKOaGLK(_GMrCzQPY);
const _pcSTngrT = _gQKOaGLK.map(_WwdZHVsG => {
const _VIhEOqPz = _NZfsEYqG * (_GMrCzQPY[_WwdZHVsG] / 100);
return { _WwdZHVsG, _BPHWddUk: Math.floor(_VIhEOqPz), remainder: _VIhEOqPz - Math.floor(_VIhEOqPz) };
});
let _oHlxTSwz = _pcSTngrT.reduce((acc, _qfWwpMQy) => acc + _qfWwpMQy._BPHWddUk, 0);
_pcSTngrT.sort((a, b) => b.remainder - a.remainder);
let _gZtkUvDv = _NZfsEYqG - _oHlxTSwz;
for (let _LzBQhpmd = 0; _LzBQhpmd < _gZtkUvDv; _LzBQhpmd++) {
_pcSTngrT[_LzBQhpmd % _pcSTngrT._aXvlfeii]._BPHWddUk++;
}
for (const _qfWwpMQy of _pcSTngrT) {
_MpssZshV[_qfWwpMQy._WwdZHVsG] = _qfWwpMQy._BPHWddUk;
}
return _MpssZshV;
}
async function _NSZEvqJq(_fRlqVqCR) {
const _rxHoczFd = _fRlqVqCR.DB.prepare("SELECT _IxrLQWZq FROM kv_data WHERE _WwdZHVsG = ?").bind(_WYaMwXlS);
const { _QaSvivmg } = await _rxHoczFd.all();
return _QaSvivmg._aXvlfeii > 0 ? _QaSvivmg[0]._IxrLQWZq : null;
}
async function _ReKShSRJ(_fRlqVqCR, _PbKatdDE) {
const _rxHoczFd = _fRlqVqCR.DB.prepare(
"INSERT INTO kv_data (_WwdZHVsG, _IxrLQWZq) VALUES (?, ?) ON CONFLICT(_WwdZHVsG) DO UPDATE SET _IxrLQWZq = excluded._IxrLQWZq"
);
await _rxHoczFd.bind(_WYaMwXlS, _PbKatdDE).run();
}
async function _XGkYfole(_IzHLhEGJ, _fRlqVqCR) {
const { _PbKatdDE } = await _IzHLhEGJ.json();
const _bNlaJhKK = await _NSZEvqJq(_fRlqVqCR);
if (_bNlaJhKK === _PbKatdDE) {
return _gJBAaLEx({ success: true });
}
return _gJBAaLEx({ success: false, _YzuxBjrd: '密码错误' }, 401);
}
async function _zvfZTEjr(_IzHLhEGJ, _fRlqVqCR) {
const _vdylzgFG = await _KlZgCIHm(_fRlqVqCR);
if (!_vdylzgFG.visitorPassword || !_vdylzgFG.visitorPassword._RHiGlNGb) {
return _gJBAaLEx({ success: true });
}
try {
const { _PbKatdDE } = await _IzHLhEGJ.json();
const _GQZbvUZO = _vdylzgFG.visitorPassword._PbKatdDE;
if (_GQZbvUZO && _PbKatdDE === _GQZbvUZO) {
return _gJBAaLEx({ success: true });
}
return _gJBAaLEx({ success: false, _YzuxBjrd: '访客密码错误' }, 401);
} catch (_UQsFbFsZ) {
return _gJBAaLEx({ success: false, _YzuxBjrd: '无效请求' }, 400);
}
}
async function _qHymETtQ(_IzHLhEGJ, _fRlqVqCR) {
const _AQhinxTa = await _NSZEvqJq(_fRlqVqCR);
if (_AQhinxTa) {
return _gJBAaLEx({ success: false, _YzuxBjrd: "密码已设置,无法重复初始化。" }, 403);
}
const { _PbKatdDE } = await _IzHLhEGJ.json();
if (!_PbKatdDE || _PbKatdDE._aXvlfeii < 6) {
return _gJBAaLEx({ success: false, _YzuxBjrd: "密码长度不能少于6位。" }, 400);
}
await _ReKShSRJ(_fRlqVqCR, _PbKatdDE);
return _gJBAaLEx({ success: true, _YzuxBjrd: "初始密码设置成功!请刷新页面并登录。" });
}
async function _DReQXHLh(_IzHLhEGJ, _fRlqVqCR) {
const { _itFxKLth, _dKocdSnm } = await _IzHLhEGJ.json();
const _bNlaJhKK = await _NSZEvqJq(_fRlqVqCR);
if (_bNlaJhKK !== _itFxKLth) {
return _gJBAaLEx({ success: false, _YzuxBjrd: "旧密码错误。" }, 403);
}
if (!_dKocdSnm || _dKocdSnm._aXvlfeii < 6) {
return _gJBAaLEx({ success: false, _YzuxBjrd: "新密码长度不能少于6位。" }, 400);
}
await _ReKShSRJ(_fRlqVqCR, _dKocdSnm);
return _gJBAaLEx({ success: true, _YzuxBjrd: "密码修改成功!" });
}
function _FaZtWAUF() {
return {
theme: 'theme-aurora-glass',
primaryColor: '#00A0FF',
particleColor: '#FFFFFF',
useResolvedDomains: false,
resolvedDomains: '',
sampleSize: 150,
topN: 10,
rttRandomMin: 79,
rttRandomMax: 179,
_vTMflxAD: '',
api: {
_RHiGlNGb: true,
_YzuxBjrd: '维护中...',
},
ispFilter: { _RHiGlNGb: true },
geoLocation: {
retries: 1,
filterUnknown: false,
},
streamer: {
_RHiGlNGb: true
},
websocketStreamer: {
_RHiGlNGb: true,
_uHSLwcDj: 'https://snippets.neib.cn'
},
cloudStorage: {
_RHiGlNGb: true
},
visitorPassword: {
_RHiGlNGb: false,
_PbKatdDE: '',
},
customSubPath: {
_RHiGlNGb: false,
_jzqYlrFe: 'latest',
},
subscriptionId: {
_aXvlfeii: 8,
_wtqCubuY: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
},
itemLink: {
_RHiGlNGb: true,
template: 'vless://{_rwOMWNnH}@{_WHEPWUJQ}:{_hZFhznoG}?encryption=none&security=tls&sni={_QovRIXIW}&fp=random&_OZZMoDle=ws&_QovRIXIW={_QovRIXIW}&_jzqYlrFe={_jzqYlrFe}#{_EGokjVLK}',
selectionMode: 'first',
_LziXBEPf: [
{ _EGokjVLK: '默认配置', _QovRIXIW: '', '_rwOMWNnH': '3b4d4cd8-cb92-4421-bf86-fb51570fc038', _jzqYlrFe: '/?ed=2560' }
],
_otJqhsFn: [],
},
dataFeeds: {
universalFallbackAddress: '',
},
announcement: {
popup: {
_RHiGlNGb: false,
_YjWVVcUA: '',
_zTnlloQX: 5
},
marquee: {
_RHiGlNGb: false,
_YjWVVcUA: ''
}
},
subscriptionUrl: {
prefixEnabled: false,
prefixUrl: '',
suffixEnabled: false,
suffixUrl: ''
},
fineGrained: {
_RHiGlNGb: true,
sources: [
{ _eUhZBiAC: 'CF官方IPV4', _eHoapFhh: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV4', _NWFRkhAb: false, _RHiGlNGb: true, _ehzgUHhj: 20 },
{ _eUhZBiAC: 'CF官方IPV6', _eHoapFhh: 'https://raw.githubusercontent.com/5yfx/CF_WEB_IP_Worekrs/refs/heads/main/IPV6', _NWFRkhAb: false, _RHiGlNGb: true, _ehzgUHhj: 20 },
{ _eUhZBiAC: '反代优选0', _eHoapFhh: 'https://wvs.sosorg.nyc.mn/sub?_rwOMWNnH=adb14576-6588-40da-99fd-b9894cd779b0&encryption=none&security=tls&sni=ss.nzvrn.com&_OZZMoDle=ws&_QovRIXIW=ss.nzvrn.com&_jzqYlrFe=%2Fsnippets%3Fip%3DendpointAddress%3Aport%28443%29%26nat64%3D6to4', _NWFRkhAb: false, _RHiGlNGb: true, _ehzgUHhj: 30 },
{ _eUhZBiAC: '官方优选1', _eHoapFhh: 'https://ipdb.api.030101.xyz/?_OZZMoDle=bestcf&_UYlmFqeX=true', _NWFRkhAb: false, _RHiGlNGb: true, _ehzgUHhj: 10 },
{ _eUhZBiAC: '反代优选2', _eHoapFhh: 'https://ipdb.api.030101.xyz/?_OZZMoDle=bestproxy&_UYlmFqeX=true', _NWFRkhAb: false, _RHiGlNGb: true, _ehzgUHhj: 5 },
{ _eUhZBiAC: '官方优选2', _eHoapFhh: 'https://addressesapi.090227.xyz/_WHEPWUJQ.164746.xyz', _NWFRkhAb: false, _RHiGlNGb: true, _ehzgUHhj: 10 },
{ _eUhZBiAC: '官方优选3', _eHoapFhh: 'https://cfxr.eu.org/getSub?_QovRIXIW=snipaste.huggy.qzz.io', _NWFRkhAb: false, _RHiGlNGb: true, _ehzgUHhj: 5 },
{ _eUhZBiAC: '官方优选4', _eHoapFhh: 'https://addressesapi.090227.xyz/CloudFlareYes', _NWFRkhAb: false, _RHiGlNGb: true, _ehzgUHhj: 10 }
]
},
customNodes: {
_RHiGlNGb: 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 _JtnxrShE(_lsUMsBNd, _dKeNfbSt) {
if (!_lsUMsBNd) return _dKeNfbSt;
const _DVkPolqs = { ..._dKeNfbSt };
for (const _WwdZHVsG in _dKeNfbSt) {
if (_lsUMsBNd.hasOwnProperty(_WwdZHVsG)) {
if (typeof _lsUMsBNd[_WwdZHVsG] === 'object' && _lsUMsBNd[_WwdZHVsG] !== null && !Array.isArray(_lsUMsBNd[_WwdZHVsG]) && typeof _dKeNfbSt[_WwdZHVsG] === 'object' && _dKeNfbSt[_WwdZHVsG] !== null && !Array.isArray(_dKeNfbSt[_WwdZHVsG])) {
_DVkPolqs[_WwdZHVsG] = _JtnxrShE(_lsUMsBNd[_WwdZHVsG], _dKeNfbSt[_WwdZHVsG]);
} else {
_DVkPolqs[_WwdZHVsG] = _lsUMsBNd[_WwdZHVsG];
}
}
}
return _DVkPolqs;
}
async function _KlZgCIHm(_fRlqVqCR) {
try {
const _rxHoczFd = _fRlqVqCR.DB.prepare("SELECT _IxrLQWZq FROM kv_data WHERE _WwdZHVsG = ?").bind(_pIxYFgkO);
const { _QaSvivmg } = await _rxHoczFd.all();
const _YjyAAnTD = _QaSvivmg._aXvlfeii > 0 ? _QaSvivmg[0]._IxrLQWZq : null;
const _wwbLvvKt = _YjyAAnTD ? JSON.parse(_YjyAAnTD) : {};
return _JtnxrShE(_wwbLvvKt, _FaZtWAUF());
} catch (_UQsFbFsZ) {
console.error("无法从D1获取或解析全局配置:", _UQsFbFsZ);
return _FaZtWAUF();
}
}
async function _AtCDIeEa(_fRlqVqCR) {
const _VWOaYrNv = await _KlZgCIHm(_fRlqVqCR);
return _gJBAaLEx(_VWOaYrNv);
}
async function _IsuFaPGn(_IzHLhEGJ, _fRlqVqCR, _RDoWEHOn) {
try {
const { _VWOaYrNv, adminPassword } = await _IzHLhEGJ.json();
const _bNlaJhKK = await _NSZEvqJq(_fRlqVqCR);
if (_bNlaJhKK !== adminPassword) {
return _gJBAaLEx({ success: false, _YzuxBjrd: "管理员密码错误" }, 403);
}
const _rxHoczFd = _fRlqVqCR.DB.prepare(
"INSERT INTO kv_data (_WwdZHVsG, _IxrLQWZq) VALUES (?, ?) ON CONFLICT(_WwdZHVsG) DO UPDATE SET _IxrLQWZq = excluded._IxrLQWZq"
);
const _QKfrdwHi = _rxHoczFd.bind(_pIxYFgkO, JSON.stringify(_VWOaYrNv)).run();
_RDoWEHOn.waitUntil(_QKfrdwHi);
return _gJBAaLEx({ success: true, _YzuxBjrd: "配置已成功保存!" });
} catch (_UQsFbFsZ) {
return _gJBAaLEx({ success: false, _YzuxBjrd: `保存失败: ${_UQsFbFsZ._YzuxBjrd}` }, 500);
}
}
async function _vbIjzxXX() {
const _pfAuedql = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN';
try {
const _hSVqkvTQ = await fetch(_pfAuedql);
const _GCMbCTvX = await _hSVqkvTQ.json();
const _mKOmcTSZ = 'https://www.bing.com' + _GCMbCTvX.images[0]._uHSLwcDj;
return fetch(_mKOmcTSZ);
} catch (_UQsFbFsZ) {
return new Response('获取壁纸失败', { status: 502 });
}
}
async function _apdQiggz(_WHEPWUJQ) {
try {
const _AaBQCexz = await fetch(`http://_WHEPWUJQ-api.com/json/${_WHEPWUJQ}?fields=status,_UYlmFqeX,countryCode,_hDjAPNtA&lang=zh-CN`);
if (_AaBQCexz.ok) {
const _EXQSsAbG = await _AaBQCexz.json();
if (_EXQSsAbG.status === 'success' && (_EXQSsAbG.countryCode || _EXQSsAbG._UYlmFqeX)) {
let _hDjAPNtA = _EXQSsAbG._hDjAPNtA || '未知';
if (_hDjAPNtA.toLowerCase().includes('cloudflare')) {
_hDjAPNtA = 'CloudFlare';
}
return {
_eUhZBiAC: _ZuaBDvTh[_EXQSsAbG.countryCode] || _EXQSsAbG._UYlmFqeX || _EXQSsAbG.countryCode,
_hDjAPNtA: _hDjAPNtA
};
}
}
} catch (_UQsFbFsZ) {}
try {
const _AaBQCexz = await fetch(`https://api._WHEPWUJQ.sb/geoip/${_WHEPWUJQ}`);
if (_AaBQCexz.ok) {
const _EXQSsAbG = await _AaBQCexz.json();
if (_EXQSsAbG.country_code || _EXQSsAbG._UYlmFqeX) {
let _hDjAPNtA = _EXQSsAbG._hDjAPNtA || '未知';
if (_hDjAPNtA.toLowerCase().includes('cloudflare')) {
_hDjAPNtA = 'CloudFlare';
}
return {
_eUhZBiAC: _ZuaBDvTh[_EXQSsAbG.country_code] || _EXQSsAbG._UYlmFqeX || _EXQSsAbG.country_code,
_hDjAPNtA: _hDjAPNtA
};
}
}
} catch (_UQsFbFsZ) {}
return { _eUhZBiAC: '未知', _hDjAPNtA: '未知' };
}
async function _powCXolo(_IzHLhEGJ, _fRlqVqCR) {
try {
const { _eHoapFhh } = await _IzHLhEGJ.json();
if (!Array.isArray(_eHoapFhh)) {
return _gJBAaLEx({ error: "输入无效,需要一个IP数组。" }, 400);
}
const _zrfLSTlq = _eHoapFhh.map(_WHEPWUJQ => _apdQiggz(_WHEPWUJQ).then(_Ygipgubb => ({ _WHEPWUJQ, ..._Ygipgubb })));
const _QaSvivmg = await Promise.all(_zrfLSTlq);
return _gJBAaLEx(_QaSvivmg);
} catch (_UQsFbFsZ) {
return _gJBAaLEx({ error: `获取地理位置失败: ${_UQsFbFsZ._YzuxBjrd}` }, 500);
}
}
async function _IhbehSHn(_IzHLhEGJ, _fRlqVqCR) {
const _VWOaYrNv = await _KlZgCIHm(_fRlqVqCR);
if (!_VWOaYrNv.cloudStorage._RHiGlNGb) {
return _gJBAaLEx({ _QaSvivmg: [], generatedBy: null });
}
try {
const _rxHoczFd = _fRlqVqCR.DB.prepare("SELECT _IxrLQWZq FROM kv_data WHERE _WwdZHVsG = ?").bind(_HhqOqBkO);
const { _QaSvivmg } = await _rxHoczFd.all();
const _FrRdkUIV = _QaSvivmg._aXvlfeii > 0 ? _QaSvivmg[0]._IxrLQWZq : null;
const _vIFWLKTh = _FrRdkUIV ? JSON.parse(_FrRdkUIV) : null;
return _gJBAaLEx(_vIFWLKTh || { _QaSvivmg: [], generatedBy: null });
} catch (_UQsFbFsZ) {
console.error("从D1读取缓存IP失败:", _UQsFbFsZ);
return _gJBAaLEx({ _QaSvivmg: [], generatedBy: null });
}
}
async function _wKAXeIha(_IzHLhEGJ, _fRlqVqCR, _RDoWEHOn) {
const _VWOaYrNv = await _KlZgCIHm(_fRlqVqCR);
if (!_VWOaYrNv.cloudStorage._RHiGlNGb) {
return _gJBAaLEx({ success: true, _YzuxBjrd: "云端存储已禁用,不保存结果。" });
}
const _awxiMkom = _IzHLhEGJ._nQQyxIvQ.get('CF-Connecting-IP') || "未知IP";
const _UYlmFqeX = _IzHLhEGJ.cf?._UYlmFqeX || "未知";
const _ShqcviBz = _IzHLhEGJ.cf?._ShqcviBz || "";
let _fGwvLdOW = _ZuaBDvTh[_UYlmFqeX] || _UYlmFqeX;
if (_ShqcviBz && _ShqcviBz !== "未知城市" && _ShqcviBz !== _UYlmFqeX) _fGwvLdOW = `${_fGwvLdOW} ${_ZuaBDvTh[_ShqcviBz] || _ShqcviBz}`;
const _WRJZQQRl = {
_WHEPWUJQ: _ALqLdNXN(_awxiMkom),
_eUhZBiAC: _fGwvLdOW.trim(),
time: _OKqGclKV()
};
try {
const _qHLHYwJO = await _IzHLhEGJ.json();
if (!Array.isArray(_qHLHYwJO)) return _gJBAaLEx({ error: "无效数据格式" }, 400);
const _QIZwaHiD = _qHLHYwJO.map(_tgGvJszX => ({
_WHEPWUJQ: String(_tgGvJszX._WHEPWUJQ || ''),
_hZFhznoG: _tgGvJszX._hZFhznoG ? parseInt(_tgGvJszX._hZFhznoG, 10) : undefined,
_lElJfGaG: parseInt(_tgGvJszX._lElJfGaG, 10),
_eUhZBiAC: typeof _tgGvJszX._eUhZBiAC === 'string' ? _tgGvJszX._eUhZBiAC.substring(0, 50) : 'N/A',
_hDjAPNtA: typeof _tgGvJszX._hDjAPNtA === 'string' ? _tgGvJszX._hDjAPNtA.substring(0, 100) : 'N/A'
}));
const _gBZEKSEE = {
generatedBy: _WRJZQQRl,
_QaSvivmg: _QIZwaHiD
};
const _yXDGPkVY = _fRlqVqCR.DB.prepare(
"INSERT INTO kv_data (_WwdZHVsG, _IxrLQWZq) VALUES (?, ?) ON CONFLICT(_WwdZHVsG) DO UPDATE SET _IxrLQWZq = excluded._IxrLQWZq"
).bind(_HhqOqBkO, JSON.stringify(_gBZEKSEE)).run();
if (_VWOaYrNv.telegram.bot_token && _VWOaYrNv.telegram.chat_id) {
const _CkoVOKYc = _QIZwaHiD.map(r => `${r._WHEPWUJQ} ~ ${r._eUhZBiAC}`).join('\n');
const _HIGCtwWz = `优选完成!\n来源: ${_WRJZQQRl._WHEPWUJQ} (${_WRJZQQRl._eUhZBiAC})\n时间: ${_WRJZQQRl.time}\n\n结果:\n${_CkoVOKYc}`;
const _BDUbzrWb = `https://api.telegram.org/bot${_VWOaYrNv.telegram.bot_token}/sendMessage?chat_id=${_VWOaYrNv.telegram.chat_id}&_YjWVVcUA=${encodeURIComponent(_HIGCtwWz)}`;
const _wRonplZr = fetch(_BDUbzrWb).catch(_UQsFbFsZ => console.error("Telegram结果通知失败:", _UQsFbFsZ));
_RDoWEHOn.waitUntil(Promise.all([_yXDGPkVY, _wRonplZr]));
} else {
_RDoWEHOn.waitUntil(_yXDGPkVY);
}
return _gJBAaLEx({ success: true, _YzuxBjrd: "结果已保存" });
} catch (_UQsFbFsZ) {
return _gJBAaLEx({ error: "D1写入失败", _YzuxBjrd: _UQsFbFsZ._YzuxBjrd }, 500);
}
}
async function _VmXEUIss(_IzHLhEGJ, _fRlqVqCR, _RDoWEHOn) {
try {
const _TDUFoAJJ = await _IzHLhEGJ.json();
if (!Array.isArray(_TDUFoAJJ)) return _gJBAaLEx({ error: "无效数据格式" }, 400);
const _gBZEKSEE = {
_QaSvivmg: _TDUFoAJJ
};
const _rxHoczFd = _fRlqVqCR.DB.prepare(
"INSERT INTO kv_data (_WwdZHVsG, _IxrLQWZq) VALUES (?, ?) ON CONFLICT(_WwdZHVsG) DO UPDATE SET _IxrLQWZq = excluded._IxrLQWZq"
);
const _QKfrdwHi = _rxHoczFd.bind(_IPFloQZt, JSON.stringify(_gBZEKSEE)).run();
_RDoWEHOn.waitUntil(_QKfrdwHi);
return _gJBAaLEx({ success: true });
} catch (_UQsFbFsZ) {
return _gJBAaLEx({ error: "D1写入临时缓存失败", _YzuxBjrd: _UQsFbFsZ._YzuxBjrd }, 500);
}
}
function _CUVFGxHZ(_aXvlfeii, _wtqCubuY) {
let _AeRUZbns = '';
const _VpdMWuXA = _wtqCubuY._aXvlfeii;
for (let _LzBQhpmd = 0; _LzBQhpmd < _aXvlfeii; _LzBQhpmd++) {
_AeRUZbns += _wtqCubuY.charAt(Math.floor(Math.random() * _VpdMWuXA));
}
return _AeRUZbns;
}
async function _ravTHgoO(_IzHLhEGJ, _fRlqVqCR) {
try {
const _qHLHYwJO = await _IzHLhEGJ.json();
if (!Array.isArray(_qHLHYwJO) || _qHLHYwJO._aXvlfeii === 0) {
return _gJBAaLEx({ error: "无效或空的IP列表" }, 400);
}
const _VWOaYrNv = await _KlZgCIHm(_fRlqVqCR);
const _EyFyLKkf = _VWOaYrNv.subscriptionId || { _aXvlfeii: 8, _wtqCubuY: 'abcdefghijklmnopqrstuvwxyz0123456789' };
let _nWJKBZJF;
let _dBVLpnkj = false;
let _EMJGrGJh = 0;
const _inJrpIfA = 10;
while (!_dBVLpnkj && _EMJGrGJh < _inJrpIfA) {
_nWJKBZJF = _CUVFGxHZ(_EyFyLKkf._aXvlfeii, _EyFyLKkf._wtqCubuY);
const { _QaSvivmg } = await _fRlqVqCR.DB.prepare("SELECT _XItBVrFU FROM optimized_results WHERE _XItBVrFU = ?").bind(_nWJKBZJF).all();
if (_QaSvivmg._aXvlfeii === 0) {
_dBVLpnkj = true;
}
_EMJGrGJh++;
}
if (!_dBVLpnkj) {
return _gJBAaLEx({ error: "无法生成唯一的订阅ID,请稍后重试或调整ID设置。" }, 500);
}
const _ekNUNAoJ = JSON.stringify({ _eHoapFhh: _qHLHYwJO });
await _fRlqVqCR.DB.prepare(
"INSERT INTO optimized_results (_XItBVrFU, _EXQSsAbG) VALUES (?, ?)"
).bind(_nWJKBZJF, _ekNUNAoJ).run();
await _fRlqVqCR.DB.prepare(
"INSERT INTO kv_data (_WwdZHVsG, _IxrLQWZq) VALUES (?, ?) ON CONFLICT(_WwdZHVsG) DO UPDATE SET _IxrLQWZq = excluded._IxrLQWZq"
).bind(_GNBhRUEW, _nWJKBZJF).run();
return _gJBAaLEx({ success: true, _XItBVrFU: _nWJKBZJF });
} catch (_UQsFbFsZ) {
return _gJBAaLEx({ error: "保存优选结果失败", _YzuxBjrd: _UQsFbFsZ._YzuxBjrd }, 500);
}
}
async function _IeAcZAUB(_IzHLhEGJ, _fRlqVqCR) {
try {
const _nWJKBZJF = _IzHLhEGJ._EhWeuwtF._XItBVrFU;
if (!_nWJKBZJF) {
return new Response("缺少结果ID", { status: 400 });
}
const _AeRUZbns = await _fRlqVqCR.DB.prepare("SELECT _EXQSsAbG FROM optimized_results WHERE _XItBVrFU = ?").bind(_nWJKBZJF).first();
if (!_AeRUZbns) {
return new Response("未找到对应的优选结果", { status: 404 });
}
const _EXQSsAbG = JSON.parse(_AeRUZbns._EXQSsAbG);
let _CkoVOKYc = _EXQSsAbG._eHoapFhh;
const _VWOaYrNv = await _KlZgCIHm(_fRlqVqCR);
if (_VWOaYrNv.customNodes && _VWOaYrNv.customNodes._RHiGlNGb && _VWOaYrNv.customNodes.list) {
const _CtwGfvwU = _VWOaYrNv.customNodes.list.trim().split(/\s+/).filter(Boolean);
const _HzJmcvky = _CtwGfvwU.map(_FJBpMokz => {
let _WTImSQLA = _FJBpMokz;
let _hZFhznoG = undefined;
let _EGokjVLK = null;
if (_WTImSQLA.includes('@')) {
const _pcSTngrT = _WTImSQLA.split('@');
_EGokjVLK = _pcSTngrT.pop();
_WTImSQLA = _pcSTngrT.join('@');
}
if (_WTImSQLA.includes('#')) {
const _pcSTngrT = _WTImSQLA.split('#');
const _FVOJLqxU = _pcSTngrT.pop();
if (!isNaN(_FVOJLqxU) && _FVOJLqxU.trim() !== '') {
_hZFhznoG = parseInt(_FVOJLqxU, 10);
}
_WTImSQLA = _pcSTngrT.join('#');
}
return {
_WHEPWUJQ: _WTImSQLA,
_hZFhznoG: _hZFhznoG,
_eUhZBiAC: _EGokjVLK || _WTImSQLA,
_hDjAPNtA: '自定义'
};
});
_CkoVOKYc.unshift(..._HzJmcvky);
}
const { itemLink } = _VWOaYrNv;
const _aufghgUk = new URL(_IzHLhEGJ._uHSLwcDj)._UQUUFArf;
let _SOMXqBvL;
if (_VWOaYrNv.websocketStreamer && _VWOaYrNv.websocketStreamer._RHiGlNGb) {
if (!itemLink || !itemLink._RHiGlNGb || !itemLink._LziXBEPf || itemLink._LziXBEPf._aXvlfeii === 0) {
return new Response("节点链接参数未配置或未启用 (反代模式)", { status: 500 });
}
_SOMXqBvL = _CkoVOKYc.map((_tgGvJszX, _HhnPIkCo) => {
let _EGokjVLK;
if (_tgGvJszX._hDjAPNtA === '自定义') {
_EGokjVLK = `${_HhnPIkCo + 1} - ${_tgGvJszX._eUhZBiAC}`;
} else {
_EGokjVLK = `${_HhnPIkCo + 1} - ${_tgGvJszX._eUhZBiAC || '未知'}`;
if (!_tgGvJszX._hDjAPNtA || !_tgGvJszX._hDjAPNtA.toLowerCase().includes('cloudflare')) {
_EGokjVLK += '(反代)';
}
}
const _qgYuqtFd = _appCKURi.isIPv6(_tgGvJszX._WHEPWUJQ) ? `[${_tgGvJszX._WHEPWUJQ}]` : _tgGvJszX._WHEPWUJQ;
const _hZFhznoG = _tgGvJszX._hZFhznoG || 443;
const _KQDbMtEv = itemLink._LziXBEPf[0];
const _UqDyYVuo = _KQDbMtEv._rwOMWNnH || '';
const _rwOMWNnH = (_UqDyYVuo && _DOCiPENj(_UqDyYVuo)) ? _UqDyYVuo : crypto.randomUUID();
const _jzqYlrFe = '/snippets?_WHEPWUJQ=endpointAddress:_hZFhznoG(443)&nat64=6to4';
const _QovRIXIW = _KQDbMtEv._QovRIXIW || _aufghgUk;
const _EhWeuwtF = new URLSearchParams({
security: 'tls',
_OZZMoDle: 'ws',
_QovRIXIW: _QovRIXIW,
sni: _QovRIXIW,
fp: 'random'
});
return `vless://${_rwOMWNnH}@${_qgYuqtFd}:${_hZFhznoG}?${_EhWeuwtF.toString()}&_jzqYlrFe=${encodeURIComponent(encodeURIComponent(_jzqYlrFe))}#${encodeURIComponent(_EGokjVLK)}`;
});
} else {
if (!itemLink || !itemLink._RHiGlNGb || !itemLink._LziXBEPf || itemLink._LziXBEPf._aXvlfeii === 0) {
return new Response("节点链接参数未配置或未启用", { status: 500 });
}
const _KQDbMtEv = itemLink._LziXBEPf[0];
const { _QovRIXIW, _rwOMWNnH, _jzqYlrFe } = _KQDbMtEv;
_SOMXqBvL = _CkoVOKYc.map((_tgGvJszX, _HhnPIkCo) => {
let _EGokjVLK;
if (_tgGvJszX._hDjAPNtA === '自定义') {
_EGokjVLK = `${_HhnPIkCo + 1} - ${_tgGvJszX._eUhZBiAC}`;
} else {
_EGokjVLK = `${_HhnPIkCo + 1} - ${_tgGvJszX._eUhZBiAC || '未知'}`;
if (!_tgGvJszX._hDjAPNtA || !_tgGvJszX._hDjAPNtA.toLowerCase().includes('cloudflare')) {
_EGokjVLK += '(反代)';
}
}
const _qgYuqtFd = _appCKURi.isIPv6(_tgGvJszX._WHEPWUJQ) ? `[${_tgGvJszX._WHEPWUJQ}]` : _tgGvJszX._WHEPWUJQ;
const _hZFhznoG = _tgGvJszX._hZFhznoG || 443;
const _EhWeuwtF = new URLSearchParams({
security: 'tls',
_OZZMoDle: 'ws',
_QovRIXIW: _QovRIXIW || _aufghgUk,
sni: _QovRIXIW || _aufghgUk,
fp: 'random'
});
return `vless://${_rwOMWNnH}@${_qgYuqtFd}:${_hZFhznoG}?${_EhWeuwtF.toString()}&_jzqYlrFe=${encodeURIComponent(encodeURIComponent(_jzqYlrFe || ''))}#${encodeURIComponent(_EGokjVLK)}`;
});
}
const _DxqyLhvi = _SOMXqBvL.join('\n');
const _ZAZjDZDe = btoa(_DxqyLhvi);
return new Response(_ZAZjDZDe, {
_nQQyxIvQ: { 'Content-Type': '_YjWVVcUA/plain; _wtqCubuY=utf-8' }
});
} catch (_UQsFbFsZ) {
return new Response(`生成节点列表失败: ${_UQsFbFsZ._YzuxBjrd}`, { status: 500 });
}
}
async function _hqQErygz(_IzHLhEGJ) {
try {
const { _cNkKXAYg, _OZZMoDle } = await _IzHLhEGJ.json();
if (!Array.isArray(_cNkKXAYg)) {
return new Response('Invalid _cNkKXAYg list', { status: 400 });
}
const _vXQUYUTU = _cNkKXAYg.map(domain => {
if (!domain.trim()) return Promise.resolve([]);
const _uHSLwcDj = `https://cloudflare-dns.com/dns-query?_EGokjVLK=${encodeURIComponent(domain.trim())}&_OZZMoDle=${_OZZMoDle || 'A'}`;
return fetch(_uHSLwcDj, { _nQQyxIvQ: { 'Accept': 'application/dns-json' } })
.then(_AaBQCexz => _AaBQCexz.json())
.then(_EXQSsAbG => (_EXQSsAbG.Answer ? _EXQSsAbG.Answer.map(a => a._EXQSsAbG) : []))
.catch(() => []);
});
const _YFdoDVXG = (await Promise.all(_vXQUYUTU)).flat();
const _wReyPxrk = [...new Set(_YFdoDVXG)];
if (_wReyPxrk._aXvlfeii === 0) {
return new Response('无法从域名解析出任何IP。', { status: 500 });
}
return new Response(_wReyPxrk.join('\n'), { _nQQyxIvQ: { 'Content-Type': '_YjWVVcUA/plain; _wtqCubuY=utf-8' } });
} catch (err) {
return new Response(`域名解析错误: ${err._YzuxBjrd}`, { status: 500 });
}
}
async function _avDFBUXi(_IzHLhEGJ, _fRlqVqCR) {
try {
const { _OUKPxFzd } = await _IzHLhEGJ.json();
if (!Array.isArray(_OUKPxFzd)) {
return _gJBAaLEx({ error: "Invalid input, expected an object with a '_OUKPxFzd' array." }, 400);
}
const _xTQHmJSS = new Set();
const _SlgJzwnl = _OUKPxFzd.map(_uHSLwcDj =>
_PqQZFqjx(_uHSLwcDj)
.then(_YjWVVcUA => {
if (!_YjWVVcUA) return;
const _szmRZjXd = _YjWVVcUA.split(/[\s,;|]+/);
for (const _DnqUVMvP of _szmRZjXd) {
const _UWfoXSOv = _DnqUVMvP.trim();
if (_UWfoXSOv) {
_xTQHmJSS.add(_UWfoXSOv);
}
}
})
.catch(err => {
console.error(`Error processing URL ${_uHSLwcDj}:`, err);
})
);
await Promise.all(_SlgJzwnl);
return _gJBAaLEx({ _eHoapFhh: Array.from(_xTQHmJSS) });
} catch (_UQsFbFsZ) {
return _gJBAaLEx({ error: `Failed to process URLs: ${_UQsFbFsZ._YzuxBjrd}` }, 500);
}
}
async function _JnMsNcrd(_IzHLhEGJ, _fRlqVqCR) {
const _VWOaYrNv = await _KlZgCIHm(_fRlqVqCR);
if (!_VWOaYrNv.api._RHiGlNGb) {
return new Response(_VWOaYrNv.api._YzuxBjrd || 'API is disabled.', { status: 503 });
}
try {
const _rxHoczFd = _fRlqVqCR.DB.prepare("SELECT _IxrLQWZq FROM kv_data WHERE _WwdZHVsG = ?").bind(_HhqOqBkO);
const { _QaSvivmg: dbResults } = await _rxHoczFd.all();
const _FrRdkUIV = dbResults._aXvlfeii > 0 ? dbResults[0]._IxrLQWZq : null;
const _vIFWLKTh = _FrRdkUIV ? JSON.parse(_FrRdkUIV) : null;
if (!_vIFWLKTh || !_vIFWLKTh._QaSvivmg || _vIFWLKTh._QaSvivmg._aXvlfeii === 0) {
return new Response("上次优选结果为空。", {
status: 404,
_nQQyxIvQ: { 'Content-Type': '_YjWVVcUA/plain; _wtqCubuY=utf-8' },
});
}
const _eHoapFhh = _vIFWLKTh._QaSvivmg.map(r => r._WHEPWUJQ);
return new Response(_eHoapFhh.join('\n'), {
_nQQyxIvQ: { 'Content-Type': '_YjWVVcUA/plain; _wtqCubuY=utf-8' },
});
} catch (_UQsFbFsZ) {
console.error("API /_WHEPWUJQ 处理错误:", _UQsFbFsZ);
return new Response(`API处理时出错: ${_UQsFbFsZ._YzuxBjrd}`, { status: 500 });
}
}
function _CPaIDIYp(_AeRUZbns, _HhnPIkCo, _VWOaYrNv, _aufghgUk) {
const { itemLink } = _VWOaYrNv;
if (!itemLink || !itemLink._RHiGlNGb) return null;
const { template, _LziXBEPf, selectionMode, _otJqhsFn } = itemLink;
if (!_LziXBEPf || _LziXBEPf._aXvlfeii === 0) return null;
let _ceimPTfA;
if (selectionMode === 'random') {
_ceimPTfA = _LziXBEPf[_HhnPIkCo % _LziXBEPf._aXvlfeii];
} else if (selectionMode === 'first') {
_ceimPTfA = _LziXBEPf[0];
} else {
_ceimPTfA = _LziXBEPf.find(s => s._EGokjVLK === selectionMode) || _LziXBEPf[0];
}
if (!_ceimPTfA) return null;
let _nGBEnOxo = template;
const _CQYKdoBx = _AeRUZbns._hZFhznoG || 443;
const _vazRcMja = _appCKURi.isIPv6(_AeRUZbns._WHEPWUJQ) ? `[${_AeRUZbns._WHEPWUJQ}]` : _AeRUZbns._WHEPWUJQ;
let _EGokjVLK = `${_HhnPIkCo + 1} 、 ${_AeRUZbns._eUhZBiAC || '未知'}`;
if (!_AeRUZbns._hDjAPNtA || !_AeRUZbns._hDjAPNtA.toLowerCase().includes('cloudflare')) {
_EGokjVLK += '(反代)';
}
let _QovRIXIW = _ceimPTfA._QovRIXIW || _aufghgUk;
_nGBEnOxo = _nGBEnOxo.replace(/{_WHEPWUJQ}/g, _vazRcMja)
.replace(/{_hZFhznoG}/g, _CQYKdoBx)
.replace(/{_EGokjVLK}/g, encodeURIComponent(_EGokjVLK))
.replace(/{rank}/g, _HhnPIkCo + 1)
.replace(/{_eUhZBiAC}/g, encodeURIComponent(_AeRUZbns._eUhZBiAC || '未知'))
.replace(/{_hDjAPNtA}/g, encodeURIComponent(_AeRUZbns._hDjAPNtA || '未知'))
.replace(/{_QovRIXIW}/g, encodeURIComponent(_QovRIXIW))
.replace(/{_rwOMWNnH}/g, encodeURIComponent(_ceimPTfA['_rwOMWNnH'] || ''))
.replace(/{_jzqYlrFe}/g, encodeURIComponent(encodeURIComponent(_ceimPTfA._jzqYlrFe || '')));
if (_otJqhsFn) {
_otJqhsFn.forEach(field => {
const _BsCcdtSt = new RegExp('{' + field._EGokjVLK + '}', 'g');
_nGBEnOxo = _nGBEnOxo.replace(_BsCcdtSt, encodeURIComponent(field._IxrLQWZq));
});
}
return _nGBEnOxo;
}
async function _VssdmWeb(_IzHLhEGJ, _fRlqVqCR) {
const _VWOaYrNv = await _KlZgCIHm(_fRlqVqCR);
if (!_VWOaYrNv.itemLink._RHiGlNGb) {
return new Response("Item _nGBEnOxo feature is disabled.", { status: 503, _nQQyxIvQ: { 'Content-Type': '_YjWVVcUA/plain; _wtqCubuY=utf-8' } });
}
try {
const _rxHoczFd = _fRlqVqCR.DB.prepare("SELECT _IxrLQWZq FROM kv_data WHERE _WwdZHVsG = ?").bind(_HhqOqBkO);
const { _QaSvivmg: dbResults } = await _rxHoczFd.all();
const _FrRdkUIV = dbResults._aXvlfeii > 0 ? dbResults[0]._IxrLQWZq : null;
const _vIFWLKTh = _FrRdkUIV ? JSON.parse(_FrRdkUIV) : null;
if (!_vIFWLKTh || !_vIFWLKTh._QaSvivmg || _vIFWLKTh._QaSvivmg._aXvlfeii === 0) {
return new Response("No optimized IPs available to generate endpoints.", {
status: 404,
_nQQyxIvQ: { 'Content-Type': '_YjWVVcUA/plain; _wtqCubuY=utf-8' },
});
}
const _aufghgUk = new URL(_IzHLhEGJ._uHSLwcDj)._UQUUFArf;
const _LwVxoBxv = _vIFWLKTh._QaSvivmg.map((_AeRUZbns, _HhnPIkCo) => {
return _CPaIDIYp(_AeRUZbns, _HhnPIkCo, _VWOaYrNv, _aufghgUk);
}).filter(Boolean);
if (_LwVxoBxv._aXvlfeii === 0) {
return new Response("Could not generate any _tgGvJszX links from the available IPs.", {
status: 500,
_nQQyxIvQ: { 'Content-Type': '_YjWVVcUA/plain; _wtqCubuY=utf-8' },
});
}
return new Response(_LwVxoBxv.join('\n'), {
_nQQyxIvQ: { 'Content-Type': '_YjWVVcUA/plain; _wtqCubuY=utf-8' },
});
} catch (_UQsFbFsZ) {
console.error("API /api/endpoints error:", _UQsFbFsZ);
return new Response(`Error processing API _IzHLhEGJ: ${_UQsFbFsZ._YzuxBjrd}`, { status: 500 });
}
}
async function _xvOlDQTH(_IzHLhEGJ, _fRlqVqCR, _RDoWEHOn) {
const _awxiMkom = _IzHLhEGJ._nQQyxIvQ.get('CF-Connecting-IP') || "未知IP";
const [
_SopTVGod,
_nkCvItDc,
defaultDomains,
fetchedCountryMap
] = await Promise.all([
_KDYmvXSP(_kqqwolDJ, _gzreHkGw, []),
_KDYmvXSP(_ZpPHRpfd, _gzreHkGw, []),
_KDYmvXSP(_IAFHVsyR, _mjUxZupR, []),
_KDYmvXSP(_liChpaeb, _NfQrvLCW, { "N/A": "未知" })
]);
_ZuaBDvTh = fetchedCountryMap;
let _ZGvdyWcm = false;
let _vdylzgFG;
try {
const _PbKatdDE = await _NSZEvqJq(_fRlqVqCR);
_ZGvdyWcm = !!_PbKatdDE;
_vdylzgFG = await _KlZgCIHm(_fRlqVqCR);
} catch (_UQsFbFsZ) {
if (_UQsFbFsZ._YzuxBjrd && _UQsFbFsZ._YzuxBjrd.includes('no such table')) {
console.log("检测到 'kv_data' 表不存在,正在自动创建...");
try {
const _wDftFloy = "CREATE TABLE IF NOT EXISTS kv_data (_WwdZHVsG TEXT PRIMARY KEY, _IxrLQWZq TEXT); CREATE TABLE IF NOT EXISTS optimized_results (_XItBVrFU TEXT PRIMARY KEY, _EXQSsAbG TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
await _fRlqVqCR.DB.exec(_wDftFloy);
console.log("数据表创建成功。");
_ZGvdyWcm = false;
_vdylzgFG = _FaZtWAUF();
} catch (dbError) {
console.error("自动创建数据表失败:", dbError);
return new Response(`数据库初始化失败: ${dbError._YzuxBjrd}`, {
status: 500,
_nQQyxIvQ: { 'Content-Type': '_YjWVVcUA/html;_wtqCubuY=UTF-8' }
});
}
} else {
let _TtvzioYR = _iDpgbbSE(_UQsFbFsZ._YzuxBjrd);
return new Response(_TtvzioYR, { _nQQyxIvQ: { 'Content-Type': '_YjWVVcUA/html;_wtqCubuY=UTF-8' } });
}
}
if (_vdylzgFG.telegram.bot_token && _vdylzgFG.telegram.chat_id) {
const _UYlmFqeX = _IzHLhEGJ.cf?._UYlmFqeX || "未知";
const _ShqcviBz = _IzHLhEGJ.cf?._ShqcviBz || "";
let _fGwvLdOW = _ZuaBDvTh[_UYlmFqeX] || _UYlmFqeX;
if (_ShqcviBz && _ShqcviBz !== "未知城市" && _ShqcviBz !== _UYlmFqeX) _fGwvLdOW = `${_fGwvLdOW} ${_ZuaBDvTh[_ShqcviBz] || _ShqcviBz}`;
const _GXzRZzOI = _OKqGclKV();
const _WwtwADnk = _IzHLhEGJ._uHSLwcDj;
const _HIGCtwWz = `访客: ${_awxiMkom}\n位置: ${_fGwvLdOW.trim()}\n时间: ${_GXzRZzOI}\n来自:${_WwtwADnk}`;
const _BDUbzrWb = `https://api.telegram.org/bot${_vdylzgFG.telegram.bot_token}/sendMessage?chat_id=${_vdylzgFG.telegram.chat_id}&_YjWVVcUA=${encodeURIComponent(_HIGCtwWz)}`;
_RDoWEHOn.waitUntil(fetch(_BDUbzrWb).catch(_UQsFbFsZ => console.error("Telegram通知失败:", _UQsFbFsZ)));
}
let _QXbKLtqH = _nwoeiAEX();
const _NxfYIIeD = {
_VWOaYrNv: _vdylzgFG,
status: {
_ZGvdyWcm: _ZGvdyWcm,
}
};
_QXbKLtqH = _QXbKLtqH.replace('__PAGE_DATA_JSON__', JSON.stringify(_NxfYIIeD));
_QXbKLtqH = _QXbKLtqH.replace('__ALL_CF_CIDR_LIST_JSON__', JSON.stringify(_SopTVGod));
_QXbKLtqH = _QXbKLtqH.replace('__BALANCED_CF_CIDR_LIST_JSON__', JSON.stringify(_nkCvItDc));
_QXbKLtqH = _QXbKLtqH.replace('__DEFAULT_DOMAINS_LIST_JSON__', JSON.stringify(defaultDomains));
_QXbKLtqH = _QXbKLtqH.replace('__COUNTRY_MAP_JSON__', JSON.stringify(_ZuaBDvTh));
return new Response(_QXbKLtqH, {
_nQQyxIvQ: { 'Content-Type': '_YjWVVcUA/html;_wtqCubuY=UTF-8' },
});
}
function _gJBAaLEx(_xiSDFndW, status = 200, _nQQyxIvQ = {}) {
return new Response(JSON.stringify(_xiSDFndW), {
status,
_nQQyxIvQ: { 'Content-Type': 'application/json;_wtqCubuY=UTF-8', ..._nQQyxIvQ }
});
}
function _OKqGclKV(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 _ALqLdNXN(_WHEPWUJQ) {
if (!_WHEPWUJQ || typeof _WHEPWUJQ !== 'string') return "无效IP";
if(_appCKURi.isIPv4(_WHEPWUJQ)){
const _pcSTngrT = _WHEPWUJQ.split('.');
if (_pcSTngrT._aXvlfeii === 4) return `${_pcSTngrT[0]}.*.*.${_pcSTngrT[3]}`;
}
if(_appCKURi.isIPv6(_WHEPWUJQ)){
const _pcSTngrT = _WHEPWUJQ.split(':');
if (_pcSTngrT._aXvlfeii > 2) return `${_pcSTngrT[0]}:...:${_pcSTngrT[_pcSTngrT._aXvlfeii - 1]}`;
}
return _WHEPWUJQ;
}
function _iDpgbbSE(_bQODtTdY) {
return `
<!DOCTYPE html><html lang="zh-CN"><head><meta _wtqCubuY="UTF-8"><title>需要设置</title>
<_UkmOYHpC>
_xiSDFndW { font-family: sans-serif; background: #1a1a1a; _OYIlBRow: #e0e0e0; display: flex; justify-_jGOnnFBw: center; align-items: center; height: 100vh; margin: 0; }
._LiVohnGY { max-_OOUiGycq: 800px; padding: 2rem; background: #25282e; border: 1px solid #4044c; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
h1 { _OYIlBRow: #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 { _OYIlBRow: #da3633; background: rgba(218, 54, 51, 0.1); padding: 0.5rem; border-radius: 4px; margin-_TQhFmdgx: 1rem; }
</_UkmOYHpC>
</head><_xiSDFndW>
<div class="_LiVohnGY">
<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>
${_bQODtTdY ? `<div class="error"><strong>当前错误信息:</strong> ${_bQODtTdY.replace(/</g, "<").replace(/>/g, ">")}</div>` : ''}
</div>
</_xiSDFndW></html>`;
}
function _nwoeiAEX() {
return `
<!DOCTYPE html><html lang="zh-CN"><head> <meta _wtqCubuY="UTF-8"> <meta _EGokjVLK="viewport" _jGOnnFBw="_OOUiGycq=device-_OOUiGycq, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Cloudflare IP</title> <_nGBEnOxo 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>
<_UkmOYHpC>
:root { --primary-_OYIlBRow: #00A0FF; --primary-hover: #007ACC; --primary-gradient-start: #00C6FF; --primary-gradient-end: #0072FF; --secondary-_OYIlBRow: #8c939d; --light-bg: #1A1C20; --_jGOnnFBw-bg: #25282E; --border-_OYIlBRow: #40444C; --_YjWVVcUA-_OYIlBRow: #E0E0E0; --_YjWVVcUA-light: #B0B0B0; --success-_OYIlBRow: #30A46C; --danger-_OYIlBRow: #DA3633; --warning-_OYIlBRow: #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; }
_xiSDFndW { font-family: var(--font-family-sans); background-_OYIlBRow: var(--light-bg); _OYIlBRow: var(--_YjWVVcUA-_OYIlBRow); line-height: 1.65; overflow-x: hidden; padding: 0; position:relative; transition: background-_OYIlBRow 0.5s ease; background-size: cover; background-position: center; background-attachment: fixed; }
#background-_mNTcLHpe { position: fixed; _TQhFmdgx: 0; _qpYqmuXV: 0; _OOUiGycq: 100%; height: 100%; z-_HhnPIkCo: -1; display: none; }
._kuWdNOSz-_LiVohnGY { max-_OOUiGycq: 1100px; margin: 0 auto; padding: 0 1rem; position: relative; z-_HhnPIkCo: 1; }
#_wZNpvSVi { position: fixed; _TQhFmdgx: 1rem; right: 1rem; font-size: 0.85em; padding: 0.4em 0.8em; z-_HhnPIkCo: 10; }
#marquee-_LiVohnGY { overflow: hidden; white-space: nowrap; background-_OYIlBRow: rgba(37, 40, 46, 0.6); backdrop-filter: blur(5px); _OYIlBRow: var(--primary-_OYIlBRow); padding: 0.5rem 0; margin-_TQhFmdgx: 1rem; border-radius: var(--border-radius-sm); display: none; }
#marquee-_YjWVVcUA { display: inline-block; padding-_qpYqmuXV: 100%; animation: marquee-scroll 20s linear infinite; }
@keyframes marquee-scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-100%); } }
_QzJtcmPz { _YjWVVcUA-align: center; margin-_TQhFmdgx: 1rem; margin-bottom: 2rem; }
_QzJtcmPz h1 { white-space: pre-wrap; font-size: 2.25em; _OYIlBRow: var(--primary-_OYIlBRow); font-weight: 700; _YjWVVcUA-shadow: 0 0 10px rgba(var(--primary-_OYIlBRow-rgb), 0.3); }
.card { background-_OYIlBRow: 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-_OYIlBRow); }
.progress-section #_dbdgYNTv { _OOUiGycq: 100%; height: 0.75rem; border-radius: var(--border-radius-sm); appearance: none; -webkit-appearance: none; background-_OYIlBRow: var(--border-_OYIlBRow); overflow: hidden; }
.progress-section #_dbdgYNTv::-webkit-progress-_IxrLQWZq { background: linear-gradient(90deg, var(--primary-gradient-start), var(--primary-gradient-end)); }
.progress-section #status { _YjWVVcUA-align: center; margin-_TQhFmdgx: 0.75em; font-size: 0.95em; _OYIlBRow: var(--_YjWVVcUA-light); min-height: 1.5em; }
.section-_QzJtcmPz { display: flex; flex-wrap: wrap; justify-_jGOnnFBw: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border-_OYIlBRow); gap: 1rem; }
.section-_QzJtcmPz h2 { font-size: 1.6em; font-weight: 600; margin:0; }
.generator-info { font-size: 0.85em; _OYIlBRow: var(--secondary-_OYIlBRow); _YjWVVcUA-align: right; flex-shrink: 0; }
.generator-info span { display: block; }
.table-responsive { _OOUiGycq: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
table { _OOUiGycq: 100%; border-collapse: collapse; margin-_TQhFmdgx: 0; font-size: 0.9em; }
th, td { border-bottom: 1px solid var(--border-_OYIlBRow); padding: 0.8em; _YjWVVcUA-align: _qpYqmuXV; vertical-align: middle; white-space: nowrap; }
th { background-_OYIlBRow: #2c3038; font-weight: 500; }
tbody tr:hover { background-_OYIlBRow: #30333a; }
td._WHEPWUJQ-_WTImSQLA { font-weight: 500; font-family: var(--font-family-mono); _OYIlBRow: var(--primary-_OYIlBRow); }
td.ping-_IxrLQWZq { font-weight: 600; font-family: var(--font-family-mono); }
td.actions-cell { _YjWVVcUA-align: right; }
.btn { display: inline-flex; align-items: center; justify-_jGOnnFBw: center; font-weight: 500; _YjWVVcUA-align: center; cursor: pointer; user-_QWphmrip: none; background: linear-gradient(145deg, var(--primary-gradient-start), var(--primary-gradient-end)); border: 1px solid transparent; _OYIlBRow: #fff; padding: 0.4em 0.8em; font-size: 0.85em; border-radius: var(--border-radius-sm); transition: all 0.2s ease-in-out; margin-_qpYqmuXV: 6px; }
.btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); }
.btn-outline { background: transparent; _OYIlBRow: var(--primary-_OYIlBRow); border: 1px solid var(--primary-_OYIlBRow); }
.btn-outline:hover { background-_OYIlBRow: var(--primary-_OYIlBRow); _OYIlBRow: var(--_jGOnnFBw-bg); }
._kuWdNOSz-download-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
._kuWdNOSz-download-buttons .btn { _OOUiGycq: 100%; margin: 0; }
.tooltip-notification { position: fixed; _TQhFmdgx: 20px; right: 20px; padding: 12px 20px; border-radius: var(--border-radius-md); _OYIlBRow: #fff; font-size: 0.95em; z-_HhnPIkCo: 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); }
#_VozkIoTi, #_sRwhGwnq, #_SKRhiZBK, #_udFcrkHG, #_gLmMRDmw { display: none; position: fixed; z-_HhnPIkCo: 10000; _qpYqmuXV: 0; _TQhFmdgx: 0; _OOUiGycq: 100%; height: 100%; background-_OYIlBRow: rgba(0,0,0,0.6); justify-_jGOnnFBw: center; align-items: center; backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.modal-_jGOnnFBw, ._kuWdNOSz-modal-_jGOnnFBw { background-_OYIlBRow: var(--_jGOnnFBw-bg); padding: 2rem; border: 1px solid var(--border-_OYIlBRow); border-radius: var(--border-radius-md); _OOUiGycq: 95%; max-_OOUiGycq: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0,0,0,0.3); }
#_udFcrkHG .modal-_jGOnnFBw { max-_OOUiGycq: 500px; }
.modal-_jGOnnFBw h3, ._kuWdNOSz-modal-_QzJtcmPz h3 { margin-_TQhFmdgx: 0; margin-bottom: 1.5rem; _OYIlBRow: var(--primary-_OYIlBRow); _YjWVVcUA-align: center; }
.modal-buttons { display: flex; justify-_jGOnnFBw: flex-end; gap: 1rem; margin-_TQhFmdgx: 2rem; border-_TQhFmdgx: 1px solid var(--border-_OYIlBRow); padding-_TQhFmdgx: 1.5rem; }
.modal-section-divider { border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), var(--border-_OYIlBRow), rgba(0,0,0,0)); margin: 2rem 0; }
._kuWdNOSz-modal-_QzJtcmPz { display: flex; justify-_jGOnnFBw: space-between; align-items: center; padding-bottom: 1rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-_OYIlBRow); }
.modal-close-btn { font-size: 1.5rem; font-weight: bold; line-height: 1; _OYIlBRow: var(--_YjWVVcUA-light); cursor: pointer; background: none; border: none; padding: 0; }
._kuWdNOSz-list-_tgGvJszX { display: flex; flex-direction: column; padding: 1rem; border: 1px solid var(--border-_OYIlBRow); border-radius: var(--border-radius-sm); margin-bottom: 1rem; }
._kuWdNOSz-_EGokjVLK { font-size: 1.1em; font-weight: 600; }
._kuWdNOSz-links a { display: block; _OYIlBRow: var(--primary-_OYIlBRow); _YjWVVcUA-decoration: none; margin-_TQhFmdgx: 0.5rem; word-break: break-all; }
._kuWdNOSz-links a:hover { _YjWVVcUA-decoration: underline; }
._kuWdNOSz-links span { _OYIlBRow: var(--_YjWVVcUA-light); }
#visitorPasswordPrompt { _YjWVVcUA-align: center; }
#visitorPasswordPrompt h3 { _OYIlBRow: var(--primary-_OYIlBRow); font-size: 1.4em; margin-bottom: 0.8rem; }
#visitorPasswordPrompt p { _OYIlBRow: var(--_YjWVVcUA-light); margin-bottom: 1.5rem; }
._PbKatdDE-input-group { display: flex; gap: 10px; max-_OOUiGycq: 400px; margin: 0 auto; }
._PbKatdDE-input-group input { flex-grow: 1; _YjWVVcUA-align: center; }
._PbKatdDE-input-group .btn { margin-_qpYqmuXV: 0; }
._QaSvivmg-actions-_LiVohnGY { _YjWVVcUA-align: center; margin-bottom: 1.5rem; }
._QaSvivmg-api-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; }
._QaSvivmg-api-buttons .btn { margin: 0; _OOUiGycq: 100%; font-size: 0.9em; padding: 0.5em 1em; }
.form-grid { display: grid; grid-template-columns: max-_jGOnnFBw 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 _QWphmrip, .form-grid-control textarea { _OOUiGycq: 100%; background-_OYIlBRow: var(--light-bg); border: 1px solid var(--border-_OYIlBRow); border-radius: var(--border-radius-sm); _OYIlBRow: var(--_YjWVVcUA-_OYIlBRow); font-family: var(--font-family-sans); padding: 0.6em; transition: border-_OYIlBRow 0.2s, box-shadow 0.2s; }
.form-grid-control input:focus, .form-grid-control _QWphmrip:focus, .form-grid-control textarea:focus { border-_OYIlBRow: var(--primary-_OYIlBRow); box-shadow: 0 0 0 2px rgba(var(--primary-_OYIlBRow-rgb), 0.2); outline: none; }
.form-grid-control input[_OZZMoDle="_OYIlBRow"] { min-_OOUiGycq: auto; padding: 2px; _OOUiGycq: 2.5em; height: 2.5em; }
.form-grid-control input[_OZZMoDle="checkbox"] { _OOUiGycq: auto; flex-shrink: 0; height: 1.2em; _OOUiGycq: 1.2em; }
.form-grid-control ._ehzgUHhj-input { _OOUiGycq: 80px; _YjWVVcUA-align: right; }
.tooltip-_NvMTEfhN { display: inline-flex; _OOUiGycq: 16px; height: 16px; align-items: center; justify-_jGOnnFBw: center; background-_OYIlBRow: var(--secondary-_OYIlBRow); _OYIlBRow: var(--_jGOnnFBw-bg); border-radius: 50%; font-size: 12px; font-weight: bold; cursor: pointer; user-_QWphmrip: none; }
#tooltip-popup { position: fixed; background-_OYIlBRow: #383c4a; _OYIlBRow: #fff; padding: 10px 15px; border-radius: 6px; z-_HhnPIkCo: 10001; font-size: 0.85em; max-_OOUiGycq: 300px; display: none; box-shadow: 0 4px 12px rgba(0,0,0,0.4); border: 1px solid var(--border-_OYIlBRow); pointer-events: none; }
#custom-fields-_LiVohnGY .form-grid-control { gap: 5px; } #custom-fields-_LiVohnGY .form-grid-control input { flex: 1; }
.parameter-_YZJNJqsS-_OAAlOKOG { border: 1px solid var(--border-_OYIlBRow); border-radius: var(--border-radius-sm); padding: 1rem; margin-bottom: 1rem; }
.parameter-_YZJNJqsS-_QzJtcmPz { display: flex; justify-_jGOnnFBw: space-between; align-items: center; margin-bottom: 1rem; }
.parameter-_YZJNJqsS-_QzJtcmPz input { flex-grow: 1; margin-right: 1rem; }
.fine-grained-options { display: flex; gap: 1rem; margin-_TQhFmdgx: 0.5rem; align-items: center; font-size: 0.9em; }
.fine-grained-options label { display: flex; align-items: center; gap: 0.3rem; cursor: pointer; }
._YjWVVcUA-_OYIlBRow-grid { display: grid; grid-template-columns: auto 1fr; gap: 8px; align-items: center; _OOUiGycq: 100%; }
._YjWVVcUA-_OYIlBRow-grid input[_OZZMoDle="_OYIlBRow"] { grid-column: 1 / 2; }
._YjWVVcUA-_OYIlBRow-grid input[_OZZMoDle="_YjWVVcUA"], ._YjWVVcUA-_OYIlBRow-grid textarea { grid-column: 2 / 3; }
#_udFcrkHG .button-grid { display: grid; grid-template-columns: 1fr; gap: 1rem; }
#_udFcrkHG .btn-group { display: flex; }
#_udFcrkHG .sub-btn { flex-grow: 1; margin: 0; }
#_udFcrkHG ._RWHwPNGh-btn { flex-shrink: 0; margin-_qpYqmuXV: -1px; border-_TQhFmdgx-_qpYqmuXV-radius: 0; border-bottom-_qpYqmuXV-radius: 0; }
#_gLmMRDmw .modal-_jGOnnFBw { max-_OOUiGycq: 300px; background: white; padding: 1rem; _YjWVVcUA-align: center; }
#qrCodeImg { max-_OOUiGycq: 100%; }
@media (max-_OOUiGycq: 768px) {
html { font-size: 15px; } ._kuWdNOSz-_LiVohnGY { padding: 0 0.8rem; } _QzJtcmPz { margin-_TQhFmdgx: 2.5rem; margin-bottom: 1.5rem; } #_wZNpvSVi { _TQhFmdgx: 0.8rem; right: 0.8rem; } .card { padding: 1rem; }
.form-grid { grid-template-columns: 1fr; } .form-grid-label { justify-self: start; }
}
</_UkmOYHpC>
<_UkmOYHpC _XItBVrFU="theme-styles">
.theme-light { --light-bg: #F0F2F5; --_jGOnnFBw-bg: #FFFFFF; --border-_OYIlBRow: #DCDFE6; --_YjWVVcUA-_OYIlBRow: #303133; --_YjWVVcUA-light: #606266; }
.theme-light .card { background-_OYIlBRow: rgba(255, 255, 255, 0.9); }
.theme-light th { background-_OYIlBRow: #F5F7FA; }
.theme-light tbody tr:hover { background-_OYIlBRow: #ECF5FF; }
.theme-matrix { --primary-_OYIlBRow: #00FF41; --primary-hover: #39FF14; --light-bg: #000000; --_jGOnnFBw-bg: #0D0208; --border-_OYIlBRow: #00FF41; --_YjWVVcUA-_OYIlBRow: #00FF41; --_YjWVVcUA-light: #00FF41; font-family: var(--font-family-mono); }
.theme-matrix .card { background-_OYIlBRow: rgba(0, 20, 0, 0.7); _YjWVVcUA-shadow: 0 0 5px var(--primary-_OYIlBRow); backdrop-filter: none; }
.theme-matrix th { background-_OYIlBRow: #000; }
.theme-matrix tbody tr:hover { background-_OYIlBRow: #010; }
.theme-matrix .btn { _YjWVVcUA-shadow: none; _OYIlBRow: #000; }
.theme-matrix .btn-outline { background-_OYIlBRow: transparent; }
.theme-modern-glass { --primary-_OYIlBRow: #00C6FF; --primary-hover: #0072FF; --light-bg: #000; --_jGOnnFBw-bg: rgba(30, 30, 40, 0.6); --border-_OYIlBRow: rgba(255, 255, 255, 0.2); --_YjWVVcUA-_OYIlBRow: #F0F0F0; --_YjWVVcUA-light: #A0A0B0; --border-radius-md: 12px; }
_xiSDFndW.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-_OYIlBRow: #00C6FF; --primary-hover: #0072FF; --light-bg: #1A1C20; --_jGOnnFBw-bg: rgba(30, 30, 40, 0.6); --border-_OYIlBRow: rgba(255, 255, 255, 0.2); --_YjWVVcUA-_OYIlBRow: #F0F0F0; --_YjWVVcUA-light: #A0A0B0; --border-radius-md: 12px; }
.glassy-components .card { background-_OYIlBRow: var(--_jGOnnFBw-bg); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); border: 1px solid var(--border-_OYIlBRow); }
.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-_OYIlBRow: rgba(0,0,0,0.3); border-right-_OYIlBRow: 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); _YjWVVcUA-shadow: 0 1px 2px rgba(0,0,0,0.2); _OYIlBRow: #fff; }
.glassy-components .btn-outline { background: rgba(255, 255, 255, 0.05); border-_OYIlBRow: rgba(255, 255, 255, 0.2); backdrop-filter: blur(2px); _YjWVVcUA-shadow: 0 1px 2px rgba(0,0,0,0.2); }
.glassy-components .btn-outline:hover { background: var(--primary-_OYIlBRow); border-_OYIlBRow: var(--primary-_OYIlBRow); _OYIlBRow: #fff; }
.glassy-components _QzJtcmPz h1 { background: linear-gradient(180deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: _YjWVVcUA; -webkit-_YjWVVcUA-fill-_OYIlBRow: transparent; filter: drop-shadow(0 2px 5px rgba(0,0,0,0.5)); _OYIlBRow: transparent; }
.theme-aurora-glass { --primary-_OYIlBRow: #38bdf8; --light-bg: #0c0a09; --_jGOnnFBw-bg: rgba(23, 23, 23, 0.5); --border-_OYIlBRow: rgba(255, 255, 255, 0.15); --_YjWVVcUA-_OYIlBRow: #f2f2f2; --_YjWVVcUA-light: #a3a3a3; }
_xiSDFndW.theme-aurora-glass::before { _jGOnnFBw: ''; position: fixed; _TQhFmdgx: 0; _qpYqmuXV: 0; _OOUiGycq: 100%; height: 100%; z-_HhnPIkCo: -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-_OYIlBRow: #08fdd8; --light-bg: #010409; --_jGOnnFBw-bg: rgba(22, 27, 34, 0.6); --border-_OYIlBRow: rgba(139, 148, 158, 0.3); --_YjWVVcUA-_OYIlBRow: #e6edf3; --_YjWVVcUA-light: #7d8590; }
.theme-cyberpunk-glass .card { border-image: linear-gradient(to bottom right, var(--primary-_OYIlBRow), #7928ca) 1; box-shadow: 0 0 15px rgba(var(--primary-_OYIlBRow-rgb), 0.25); }
.theme-cyberpunk-glass .btn { box-shadow: 0 0 8px rgba(var(--primary-_OYIlBRow-rgb), 0.5); }
.theme-marble-light { --primary-_OYIlBRow: #bfa37c; --light-bg: #f7f5f2; --_jGOnnFBw-bg: #ffffff; --border-_OYIlBRow: #e0dcd5; --_YjWVVcUA-_OYIlBRow: #3d3a36; --_YjWVVcUA-light: #6b6661; }
_xiSDFndW.theme-marble-light { background-image: _uHSLwcDj('_EXQSsAbG:image/svg+xml,%3Csvg _OOUiGycq="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-_OYIlBRow: rgba(255, 255, 255, 0.85); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
</_UkmOYHpC>
</head><_xiSDFndW _XItBVrFU="pageBody">
<_mNTcLHpe _XItBVrFU="background-_mNTcLHpe"></_mNTcLHpe>
<div _XItBVrFU="_VozkIoTi">
<div class="modal-_jGOnnFBw">
<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 _OZZMoDle="_PbKatdDE" _XItBVrFU="initialPassword"></div></div>
<div class="form-grid"><div class="form-grid-label"><label for="confirmPassword">确认密码</label></div><div class="form-grid-control"><input _OZZMoDle="_PbKatdDE" _XItBVrFU="confirmPassword"></div></div>
<div class="modal-buttons"><button _XItBVrFU="setInitialPasswordBtn" class="btn">设置密码</button></div>
</div>
</div>
<div class="_kuWdNOSz-_LiVohnGY">
<button _XItBVrFU="_wZNpvSVi" class="btn btn-outline"></button>
<div _XItBVrFU="marquee-_LiVohnGY"><div _XItBVrFU="marquee-_YjWVVcUA"></div></div>
<_QzJtcmPz><h1 _XItBVrFU="pageTitle"></h1></_QzJtcmPz>
<div class="card" _XItBVrFU="visitorPasswordPrompt" _UkmOYHpC="display: none;">
<h3>需要授权</h3>
<p>此站点已启用访客密码,请输入密码以继续。</p>
<div class="_PbKatdDE-input-group">
<input _OZZMoDle="_PbKatdDE" _XItBVrFU="visitorPasswordEntry" _BsCcdtSt="访客密码">
<button _XItBVrFU="startTestWithPasswordBtn" class="btn">开始测试</button>
</div>
</div>
<div _XItBVrFU="_yMEQLBEu" _UkmOYHpC="display: block;">
<div class="card progress-section">
<div _XItBVrFU="progressDisplay">
<progress _XItBVrFU="_dbdgYNTv" _IxrLQWZq="0" max="100"></progress>
<div _XItBVrFU="status">正在初始化...</div>
</div>
</div>
<div class="card _kuWdNOSz-download-section">
<div class="section-_QzJtcmPz"><h2 _XItBVrFU="appDownloadTitleEl"></h2></div>
<div class="_kuWdNOSz-download-buttons">
<button class="btn" _EXQSsAbG-_zqeMDzyR="android">安卓客户端</button>
<button class="btn" _EXQSsAbG-_zqeMDzyR="ios">苹果客户端</button>
<button class="btn" _EXQSsAbG-_zqeMDzyR="windows">Windows客户端</button>
<button class="btn" _EXQSsAbG-_zqeMDzyR="mac">Mac客户端</button>
</div>
</div>
<div class="card _QaSvivmg-section" _XItBVrFU="_kfbOFCcg" _UkmOYHpC="display:none;">
<div class="section-_QzJtcmPz">
<h2 _XItBVrFU="liveTitleEl"></h2>
<div class="generator-info" _XItBVrFU="liveGeneratorInfo"></div>
</div>
<div _XItBVrFU="_fFFohDTl" class="_QaSvivmg-actions-_LiVohnGY" _UkmOYHpC="display: none;">
<div class="_QaSvivmg-api-buttons">
<button _XItBVrFU="copyIpApiBtn" class="btn">复制 IP API</button>
<button _XItBVrFU="copySubscriptionBtn" class="btn">复制订阅</button>
</div>
</div>
<div class="table-responsive">
<table _XItBVrFU="resultsTable">
<thead><tr><th _XItBVrFU="tableHeader1El"></th><th _XItBVrFU="tableHeader2El"></th><th _XItBVrFU="tableHeader3El"></th><th _XItBVrFU="tableHeader4El"></th><th _XItBVrFU="tableHeader5El"></th><th _XItBVrFU="tableHeader6El"></th><th _XItBVrFU="tableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="card cached-section" _XItBVrFU="_eiwrPhDh" _UkmOYHpC="display:none;">
<div class="section-_QzJtcmPz"><h2 _XItBVrFU="cachedTitleEl"></h2><div class="generator-info" _XItBVrFU="cachedGeneratorInfo"></div></div>
<div class="table-responsive">
<table _XItBVrFU="cachedResultsTable">
<thead><tr><th _XItBVrFU="cachedTableHeader1El"></th><th _XItBVrFU="cachedTableHeader2El"></th><th _XItBVrFU="cachedTableHeader3El"></th><th _XItBVrFU="cachedTableHeader4El"></th><th _XItBVrFU="cachedTableHeader5El"></th><th _XItBVrFU="cachedTableHeader6El"></th><th _XItBVrFU="cachedTableHeader7El"></th></tr></thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
<div _XItBVrFU="notificationTooltip" class="tooltip-notification"></div>
<div _XItBVrFU="_sRwhGwnq">
<div class="modal-_jGOnnFBw">
<h3>修改参数</h3>
<div _UkmOYHpC="display: flex; border-bottom: 1px solid var(--border-_OYIlBRow); margin-bottom: 1.5rem;">
<button class="tab-button active" onclick="_Djbnidzv(event, 'general-_rnkaYpvb')">通用设置</button>
<button class="tab-button" onclick="_Djbnidzv(event, '_nGBEnOxo-_rnkaYpvb')">链接设置</button>
<button class="tab-button" onclick="_Djbnidzv(event, 'fine-grained-_rnkaYpvb')">IP源设置</button>
<button class="tab-button" onclick="_Djbnidzv(event, 'advanced-_rnkaYpvb')">高级设置</button>
</div>
<div _XItBVrFU="general-_rnkaYpvb" class="tab-_jGOnnFBw" _UkmOYHpC="display: block;">
<div class="form-grid">
<div class="form-grid-label"><label for="themeSelect">页面主题</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="选择页面的整体外观风格。">?</span></div>
<div class="form-grid-control">
<_QWphmrip _XItBVrFU="themeSelect">
<_KncfItPD _IxrLQWZq="theme-aurora-glass">极光-玻璃质感</_KncfItPD>
<_KncfItPD _IxrLQWZq="theme-particles-glass">粒子-玻璃质感</_KncfItPD>
<_KncfItPD _IxrLQWZq="theme-modern-glass">现代-玻璃质感</_KncfItPD>
<_KncfItPD _IxrLQWZq="theme-cyberpunk-glass">赛博朋克-玻璃质感</_KncfItPD>
<_KncfItPD _IxrLQWZq="theme-dark-particles">暗色-粒子背景</_KncfItPD>
<_KncfItPD _IxrLQWZq="theme-dark-bing">暗色-必应壁纸</_KncfItPD>
<_KncfItPD _IxrLQWZq="theme-light">亮色-简约</_KncfItPD>
<_KncfItPD _IxrLQWZq="theme-light-bing">亮色-必应壁纸</_KncfItPD>
<_KncfItPD _IxrLQWZq="theme-marble-light">简约大理石-亮色</_KncfItPD>
<_KncfItPD _IxrLQWZq="theme-matrix">矩阵-代码雨</_KncfItPD>
</_QWphmrip>
</div>
<div class="form-grid-label"><label>主题颜色</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="自定义主题的主要颜色和动态背景效果的颜色。">?</span></div>
<div class="form-grid-control">
<label for="primaryColorInput">强调色</label><input _OZZMoDle="_OYIlBRow" _XItBVrFU="primaryColorInput">
<span _UkmOYHpC="_OOUiGycq: 20px;"></span>
<label for="particleColorInput">背景/粒子色</label><input _OZZMoDle="_OYIlBRow" _XItBVrFU="particleColorInput">
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _UkmOYHpC="align-self: start;"><label>页面文本与颜色</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="自定义页面上各个主要元素的显示文本和颜色。">?</span></div>
<div class="form-grid-control" _UkmOYHpC="flex-direction: column; align-items: stretch; gap: 8px;">
<div class="_YjWVVcUA-_OYIlBRow-grid"><input _OZZMoDle="_OYIlBRow" _XItBVrFU="colorInput_title"><textarea _XItBVrFU="textInput_title" _OKuGmbFI="1" _BsCcdtSt="页面主标题"></textarea></div>
<div class="_YjWVVcUA-_OYIlBRow-grid"><input _OZZMoDle="_OYIlBRow" _XItBVrFU="colorInput_loginButton"><input _OZZMoDle="_YjWVVcUA" _XItBVrFU="textInput_loginButton" _BsCcdtSt="登录按钮文本"></div>
<div class="_YjWVVcUA-_OYIlBRow-grid"><input _OZZMoDle="_OYIlBRow" _XItBVrFU="colorInput_appDownloadTitle"><input _OZZMoDle="_YjWVVcUA" _XItBVrFU="textInput_appDownloadTitle" _BsCcdtSt="APP下载标题"></div>
<div class="_YjWVVcUA-_OYIlBRow-grid"><input _OZZMoDle="_OYIlBRow" _XItBVrFU="colorInput_liveTitle"><input _OZZMoDle="_YjWVVcUA" _XItBVrFU="textInput_liveTitle" _BsCcdtSt="本次结果标题"></div>
<div class="_YjWVVcUA-_OYIlBRow-grid"><input _OZZMoDle="_OYIlBRow" _XItBVrFU="colorInput_cachedTitle"><input _OZZMoDle="_YjWVVcUA" _XItBVrFU="textInput_cachedTitle" _BsCcdtSt="上次结果标题"></div>
<div class="_YjWVVcUA-_OYIlBRow-grid"><input _OZZMoDle="_OYIlBRow" _XItBVrFU="colorInput_tableHeader"><input _OZZMoDle="_YjWVVcUA" _IxrLQWZq="表格头部文本颜色" readonly _UkmOYHpC="background: transparent; border: none;"></div>
</div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _UkmOYHpC="align-self: start;"><label>公告栏设置</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="设置在页面显示的公告内容和方式。">?</span></div>
<div class="form-grid-control" _UkmOYHpC="flex-direction: column; align-items: stretch; gap: 8px;">
<textarea _XItBVrFU="announcementText" _BsCcdtSt="在此输入公告内容" _OKuGmbFI="3"></textarea>
<div _UkmOYHpC="display: flex; justify-_jGOnnFBw: space-around; align-items: center; gap: 1rem; flex-wrap: wrap;">
<label _UkmOYHpC="display: flex; align-items: center; gap: 5px;"><input _OZZMoDle="checkbox" _XItBVrFU="enableMarquee"> 顶部走马灯</label>
<label _UkmOYHpC="display: flex; align-items: center; gap: 5px;"><input _OZZMoDle="checkbox" _XItBVrFU="enablePopup"> 右上角弹窗</label>
<div _XItBVrFU="popupDurationContainer" _UkmOYHpC="display: none; align-items: center; gap: 5px;">
<label for="popupDuration">停留</label><input _OZZMoDle="number" _XItBVrFU="popupDuration" _UkmOYHpC="_OOUiGycq: 60px;"><span>秒</span>
</div>
</div>
</div>
</div>
</div>
<div _XItBVrFU="_nGBEnOxo-_rnkaYpvb" class="tab-_jGOnnFBw">
<div class="form-grid">
<div class="form-grid-label"><label for="converterServiceUrlInput">Sublink 服务地址</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="您部署的Sublink服务的域名,例如 https://sub.example.com">?</span></div>
<div class="form-grid-control"><input _OZZMoDle="_YjWVVcUA" _XItBVrFU="converterServiceUrlInput" _BsCcdtSt="https://sub.example.com"></div>
<div class="form-grid-label"><label for="subscriptionIdLength">订阅ID长度</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="生成订阅链接时使用的随机ID长度(2-128位)">?</span></div>
<div class="form-grid-control"><input _OZZMoDle="number" _XItBVrFU="subscriptionIdLength" min="2" max="128"></div>
<div class="form-grid-label" _UkmOYHpC="align-self: start;"><label for="subscriptionIdCharset">ID使用字符集</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="生成ID时从这些字符中随机选择。请使用URL安全的字符。">?</span></div>
<div class="form-grid-control"><textarea _XItBVrFU="subscriptionIdCharset" _OKuGmbFI="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-_NvMTEfhN" _EXQSsAbG-tooltip="为结果IP添加复制配置链接的按钮。">?</span></div>
<div class="form-grid-control" _UkmOYHpC="justify-_jGOnnFBw: flex-start;"><input _OZZMoDle="checkbox" _XItBVrFU="enableItemLinkCheckbox"></div>
</div>
<div _XItBVrFU="itemLinkConfigGroup" _UkmOYHpC="display:none; margin-_TQhFmdgx: 1rem;">
<div class="form-grid">
<div class="form-grid-label" _UkmOYHpC="align-self: start;"><label for="itemLinkTemplateInput">分享链接模板</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="定义分享链接格式。可用占位符: {_WHEPWUJQ}, {_hZFhznoG}, {_EGokjVLK}, {rank}, {_eUhZBiAC}, {_hDjAPNtA}, {_QovRIXIW}, {_rwOMWNnH}, {_jzqYlrFe}。">?</span></div>
<div class="form-grid-control"><textarea _XItBVrFU="itemLinkTemplateInput" _OKuGmbFI="4"></textarea></div>
<div class="form-grid-label"><label for="parameterSelectionMode">参数使用模式</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="当定义了多组参数时,如何为每个IP分配。">?</span></div>
<div class="form-grid-control"><_QWphmrip _XItBVrFU="parameterSelectionMode"></_QWphmrip></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-control-full"><div _XItBVrFU="parameter-sets-_LiVohnGY"></div><button _OZZMoDle="button" _XItBVrFU="add-parameter-_YZJNJqsS-btn" class="btn btn-outline" _UkmOYHpC="margin-_TQhFmdgx: 10px;">添加参数组</button></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _UkmOYHpC="align-self: start;"><label>其他自定义占位符</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="创建您自己的占位符,并在模板中使用。">?</span></div>
<div class="form-grid-control"><div _XItBVrFU="custom-fields-_LiVohnGY" _UkmOYHpC="_OOUiGycq: 100%;"></div></div>
<div class="form-grid-label"></div><div class="form-grid-control" _UkmOYHpC="justify-_jGOnnFBw: flex-start;"><button _OZZMoDle="button" _XItBVrFU="add-custom-field-btn" class="btn btn-outline">添加自定义字段</button></div>
</div>
</div>
</div>
<div _XItBVrFU="fine-grained-_rnkaYpvb" class="tab-_jGOnnFBw">
<div class="form-grid-label" _UkmOYHpC="grid-column: 1 / -1; justify-self: start;"><label>地区与IP源</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="定义不同地区的IP来源。启用并设置百分比后,它们将根据高级设置中“IP源设置”的总比例进行分配。">?</span></div>
<div class="form-grid-control-full" _UkmOYHpC="display: flex; gap: 1rem; margin-bottom: 1rem; justify-_jGOnnFBw: flex-start;">
<label><input _OZZMoDle="checkbox" _XItBVrFU="enableAllSourcesCheckbox"> 一键启用所有源</label>
<label><input _OZZMoDle="checkbox" _XItBVrFU="disableAllSourcesCheckbox"> 一键取消所有源</label>
</div>
<div class="form-grid-control-full"><div _XItBVrFU="fine-grained-sources-_LiVohnGY"></div><button _OZZMoDle="button" _XItBVrFU="add-fine-grained-_vYeMoSlI-btn" class="btn btn-outline" _UkmOYHpC="margin-_TQhFmdgx: 10px;">添加地区</button></div>
</div>
<div _XItBVrFU="advanced-_rnkaYpvb" class="tab-_jGOnnFBw">
<div class="form-grid">
<div class="form-grid-label"><label for="useResolvedDomainsCheckbox">域名解析IP</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="此处填写优选域名,即可使用优选域名的IP作为筛选源,作为不死IP备用">?</span></div>
<div class="form-grid-control"><input _OZZMoDle="checkbox" _XItBVrFU="useResolvedDomainsCheckbox"></div>
<div class="form-grid-control-full" _XItBVrFU="resolvedDomainsGroup" _UkmOYHpC="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _XItBVrFU="resolvedDomainsInput" _BsCcdtSt="留空则使用内置默认域名" _OKuGmbFI="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-_NvMTEfhN" _EXQSsAbG-tooltip="启用后,将在订阅列表顶部添加您在此处指定的节点地址,例:1.1.1.1#443@名称 、 或:1.1.1.1@名称 (无端口则默认443)">?</span></div>
<div class="form-grid-control"><input _OZZMoDle="checkbox" _XItBVrFU="enableCustomNodesCheckbox"></div>
<div class="form-grid-control-full" _XItBVrFU="customNodesGroup" _UkmOYHpC="display:none;"><div class="form-grid"><div class="form-grid-label"></div><div class="form-grid-control"><textarea _XItBVrFU="customNodesInput" _BsCcdtSt="一行一个地址,支持域名、IPv4、IPv6。" _OKuGmbFI="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-_NvMTEfhN" _EXQSsAbG-tooltip="从所有启用的IP源中随机抽取的IP总数量。">?</span></div>
<div class="form-grid-control"><input _OZZMoDle="number" _XItBVrFU="sampleSizeInput"></div>
<div class="form-grid-label"><label for="topNInput">最终获取IP数量</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="测试完成后,在结果列表中显示的延迟最低的IP数量。">?</span></div>
<div class="form-grid-control"><input _OZZMoDle="number" _XItBVrFU="topNInput"></div>
<div class="form-grid-label" _UkmOYHpC="display: none;"><label>延迟随机数范围 (ms)</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="为每个测试结果的延迟增加一个在此范围内的随机值。">?</span></div>
<div class="form-grid-control" _UkmOYHpC="display: none;"><input _OZZMoDle="number" _XItBVrFU="latencyRangeMinInput" _BsCcdtSt="最小"><span>-</span><input _OZZMoDle="number" _XItBVrFU="latencyRangeMaxInput" _BsCcdtSt="最大"></div>
<div class="form-grid-label"><label for="enableIspFilterCheckbox">仅保留Cloudflare IP</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="启用后,最终结果将只显示归属于Cloudflare的IP地址。">?</span></div>
<div class="form-grid-control" _UkmOYHpC="justify-_jGOnnFBw: flex-start;"><input _OZZMoDle="checkbox" _XItBVrFU="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-_NvMTEfhN" _EXQSsAbG-tooltip="当部分IP归属地查询失败时,额外尝试查询的次数。">?</span></div>
<div class="form-grid-control">
<input _OZZMoDle="number" _XItBVrFU="geoLocationRetriesInput" _UkmOYHpC="_OOUiGycq: 80px;"> <span>次</span>
<div _UkmOYHpC="display: flex; align-items: center; gap: 5px; margin-_qpYqmuXV: 20px;">
<input _OZZMoDle="checkbox" _XItBVrFU="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-_NvMTEfhN" _EXQSsAbG-tooltip="所有WebSocket连接失败时使用的全局回退目标地址,格式为 '_QovRIXIW:_hZFhznoG' 或 '_QovRIXIW'。">?</span></div>
<div class="form-grid-control"><input _OZZMoDle="_YjWVVcUA" _XItBVrFU="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-_NvMTEfhN" _EXQSsAbG-tooltip="启用后, 将禁用自身的代理功能, 所有WebSocket请求将转发到指定地址。HTTP请求不受影响。节点生成规则也将改变。">?</span></div>
<div class="form-grid-control" _UkmOYHpC="justify-_jGOnnFBw: flex-start;"><input _OZZMoDle="checkbox" _XItBVrFU="enableWebsocketStreamerCheckbox"></div>
<div class="form-grid-control-full" _XItBVrFU="websocketStreamerGroup" _UkmOYHpC="display:none;">
<div class="form-grid">
<div class="form-grid-label"><label for="websocketStreamerUrlInput">转发目标地址</label></div>
<div class="form-grid-control"><input _OZZMoDle="_YjWVVcUA" _XItBVrFU="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-_NvMTEfhN" _EXQSsAbG-tooltip="通过Worker加速部分外部资源。">?</span></div>
<div class="form-grid-control" _UkmOYHpC="justify-_jGOnnFBw: flex-start;"><input _OZZMoDle="checkbox" _XItBVrFU="enableStreamerCheckbox"></div>
<div class="form-grid-label"><label for="enableApiCheckbox">启用 API</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="启用 /_WHEPWUJQ 和 /api/endpoints 接口。">?</span></div>
<div class="form-grid-control" _UkmOYHpC="justify-_jGOnnFBw: flex-start;"><input _OZZMoDle="checkbox" _XItBVrFU="enableApiCheckbox"></div>
<div class="form-grid-control-full" _XItBVrFU="apiConfigGroup" _UkmOYHpC="display:none;">
<div class="form-grid"><div class="form-grid-label"><label for="apiMessageInput">API关闭时提示</label></div><div class="form-grid-control"><input _OZZMoDle="_YjWVVcUA" _XItBVrFU="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-_NvMTEfhN" _EXQSsAbG-tooltip="创建一个固定路径,始终指向最新的优选结果。路径中请勿使用 / 等特殊字符。">?</span></div>
<div class="form-grid-control" _UkmOYHpC="justify-_jGOnnFBw: flex-start;"><input _OZZMoDle="checkbox" _XItBVrFU="enableCustomSubPathCheckbox"></div>
<div class="form-grid-control-full" _XItBVrFU="customSubPathGroup" _UkmOYHpC="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="customSubPathInput">设置路径</label></div><div class="form-grid-control"><input _OZZMoDle="_YjWVVcUA" _XItBVrFU="customSubPathInput" _BsCcdtSt="例如: 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-_NvMTEfhN" _EXQSsAbG-tooltip="要求访客在开始测速前输入密码。">?</span></div>
<div class="form-grid-control" _UkmOYHpC="justify-_jGOnnFBw: flex-start;"><input _OZZMoDle="checkbox" _XItBVrFU="enableVisitorPasswordCheckbox"></div>
<div class="form-grid-control-full" _XItBVrFU="visitorPasswordGroup" _UkmOYHpC="display:none;"><div class="form-grid"><div class="form-grid-label"><label for="visitorPasswordInput">设置访客密码</label></div><div class="form-grid-control"><input _OZZMoDle="_YjWVVcUA" _XItBVrFU="visitorPasswordInput"></div></div></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _UkmOYHpC="align-self: start;"><label>Telegram 通知</label><span class="tooltip-_NvMTEfhN" _EXQSsAbG-tooltip="配置后,当有访客访问页面时,您将收到通知。">?</span></div>
<div class="form-grid-control" _UkmOYHpC="flex-direction: column; align-items: stretch; gap: 8px;"><input _OZZMoDle="_YjWVVcUA" _XItBVrFU="botTokenInput" _BsCcdtSt="Telegram Bot Token"><input _OZZMoDle="_YjWVVcUA" _XItBVrFU="chatIdInput" _BsCcdtSt="Telegram Chat ID"></div>
<div class="form-grid-control-full"><hr class="modal-section-divider"></div>
<div class="form-grid-label" _UkmOYHpC="align-self: start;"><label>修改管理员密码</label></div>
<div class="form-grid-control" _UkmOYHpC="flex-direction: column; align-items: stretch; gap: 8px;"><input _OZZMoDle="_PbKatdDE" _XItBVrFU="oldPasswordInput" _BsCcdtSt="旧密码"><input _OZZMoDle="_PbKatdDE" _XItBVrFU="newPasswordInput" _BsCcdtSt="新密码 (至少6位)"><button _XItBVrFU="changePasswordBtn" class="btn" _UkmOYHpC="align-self: flex-start; margin-_qpYqmuXV: 0;">确认修改</button></div>
</div>
</div>
<div class="modal-buttons"><button _XItBVrFU="closeModalBtn" class="btn btn-outline">关闭</button><button _XItBVrFU="saveParamsBtn" class="btn">保存并刷新</button></div>
</div>
</div>
<div _XItBVrFU="_SKRhiZBK">
<div class="_kuWdNOSz-modal-_jGOnnFBw">
<div class="_kuWdNOSz-modal-_QzJtcmPz"><h3 _XItBVrFU="appModalTitle"></h3><button class="modal-close-btn">×</button></div>
<div class="_kuWdNOSz-modal-_xiSDFndW" _XItBVrFU="appModalBody"></div>
</div>
</div>
<div _XItBVrFU="_udFcrkHG">
<div class="modal-_jGOnnFBw">
<h3>复制订阅链接</h3>
<div class="button-grid">
<div class="btn-group"><button class="btn sub-btn" _EXQSsAbG-sub-_OZZMoDle="coreEngine">Xray</button><button class="btn _RWHwPNGh-btn" _EXQSsAbG-sub-_OZZMoDle="coreEngine">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _EXQSsAbG-sub-_OZZMoDle="coreProfile">Sing-Box</button><button class="btn _RWHwPNGh-btn" _EXQSsAbG-sub-_OZZMoDle="coreProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _EXQSsAbG-sub-_OZZMoDle="configProfile">Clash</button><button class="btn _RWHwPNGh-btn" _EXQSsAbG-sub-_OZZMoDle="configProfile">Q</button></div>
<div class="btn-group"><button class="btn sub-btn" _EXQSsAbG-sub-_OZZMoDle="policyProfile">Surge</button><button class="btn _RWHwPNGh-btn" _EXQSsAbG-sub-_OZZMoDle="policyProfile">Q</button></div>
</div>
<div class="modal-buttons" _UkmOYHpC="justify-_jGOnnFBw: center;"><button class="btn btn-outline" _XItBVrFU="closeSubModalBtn">关闭</button></div>
</div>
</div>
<div _XItBVrFU="_gLmMRDmw">
<div class="modal-_jGOnnFBw">
<img _XItBVrFU="qrCodeImg" src="" alt="QR Code">
</div>
</div>
<script>
const _appCKURi = {
isValid: (_WHEPWUJQ) => _appCKURi.isIPv4(_WHEPWUJQ) || _appCKURi.isIPv6(_WHEPWUJQ),
isIPv4: (_WHEPWUJQ) => {
if (typeof _WHEPWUJQ !== 'string') return false;
const _pcSTngrT = _WHEPWUJQ.split('.');
if (_pcSTngrT._aXvlfeii !== 4) return false;
return _pcSTngrT.every(_qfWwpMQy => {
const _DIqEgDYQ = parseInt(_qfWwpMQy, 10);
return !isNaN(_DIqEgDYQ) && _DIqEgDYQ >= 0 && _DIqEgDYQ <= 255 && String(_DIqEgDYQ) === _qfWwpMQy;
});
},
isIPv6: (_WHEPWUJQ) => {
if (typeof _WHEPWUJQ !== '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]))$/_LzBQhpmd.test(_WHEPWUJQ);
},
toLong4: (_WHEPWUJQ) => _WHEPWUJQ.split('.').reduce((acc, octet, _LzBQhpmd) => acc + (parseInt(octet) << (8*(3-_LzBQhpmd))),0)>>>0,
fromLong4: (long) => [(long>>>24)&0xFF,(long>>>16)&0xFF,(long>>>8)&0xFF,long&0xFF].join('.'),
toBigInt6: (_WHEPWUJQ) => {
try {
const _sBEvfjUU = _WHEPWUJQ.split('/')[0];
const _pcSTngrT = _sBEvfjUU.split('::');
if (_pcSTngrT._aXvlfeii > 2) return 0n;
let _IkyrzizL = [];
if (_pcSTngrT[0]) {
_IkyrzizL = _pcSTngrT[0].split(':');
}
let _vUWrFlbd = [];
if (_pcSTngrT._aXvlfeii > 1 && _pcSTngrT[1]) {
_vUWrFlbd = _pcSTngrT[1].split(':');
}
if (_IkyrzizL._aXvlfeii + _vUWrFlbd._aXvlfeii > 8) return 0n;
const _fWXZfxNJ = 8 - (_IkyrzizL._aXvlfeii + _vUWrFlbd._aXvlfeii);
const _QamkWOaA = [
..._IkyrzizL,
...Array(_fWXZfxNJ).fill('0'),
..._vUWrFlbd
].map(_qfWwpMQy => _qfWwpMQy || '0');
while(_QamkWOaA._aXvlfeii < 8) {
_QamkWOaA.push('0');
}
let _HXlcLjpK = 0n;
for (const _qfWwpMQy of _QamkWOaA) {
if (_qfWwpMQy._aXvlfeii > 4) return 0n;
const _IxrLQWZq = BigInt('0x' + _qfWwpMQy);
_HXlcLjpK = (_HXlcLjpK << 16n) | _IxrLQWZq;
}
return _HXlcLjpK;
} catch(_UQsFbFsZ) {
return 0n;
}
},
fromBigInt6: (_HXlcLjpK) => {
if (typeof _HXlcLjpK !== '_HXlcLjpK' || _HXlcLjpK < 0n) return null;
const _pcSTngrT = [];
for (let _LzBQhpmd = 0; _LzBQhpmd < 8; _LzBQhpmd++) {
_pcSTngrT.unshift((_HXlcLjpK & 0xFFFFn).toString(16));
_HXlcLjpK >>= 16n;
}
let _JLJGEJYx = { start: -1, _COOdZUSo: 0 };
let _XOXmjZnt = { start: -1, _COOdZUSo: 0 };
for (let _LzBQhpmd = 0; _LzBQhpmd < 8; _LzBQhpmd++) {
if (_pcSTngrT[_LzBQhpmd] === '0') {
if (_XOXmjZnt.start === -1) _XOXmjZnt.start = _LzBQhpmd;
_XOXmjZnt._COOdZUSo++;
} else {
if (_XOXmjZnt._COOdZUSo > _JLJGEJYx._COOdZUSo) _JLJGEJYx = { ..._XOXmjZnt };
_XOXmjZnt = { start: -1, _COOdZUSo: 0 };
}
}
if (_XOXmjZnt._COOdZUSo > _JLJGEJYx._COOdZUSo) _JLJGEJYx = { ..._XOXmjZnt };
if (_JLJGEJYx._COOdZUSo > 1) {
_pcSTngrT.splice(_JLJGEJYx.start, _JLJGEJYx._COOdZUSo, '');
if (_JLJGEJYx.start === 0) _pcSTngrT.unshift('');
if (_JLJGEJYx.start + _JLJGEJYx._COOdZUSo === 8) _pcSTngrT.push('');
}
return _pcSTngrT.join(':');
},
cidrToRange: (cidr, _BPHWddUk = 1) => {
try {
const [range, bitsStr] = cidr.split('/');
const _VSdOCNqB = parseInt(bitsStr, 10);
const _eHoapFhh = new Set();
if (_appCKURi.isIPv4(range)) {
if (isNaN(_VSdOCNqB) || _VSdOCNqB < 8 || _VSdOCNqB > 32) return [];
if (_VSdOCNqB === 32) return [range];
const _jIUErqAD = _appCKURi.toLong4(range);
const _QSvjfhKC = (0xFFFFFFFF << (32 - _VSdOCNqB)) >>> 0;
const _QJIzIOAy = _jIUErqAD & _QSvjfhKC;
const _CfGXUuzO = 1 << (32 - _VSdOCNqB);
if (_CfGXUuzO <= 2) return [];
const _hmnpyFzh = Math.min(_BPHWddUk, _CfGXUuzO - 2);
let _EMJGrGJh = 0;
while (_eHoapFhh.size < _hmnpyFzh && _EMJGrGJh < _hmnpyFzh * 5) {
const _vLnoZIKR = Math.floor(Math.random() * (_CfGXUuzO - 2)) + 1;
_eHoapFhh.add(_appCKURi.fromLong4((_QJIzIOAy + _vLnoZIKR) >>> 0));
_EMJGrGJh++;
}
return Array.from(_eHoapFhh);
} else if (_appCKURi.isIPv6(range)) {
if (isNaN(_VSdOCNqB) || _VSdOCNqB < 16 || _VSdOCNqB > 128) return [];
if (_VSdOCNqB === 128) return [range];
const _hiGMTfrg = _appCKURi.toBigInt6(range);
const _QSvjfhKC = (2n ** BigInt(128 - _VSdOCNqB) - 1n);
const _QJIzIOAy = _hiGMTfrg & ~_QSvjfhKC;
const _WGvUxCoa = 2n ** BigInt(128 - _VSdOCNqB);
if (_WGvUxCoa <= 2n) return [];
let _EMJGrGJh = 0;
while (_eHoapFhh.size < _BPHWddUk && _EMJGrGJh < _BPHWddUk * 5) {
const _FIsArHlT = new Uint8Array(16);
(typeof crypto !== 'undefined' ? crypto : self.crypto).getRandomValues(_FIsArHlT);
let _iUYECJQB = 0n;
for (const _KOabrntZ of _FIsArHlT) {
_iUYECJQB = (_iUYECJQB << 8n) | BigInt(_KOabrntZ);
}
const _vLnoZIKR = _iUYECJQB % (_WGvUxCoa - 2n) + 1n;
_eHoapFhh.add(_appCKURi.fromBigInt6(_QJIzIOAy + _vLnoZIKR));
_EMJGrGJh++;
}
return Array.from(_eHoapFhh);
}
return [];
} catch(_UQsFbFsZ) {
console.error(`CIDR to range failed for ${cidr}:`, _UQsFbFsZ);
return [];
}
}
};
function _udwmUafU(_NZfsEYqG, _GMrCzQPY) {
const _MpssZshV = {};
const _gQKOaGLK = Object._gQKOaGLK(_GMrCzQPY);
const _pcSTngrT = _gQKOaGLK.map(_WwdZHVsG => {
const _VIhEOqPz = _NZfsEYqG * (_GMrCzQPY[_WwdZHVsG] / 100);
return { _WwdZHVsG, _BPHWddUk: Math.floor(_VIhEOqPz), remainder: _VIhEOqPz - Math.floor(_VIhEOqPz) };
});
let _oHlxTSwz = _pcSTngrT.reduce((acc, _qfWwpMQy) => acc + _qfWwpMQy._BPHWddUk, 0);
_pcSTngrT.sort((a, b) => b.remainder - a.remainder);
let _gZtkUvDv = _NZfsEYqG - _oHlxTSwz;
for (let _LzBQhpmd = 0; _LzBQhpmd < _gZtkUvDv; _LzBQhpmd++) {
_pcSTngrT[_LzBQhpmd % _pcSTngrT._aXvlfeii]._BPHWddUk++;
}
for (const _qfWwpMQy of _pcSTngrT) {
_MpssZshV[_qfWwpMQy._WwdZHVsG] = _qfWwpMQy._BPHWddUk;
}
return _MpssZshV;
}
const _NxfYIIeD = __PAGE_DATA_JSON__;
const _vdylzgFG = _NxfYIIeD._VWOaYrNv;
const _FSscbNPY = _NxfYIIeD.status;
const _SopTVGod = __ALL_CF_CIDR_LIST_JSON__;
const _nkCvItDc = __BALANCED_CF_CIDR_LIST_JSON__;
const _EoWkXagF = __DEFAULT_DOMAINS_LIST_JSON__;
const _ZuaBDvTh = __COUNTRY_MAP_JSON__;
const _lBQHGXFr = _ZuaBDvTh;
const _xFhqnEdt = 2500;
const _JPTEdyum = navigator.hardwareConcurrency ? Math.min(16, navigator.hardwareConcurrency * 2) : 8;
const _yMEQLBEu = document.getElementById('_yMEQLBEu');
const _dbdgYNTv = document.getElementById('_dbdgYNTv');
const _KJNqEnTb = document.getElementById('status');
const _kfbOFCcg = document.getElementById('_kfbOFCcg');
const _tUoKYsfT = document.getElementById('resultsTable').querySelector('tbody');
const _eiwrPhDh = document.getElementById('_eiwrPhDh');
const _DlBhghNy = document.getElementById('cachedResultsTable').querySelector('tbody');
const _yTtUKDXH = document.getElementById('notificationTooltip');
const _wZNpvSVi = document.getElementById('_wZNpvSVi');
const _sRwhGwnq = document.getElementById('_sRwhGwnq');
const _SKRhiZBK = document.getElementById('_SKRhiZBK');
const _udFcrkHG = document.getElementById('_udFcrkHG');
const _gLmMRDmw = document.getElementById('_gLmMRDmw');
const _VozkIoTi = document.getElementById('_VozkIoTi');
const _fFFohDTl = document.getElementById('_fFFohDTl');
let _iBrQfdHp = null;
let _GMYfFpIM = null;
let _AgIEbNEp = [];
let _YcwRaKwJ = false;
let _DCAYnqUc = null;
function _fLZOdbbj(_SgdcsNox, _TTrRYeYz) {
const _QcKgtEtx=parseInt(_SgdcsNox.slice(1),16),t=_TTrRYeYz<0?0:255,p=_TTrRYeYz<0?_TTrRYeYz*-1:_TTrRYeYz,R=_QcKgtEtx>>16,G=_QcKgtEtx>>8&0x00FF,B=_QcKgtEtx&0x0000FF;
const _tMKHRBEE = Math.round((t-R)*p)+R;
const _kvejUdWn = Math.round((t-G)*p)+G;
const _adDMSlYi = Math.round((t-B)*p)+B;
return `rgb(${_tMKHRBEE.toString()}, ${_kvejUdWn.toString()}, ${_adDMSlYi.toString()})`;
}
function _EnVSJzeX(_rnkaYpvb) {
const _YuznHXFN = _VatRuJjZ(_rnkaYpvb.primaryColor);
if(_YuznHXFN) {
document.documentElement._UkmOYHpC.setProperty('--primary-_OYIlBRow-rgb', `${_YuznHXFN.r},${_YuznHXFN.g},${_YuznHXFN.b}`);
}
document.documentElement._UkmOYHpC.setProperty('--primary-_OYIlBRow', _rnkaYpvb.primaryColor);
document.documentElement._UkmOYHpC.setProperty('--primary-hover', _fLZOdbbj(_rnkaYpvb.primaryColor, -0.1));
document.documentElement._UkmOYHpC.setProperty('--primary-gradient-start', _fLZOdbbj(_rnkaYpvb.primaryColor, 0.1));
document.documentElement._UkmOYHpC.setProperty('--primary-gradient-end', _fLZOdbbj(_rnkaYpvb.primaryColor, -0.1));
document.getElementById('pageTitle').innerText = _rnkaYpvb.texts.title;
document.title = _rnkaYpvb.texts.title;
_wZNpvSVi.innerText = _iBrQfdHp ? _rnkaYpvb.texts.loginButtonSuccess : _rnkaYpvb.texts.loginButton;
_wZNpvSVi._UkmOYHpC._OYIlBRow = _rnkaYpvb.colors.loginButton;
document.getElementById('appDownloadTitleEl').innerText = _rnkaYpvb.texts.appDownloadTitle;
document.getElementById('liveTitleEl').innerText = _rnkaYpvb.texts.liveTitle;
document.getElementById('liveTitleEl')._UkmOYHpC._OYIlBRow = _rnkaYpvb.colors.liveTitle;
document.getElementById('cachedTitleEl').innerText = _rnkaYpvb.texts.cachedTitle;
document.getElementById('cachedTitleEl')._UkmOYHpC._OYIlBRow = _rnkaYpvb.colors.cachedTitle;
const _nQQyxIvQ = ['tableHeader1El', 'tableHeader2El', 'tableHeader3El', 'tableHeader4El', 'tableHeader5El', 'tableHeader6El', 'tableHeader7El'];
_nQQyxIvQ.forEach((_XItBVrFU, _HhnPIkCo) => {
const _DvldUiRw = document.getElementById(_XItBVrFU);
if (_DvldUiRw) _DvldUiRw.innerText = _rnkaYpvb.texts[`tableHeader${_HhnPIkCo + 1}`] || '';
});
const _ZtvZcxwC = ['cachedTableHeader1El', 'cachedTableHeader2El', 'cachedTableHeader3El', 'cachedTableHeader4El', 'cachedTableHeader5El', 'cachedTableHeader6El', 'cachedTableHeader7El'];
_ZtvZcxwC.forEach((_XItBVrFU, _HhnPIkCo) => {
const _DvldUiRw = document.getElementById(_XItBVrFU);
if (_DvldUiRw) _DvldUiRw.innerText = _vdylzgFG.texts[`tableHeader${_HhnPIkCo + 1}`] || '';
});
document.querySelectorAll('th').forEach(th => th._UkmOYHpC._OYIlBRow = _rnkaYpvb.colors.tableHeader);
document._xiSDFndW.className = '';
document._xiSDFndW.classList.add(_rnkaYpvb.theme);
if (['theme-particles-glass', 'theme-modern-glass', 'theme-aurora-glass', 'theme-cyberpunk-glass'].includes(_rnkaYpvb.theme)) {
document._xiSDFndW.classList.add('glassy-components');
}
document._xiSDFndW._UkmOYHpC.backgroundImage = '';
_IUxxovxC();
if (_rnkaYpvb.theme.includes('particles') || _rnkaYpvb.theme.includes('glass')) {
_nPmUywmE(_rnkaYpvb.particleColor);
} else if (_rnkaYpvb.theme.includes('bing')) {
document._xiSDFndW._UkmOYHpC.backgroundImage = '_uHSLwcDj(/bing-wallpaper)';
}
}
function _XFDLPTeJ() {
_iBrQfdHp = null;
if(_GMYfFpIM) clearTimeout(_GMYfFpIM);
_EnVSJzeX(_vdylzgFG);
_oIstirHt("登录已超时,请重新登录。", "warning");
}
async function _fNIhRete() {
if (_iBrQfdHp) {
_QApuKLWH();
return;
}
const _RVlhwbsF = prompt('请输入管理员密码:');
if (!_RVlhwbsF) return;
try {
const _AaBQCexz = await fetch('/api/verify-_PbKatdDE', {
method: 'POST',
_nQQyxIvQ: { 'Content-Type': 'application/json' },
_xiSDFndW: JSON.stringify({ _PbKatdDE: _RVlhwbsF })
});
const _AeRUZbns = await _AaBQCexz.json();
if (_AeRUZbns.success) {
_iBrQfdHp = _RVlhwbsF;
_oIstirHt("登录成功!有效期5分钟。", "success");
if (_GMYfFpIM) clearTimeout(_GMYfFpIM);
_GMYfFpIM = setTimeout(_XFDLPTeJ, 5 * 60 * 1000);
_EnVSJzeX(_vdylzgFG);
_QApuKLWH();
} else {
throw new Error(_AeRUZbns._YzuxBjrd || '密码验证失败');
}
} catch (_UQsFbFsZ) {
_oIstirHt(`登录失败: ${_UQsFbFsZ._YzuxBjrd}`, "error");
}
}
function _uIKBKetr() {
if (!_FSscbNPY._ZGvdyWcm) {
_VozkIoTi._UkmOYHpC.display = 'flex';
document.getElementById('setInitialPasswordBtn').addEventListener('click', async () => {
const _PbKatdDE = document.getElementById('initialPassword')._IxrLQWZq;
const _bpuAKOiw = document.getElementById('confirmPassword')._IxrLQWZq;
if (_PbKatdDE !== _bpuAKOiw) {
_oIstirHt("两次输入的密码不一致!", "error");
return;
}
if (_PbKatdDE._aXvlfeii < 6) {
_oIstirHt("密码长度不能少于6位!", "error");
return;
}
try {
const _AaBQCexz = await fetch('/api/_YZJNJqsS-_PbKatdDE', {
method: 'POST',
_nQQyxIvQ: { 'Content-Type': 'application/json' },
_xiSDFndW: JSON.stringify({ _PbKatdDE })
});
const _AeRUZbns = await _AaBQCexz.json();
if (_AeRUZbns.success) {
_oIstirHt(_AeRUZbns._YzuxBjrd, "success");
setTimeout(() => _eUhZBiAC.reload(), 1500);
} else {
throw new Error(_AeRUZbns._YzuxBjrd);
}
} catch(_UQsFbFsZ) {
_oIstirHt(`设置密码失败: ${_UQsFbFsZ._YzuxBjrd}`, "error");
}
});
return;
}
_wZNpvSVi.addEventListener('click', _fNIhRete);
document.getElementById('closeModalBtn').addEventListener('click', () => { _sRwhGwnq._UkmOYHpC.display = 'none'; });
_sRwhGwnq.addEventListener('click', (_UQsFbFsZ) => { if (_UQsFbFsZ.target === _sRwhGwnq) _sRwhGwnq._UkmOYHpC.display = 'none'; });
document.getElementById('enableAllSourcesCheckbox').addEventListener('change', function() {
if (this.checked) {
document.querySelectorAll('#fine-grained-sources-_LiVohnGY .fine-grained-_RHiGlNGb-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-_LiVohnGY .fine-grained-_RHiGlNGb-cb').forEach(cb => cb.checked = false);
document.getElementById('enableAllSourcesCheckbox').checked = false;
this.checked = false;
}
});
document.getElementById('saveParamsBtn').addEventListener('click', async () => {
if (!_iBrQfdHp) {
_oIstirHt("请先通过点击右上角按钮输入密码。", "error");
return;
}
const _otJqhsFn = [];
document.querySelectorAll('#custom-fields-_LiVohnGY .custom-field-_OAAlOKOG').forEach(_OAAlOKOG => {
const _EGokjVLK = _OAAlOKOG.querySelector('.custom-field-_EGokjVLK')._IxrLQWZq.trim();
const _IxrLQWZq = _OAAlOKOG.querySelector('.custom-field-_IxrLQWZq')._IxrLQWZq.trim();
if (_EGokjVLK) _otJqhsFn.push({ _EGokjVLK, _IxrLQWZq });
});
const _LziXBEPf = [];
document.querySelectorAll('#parameter-sets-_LiVohnGY .parameter-_YZJNJqsS-_OAAlOKOG').forEach(_OAAlOKOG => {
const _EGokjVLK = _OAAlOKOG.querySelector('.param-_YZJNJqsS-_EGokjVLK')._IxrLQWZq.trim();
const _QovRIXIW = _OAAlOKOG.querySelector('.param-_YZJNJqsS-_QovRIXIW')._IxrLQWZq.trim();
const _rwOMWNnH = _OAAlOKOG.querySelector('.param-_YZJNJqsS-_rwOMWNnH')._IxrLQWZq.trim();
const _jzqYlrFe = _OAAlOKOG.querySelector('.param-_YZJNJqsS-_jzqYlrFe')._IxrLQWZq.trim();
if(_EGokjVLK) _LziXBEPf.push({ _EGokjVLK, _QovRIXIW, '_rwOMWNnH': _rwOMWNnH, _jzqYlrFe });
});
const _BiOVAOnq = [];
document.querySelectorAll('#fine-grained-sources-_LiVohnGY .fine-grained-_vYeMoSlI-_OAAlOKOG').forEach(_OAAlOKOG => {
const _eUhZBiAC = _OAAlOKOG.querySelector('.fine-grained-_eUhZBiAC')._IxrLQWZq.trim();
const _eHoapFhh = _OAAlOKOG.querySelector('.fine-grained-_eHoapFhh')._IxrLQWZq.trim();
const _RHiGlNGb = _OAAlOKOG.querySelector('.fine-grained-_RHiGlNGb-cb').checked;
const _ehzgUHhj = parseInt(_OAAlOKOG.querySelector('.fine-grained-_ehzgUHhj')._IxrLQWZq, 10) || 0;
const _NWFRkhAb = _OAAlOKOG.querySelector('.use-_EGokjVLK-as-_eUhZBiAC-cb').checked;
if (_eUhZBiAC && _eHoapFhh) {
_BiOVAOnq.push({ _eUhZBiAC, _eHoapFhh, _RHiGlNGb, _ehzgUHhj, _NWFRkhAb });
}
});
let _UkJIgdXW = parseInt(document.getElementById('subscriptionIdLength')._IxrLQWZq, 10);
if (isNaN(_UkJIgdXW) || _UkJIgdXW < 2) _UkJIgdXW = 2;
if (_UkJIgdXW > 128) _UkJIgdXW = 128;
const _MxQLqjNl = {
theme: document.getElementById('themeSelect')._IxrLQWZq,
primaryColor: document.getElementById('primaryColorInput')._IxrLQWZq,
particleColor: document.getElementById('particleColorInput')._IxrLQWZq,
useResolvedDomains: document.getElementById('useResolvedDomainsCheckbox').checked,
resolvedDomains: document.getElementById('resolvedDomainsInput')._IxrLQWZq,
sampleSize: parseInt(document.getElementById('sampleSizeInput')._IxrLQWZq, 10) || 1000,
topN: parseInt(document.getElementById('topNInput')._IxrLQWZq, 10) || 15,
rttRandomMin: parseInt(document.getElementById('latencyRangeMinInput')._IxrLQWZq, 10) || 0,
rttRandomMax: parseInt(document.getElementById('latencyRangeMaxInput')._IxrLQWZq, 10) || 0,
_vTMflxAD: document.getElementById('converterServiceUrlInput')._IxrLQWZq.trim(),
subscriptionId: {
_aXvlfeii: _UkJIgdXW,
_wtqCubuY: document.getElementById('subscriptionIdCharset')._IxrLQWZq.trim()
},
api: {
_RHiGlNGb: document.getElementById('enableApiCheckbox').checked,
_YzuxBjrd: document.getElementById('apiMessageInput')._IxrLQWZq || '维护中...',
},
ispFilter: {
_RHiGlNGb: document.getElementById('enableIspFilterCheckbox').checked
},
geoLocation: {
retries: parseInt(document.getElementById('geoLocationRetriesInput')._IxrLQWZq, 10) || 0,
filterUnknown: document.getElementById('filterUnknownGeoCheckbox').checked
},
streamer: {
_RHiGlNGb: document.getElementById('enableStreamerCheckbox').checked
},
websocketStreamer: {
_RHiGlNGb: document.getElementById('enableWebsocketStreamerCheckbox').checked,
_uHSLwcDj: document.getElementById('websocketStreamerUrlInput')._IxrLQWZq.trim()
},
visitorPassword: {
_RHiGlNGb: document.getElementById('enableVisitorPasswordCheckbox').checked,
_PbKatdDE: document.getElementById('visitorPasswordInput')._IxrLQWZq.trim()
},
customSubPath: {
_RHiGlNGb: document.getElementById('enableCustomSubPathCheckbox').checked,
_jzqYlrFe: document.getElementById('customSubPathInput')._IxrLQWZq.trim()
},
itemLink: {
_RHiGlNGb: document.getElementById('enableItemLinkCheckbox').checked,
template: document.getElementById('itemLinkTemplateInput')._IxrLQWZq,
selectionMode: document.getElementById('parameterSelectionMode')._IxrLQWZq,
_LziXBEPf: _LziXBEPf,
_otJqhsFn: _otJqhsFn,
},
dataFeeds: {
universalFallbackAddress: document.getElementById('universalFallbackAddressInput')._IxrLQWZq.trim(),
},
announcement: {
popup: {
_RHiGlNGb: document.getElementById('enablePopup').checked,
_YjWVVcUA: document.getElementById('announcementText')._IxrLQWZq,
_zTnlloQX: parseInt(document.getElementById('popupDuration')._IxrLQWZq, 10) || 5
},
marquee: {
_RHiGlNGb: document.getElementById('enableMarquee').checked,
_YjWVVcUA: document.getElementById('announcementText')._IxrLQWZq
}
},
fineGrained: {
_RHiGlNGb: true,
sources: _BiOVAOnq
},
customNodes: {
_RHiGlNGb: document.getElementById('enableCustomNodesCheckbox').checked,
list: document.getElementById('customNodesInput')._IxrLQWZq
},
texts: {
title: document.getElementById('textInput_title')._IxrLQWZq,
loginButton: document.getElementById('textInput_loginButton')._IxrLQWZq,
loginButtonSuccess: '修改参数',
appDownloadTitle: document.getElementById('textInput_appDownloadTitle')._IxrLQWZq,
liveTitle: document.getElementById('textInput_liveTitle')._IxrLQWZq,
cachedTitle: document.getElementById('textInput_cachedTitle')._IxrLQWZq,
},
colors: {
title: document.getElementById('colorInput_title')._IxrLQWZq,
loginButton: document.getElementById('colorInput_loginButton')._IxrLQWZq,
liveTitle: document.getElementById('colorInput_liveTitle')._IxrLQWZq,
cachedTitle: document.getElementById('colorInput_cachedTitle')._IxrLQWZq,
tableHeader: document.getElementById('colorInput_tableHeader')._IxrLQWZq,
},
telegram: {
bot_token: document.getElementById('botTokenInput')._IxrLQWZq.trim(),
chat_id: document.getElementById('chatIdInput')._IxrLQWZq.trim(),
},
};
try {
const _AaBQCexz = await fetch('/api/_VWOaYrNv', {
method: 'POST',
_nQQyxIvQ: { 'Content-Type': 'application/json' },
_xiSDFndW: JSON.stringify({ _VWOaYrNv: _MxQLqjNl, adminPassword: _iBrQfdHp })
});
const _AeRUZbns = await _AaBQCexz.json();
if (_AaBQCexz.ok && _AeRUZbns.success) {
_oIstirHt("配置已保存,正在刷新...", "success");
setTimeout(() => _eUhZBiAC.reload(), 1500);
} else {
throw new Error(_AeRUZbns._YzuxBjrd || '未知错误');
}
} catch (_UQsFbFsZ) {
_oIstirHt(`操作失败: ${_UQsFbFsZ._YzuxBjrd}`, "error");
if (String(_UQsFbFsZ._YzuxBjrd).includes("密码错误")) {
_XFDLPTeJ();
}
}
});
document.getElementById('changePasswordBtn').addEventListener('click', async () => {
const _itFxKLth = document.getElementById('oldPasswordInput')._IxrLQWZq;
const _dKocdSnm = document.getElementById('newPasswordInput')._IxrLQWZq;
if (!_itFxKLth || !_dKocdSnm) {
_oIstirHt("新旧密码均不能为空!", "error");
return;
}
try {
const _AaBQCexz = await fetch('/api/change-_PbKatdDE', {
method: 'POST',
_nQQyxIvQ: { 'Content-Type': 'application/json' },
_xiSDFndW: JSON.stringify({ _itFxKLth, _dKocdSnm })
});
const _AeRUZbns = await _AaBQCexz.json();
if (_AeRUZbns.success) {
_oIstirHt(_AeRUZbns._YzuxBjrd, "success");
document.getElementById('oldPasswordInput')._IxrLQWZq = '';
document.getElementById('newPasswordInput')._IxrLQWZq = '';
_iBrQfdHp = _dKocdSnm;
} else {
throw new Error(_AeRUZbns._YzuxBjrd);
}
} catch(_UQsFbFsZ) {
_oIstirHt(`修改密码失败: ${_UQsFbFsZ._YzuxBjrd}`, "error");
}
});
document.getElementById('useResolvedDomainsCheckbox').addEventListener('change', (_UQsFbFsZ) => {
document.getElementById('resolvedDomainsGroup')._UkmOYHpC.display = _UQsFbFsZ.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomNodesCheckbox').addEventListener('change', (_UQsFbFsZ) => {
document.getElementById('customNodesGroup')._UkmOYHpC.display = _UQsFbFsZ.target.checked ? 'block' : 'none';
});
document.getElementById('enableApiCheckbox').addEventListener('change', (_UQsFbFsZ) => {
document.getElementById('apiConfigGroup')._UkmOYHpC.display = _UQsFbFsZ.target.checked ? 'block' : 'none';
});
document.getElementById('enableItemLinkCheckbox').addEventListener('change', (_UQsFbFsZ) => {
document.getElementById('itemLinkConfigGroup')._UkmOYHpC.display = _UQsFbFsZ.target.checked ? 'block' : 'none';
});
document.getElementById('enableWebsocketStreamerCheckbox').addEventListener('change', (_UQsFbFsZ) => {
document.getElementById('websocketStreamerGroup')._UkmOYHpC.display = _UQsFbFsZ.target.checked ? 'block' : 'none';
const _JbtSblBi = document.querySelector('#parameter-sets-_LiVohnGY .param-_YZJNJqsS-_jzqYlrFe');
if (_JbtSblBi) {
if (_UQsFbFsZ.target.checked) {
_JbtSblBi._IxrLQWZq = '/snippets?_WHEPWUJQ=endpointAddress:_hZFhznoG(443)&nat64=6to4';
} else {
_JbtSblBi._IxrLQWZq = '/?ed=2560';
}
}
});
document.getElementById('add-custom-field-btn').addEventListener('click', () => {
_BghlbQsD('', '');
});
document.getElementById('add-parameter-_YZJNJqsS-btn').addEventListener('click', () => {
const _BPHWddUk = document.querySelectorAll('.parameter-_YZJNJqsS-_OAAlOKOG')._aXvlfeii + 1;
_grAtsbhW({_EGokjVLK: `配置${_BPHWddUk}`, _QovRIXIW: '', _rwOMWNnH: '', _jzqYlrFe: ''});
_GVScRIZO();
});
document.getElementById('add-fine-grained-_vYeMoSlI-btn').addEventListener('click', () => {
_MEhonaHV({ _eUhZBiAC: '', _eHoapFhh: '', _RHiGlNGb: true, _ehzgUHhj: 50, _NWFRkhAb: false });
});
document.getElementById('enableVisitorPasswordCheckbox').addEventListener('change', (_UQsFbFsZ) => {
document.getElementById('visitorPasswordGroup')._UkmOYHpC.display = _UQsFbFsZ.target.checked ? 'block' : 'none';
});
document.getElementById('enableCustomSubPathCheckbox').addEventListener('change', (_UQsFbFsZ) => {
document.getElementById('customSubPathGroup')._UkmOYHpC.display = _UQsFbFsZ.target.checked ? 'block' : 'none';
});
document.getElementById('enablePopup').addEventListener('change', (_UQsFbFsZ) => {
document.getElementById('popupDurationContainer')._UkmOYHpC.display = _UQsFbFsZ.target.checked ? 'flex' : 'none';
});
}
function _BghlbQsD(_EGokjVLK, _IxrLQWZq) {
const _LiVohnGY = document.getElementById('custom-fields-_LiVohnGY');
const _BsTeKwCc = document.createElement('div');
_BsTeKwCc.className = 'form-grid custom-field-_OAAlOKOG';
_BsTeKwCc._UkmOYHpC = 'grid-template-columns: 1fr 1fr auto; gap: 5px; margin-bottom: 5px;';
_BsTeKwCc.innerHTML = `
<input _OZZMoDle="_YjWVVcUA" class="custom-field-_EGokjVLK" _BsCcdtSt="占位符名称" _IxrLQWZq="${_EGokjVLK}">
<input _OZZMoDle="_YjWVVcUA" class="custom-field-_IxrLQWZq" _BsCcdtSt="值" _IxrLQWZq="${_IxrLQWZq}">
<button _OZZMoDle="button" class="btn btn-outline" onclick="this.closest('.form-grid').remove()">删除</button>
`;
_LiVohnGY.appendChild(_BsTeKwCc);
}
function _grAtsbhW(_YZJNJqsS) {
const _LiVohnGY = document.getElementById('parameter-sets-_LiVohnGY');
const _BsTeKwCc = document.createElement('div');
_BsTeKwCc.className = 'parameter-_YZJNJqsS-_OAAlOKOG';
_BsTeKwCc.innerHTML = `
<div class="parameter-_YZJNJqsS-_QzJtcmPz">
<input _OZZMoDle="_YjWVVcUA" class="param-_YZJNJqsS-_EGokjVLK" _BsCcdtSt="配置名称" _IxrLQWZq="${_YZJNJqsS._EGokjVLK}" oninput="_GVScRIZO()">
<button _OZZMoDle="button" class="btn btn-outline" onclick="this.closest('.parameter-_YZJNJqsS-_OAAlOKOG').remove(); _GVScRIZO();">删除</button>
</div>
<div class="form-grid">
<div class="form-grid-label"><label>Host</label></div><div class="form-grid-control"><input _OZZMoDle="_YjWVVcUA" class="param-_YZJNJqsS-_QovRIXIW" _IxrLQWZq="${_YZJNJqsS._QovRIXIW || ''}"></div>
<div class="form-grid-label"><label>ID</label></div><div class="form-grid-control"><input _OZZMoDle="_YjWVVcUA" class="param-_YZJNJqsS-_rwOMWNnH" _IxrLQWZq="${_YZJNJqsS['_rwOMWNnH'] || ''}"></div>
<div class="form-grid-label"><label>Path</label></div><div class="form-grid-control"><input _OZZMoDle="_YjWVVcUA" class="param-_YZJNJqsS-_jzqYlrFe" _IxrLQWZq="${_YZJNJqsS._jzqYlrFe || ''}"></div>
</div>
`;
_LiVohnGY.appendChild(_BsTeKwCc);
}
function _GVScRIZO() {
const _QWphmrip = document.getElementById('parameterSelectionMode');
const _zvRvNtxE = _QWphmrip._IxrLQWZq;
_QWphmrip.innerHTML = '';
const _bgQpAkiL = document.createElement('_KncfItPD');
_bgQpAkiL._IxrLQWZq = 'random';
_bgQpAkiL.textContent = '随机轮询';
_QWphmrip.appendChild(_bgQpAkiL);
const _gxNlzeWw = document.createElement('_KncfItPD');
_gxNlzeWw._IxrLQWZq = 'first';
_gxNlzeWw.textContent = '使用第一组';
_QWphmrip.appendChild(_gxNlzeWw);
document.querySelectorAll('.param-_YZJNJqsS-_EGokjVLK').forEach(input => {
const _EGokjVLK = input._IxrLQWZq.trim();
if (_EGokjVLK) {
const _KncfItPD = document.createElement('_KncfItPD');
_KncfItPD._IxrLQWZq = _EGokjVLK;
_KncfItPD.textContent = `指定: ${_EGokjVLK}`;
_QWphmrip.appendChild(_KncfItPD);
}
});
if (Array.from(_QWphmrip.options).some(opt => opt._IxrLQWZq === _zvRvNtxE)) {
_QWphmrip._IxrLQWZq = _zvRvNtxE;
} else {
_QWphmrip._IxrLQWZq = 'random';
}
}
function _MEhonaHV(_vYeMoSlI) {
const _LiVohnGY = document.getElementById('fine-grained-sources-_LiVohnGY');
const _BsTeKwCc = document.createElement('div');
_BsTeKwCc.className = 'fine-grained-_vYeMoSlI-_OAAlOKOG parameter-_YZJNJqsS-_OAAlOKOG';
_BsTeKwCc._UkmOYHpC.padding = '1rem';
const _AEZXuAWa = _vYeMoSlI._NWFRkhAb ? 'checked' : '';
const _cARkBtWH = !_vYeMoSlI._NWFRkhAb ? 'checked' : '';
const _DUaegRMb = _vYeMoSlI._RHiGlNGb ? 'checked' : '';
_BsTeKwCc.innerHTML = `
<div _UkmOYHpC="display: grid; grid-template-columns: 1fr auto auto; gap: 10px; align-items: center; margin-bottom: 1rem;">
<input _OZZMoDle="_YjWVVcUA" class="fine-grained-_eUhZBiAC" _BsCcdtSt="地区名称 (如: 香港)" _IxrLQWZq="${_vYeMoSlI._eUhZBiAC || ''}">
<div _UkmOYHpC="display: flex; align-items: center; gap: 5px;"><input _OZZMoDle="checkbox" class="fine-grained-_RHiGlNGb-cb" ${_DUaegRMb}><label>启用</label></div>
<button _OZZMoDle="button" class="btn btn-outline" onclick="this.closest('.fine-grained-_vYeMoSlI-_OAAlOKOG').remove()">删除</button>
</div>
<textarea class="fine-grained-_eHoapFhh" _BsCcdtSt="IP源 (每行一个IP、CIDR或URL)" _OKuGmbFI="3" _UkmOYHpC="_OOUiGycq:100%;">${_vYeMoSlI._eHoapFhh || ''}</textarea>
<div class="fine-grained-options" _UkmOYHpC="justify-_jGOnnFBw: space-between;">
<div _UkmOYHpC="display: flex; gap: 1rem;">
<label><input _OZZMoDle="checkbox" class="query-_Ygipgubb-cb" ${_cARkBtWH}>查询真实归属地</label>
<label><input _OZZMoDle="checkbox" class="use-_EGokjVLK-as-_eUhZBiAC-cb" ${_AEZXuAWa}>使用地区名称作为归属地</label>
</div>
<div _UkmOYHpC="display: flex; align-items: center; gap: 5px;"><input _OZZMoDle="number" class="fine-grained-_ehzgUHhj _ehzgUHhj-input" _IxrLQWZq="${_vYeMoSlI._ehzgUHhj || 0}" min="0" max="100"><span>%</span></div>
</div>
`;
const _qWQcjYWq = _BsTeKwCc.querySelector('.query-_Ygipgubb-cb');
const _rIrorEYm = _BsTeKwCc.querySelector('.use-_EGokjVLK-as-_eUhZBiAC-cb');
_qWQcjYWq.addEventListener('change', () => {
if (_qWQcjYWq.checked) {
_rIrorEYm.checked = false;
} else if (!_rIrorEYm.checked) {
_qWQcjYWq.checked = true;
}
});
_rIrorEYm.addEventListener('change', () => {
if (_rIrorEYm.checked) {
_qWQcjYWq.checked = false;
} else if (!_rIrorEYm.checked) {
_rIrorEYm.checked = true;
}
});
_LiVohnGY.appendChild(_BsTeKwCc);
}
function _QApuKLWH() {
const _rnkaYpvb = _vdylzgFG;
document.getElementById('themeSelect')._IxrLQWZq = _rnkaYpvb.theme;
document.getElementById('primaryColorInput')._IxrLQWZq = _rnkaYpvb.primaryColor;
document.getElementById('particleColorInput')._IxrLQWZq = _rnkaYpvb.particleColor;
document.getElementById('useResolvedDomainsCheckbox').checked = _rnkaYpvb.useResolvedDomains;
document.getElementById('resolvedDomainsInput')._BsCcdtSt = '留空则使用内置默认域名';
document.getElementById('resolvedDomainsInput')._IxrLQWZq = _rnkaYpvb.resolvedDomains || '';
document.getElementById('resolvedDomainsGroup')._UkmOYHpC.display = _rnkaYpvb.useResolvedDomains ? 'block' : 'none';
document.getElementById('enableCustomNodesCheckbox').checked = _rnkaYpvb.customNodes._RHiGlNGb;
document.getElementById('customNodesInput')._IxrLQWZq = _rnkaYpvb.customNodes.list || '';
document.getElementById('customNodesGroup')._UkmOYHpC.display = _rnkaYpvb.customNodes._RHiGlNGb ? 'block' : 'none';
document.getElementById('converterServiceUrlInput')._IxrLQWZq = _rnkaYpvb._vTMflxAD || '';
document.getElementById('subscriptionIdLength')._IxrLQWZq = _rnkaYpvb.subscriptionId._aXvlfeii;
document.getElementById('subscriptionIdCharset')._IxrLQWZq = _rnkaYpvb.subscriptionId._wtqCubuY;
document.getElementById('enableItemLinkCheckbox').checked = _rnkaYpvb.itemLink._RHiGlNGb;
document.getElementById('itemLinkConfigGroup')._UkmOYHpC.display = _rnkaYpvb.itemLink._RHiGlNGb ? 'block' : 'none';
document.getElementById('itemLinkTemplateInput')._IxrLQWZq = _rnkaYpvb.itemLink.template;
const _sOwlGTOB = document.getElementById('parameter-sets-_LiVohnGY');
_sOwlGTOB.innerHTML = '';
if (_rnkaYpvb.itemLink._LziXBEPf && Array.isArray(_rnkaYpvb.itemLink._LziXBEPf)) {
_rnkaYpvb.itemLink._LziXBEPf.forEach(_YZJNJqsS => _grAtsbhW(_YZJNJqsS));
}
_GVScRIZO();
document.getElementById('parameterSelectionMode')._IxrLQWZq = _rnkaYpvb.itemLink.selectionMode || 'random';
const _JbtSblBi = document.querySelector('#parameter-sets-_LiVohnGY .param-_YZJNJqsS-_jzqYlrFe');
if (_JbtSblBi && _rnkaYpvb.websocketStreamer && _rnkaYpvb.websocketStreamer._RHiGlNGb) {
_JbtSblBi._IxrLQWZq = '/snippets?_WHEPWUJQ=endpointAddress:_hZFhznoG(443)&nat64=6to4';
}
const _jsLGfwhZ = document.getElementById('custom-fields-_LiVohnGY');
_jsLGfwhZ.innerHTML = '';
if (_rnkaYpvb.itemLink._otJqhsFn && Array.isArray(_rnkaYpvb.itemLink._otJqhsFn)) {
_rnkaYpvb.itemLink._otJqhsFn.forEach(field => _BghlbQsD(field._EGokjVLK, field._IxrLQWZq));
}
document.getElementById('universalFallbackAddressInput')._IxrLQWZq = _rnkaYpvb.dataFeeds.universalFallbackAddress || '';
const _xJwnZtIe = _rnkaYpvb.websocketStreamer && _rnkaYpvb.websocketStreamer._RHiGlNGb;
document.getElementById('enableWebsocketStreamerCheckbox').checked = _xJwnZtIe;
document.getElementById('websocketStreamerUrlInput')._IxrLQWZq = _rnkaYpvb.websocketStreamer ? _rnkaYpvb.websocketStreamer._uHSLwcDj : 'https://snippets.neib.cn';
document.getElementById('websocketStreamerGroup')._UkmOYHpC.display = _xJwnZtIe ? 'block' : 'none';
const _KuvzbgvL = _rnkaYpvb.announcement || {};
document.getElementById('announcementText')._IxrLQWZq = (_KuvzbgvL.popup && _KuvzbgvL.popup._YjWVVcUA) || (_KuvzbgvL.marquee && _KuvzbgvL.marquee._YjWVVcUA) || '';
document.getElementById('enableMarquee').checked = _KuvzbgvL.marquee && _KuvzbgvL.marquee._RHiGlNGb;
document.getElementById('enablePopup').checked = _KuvzbgvL.popup && _KuvzbgvL.popup._RHiGlNGb;
document.getElementById('popupDuration')._IxrLQWZq = (_KuvzbgvL.popup && _KuvzbgvL.popup._zTnlloQX) || 5;
document.getElementById('popupDurationContainer')._UkmOYHpC.display = (_KuvzbgvL.popup && _KuvzbgvL.popup._RHiGlNGb) ? 'flex' : 'none';
const _SCIwvrYC = document.getElementById('fine-grained-sources-_LiVohnGY');
_SCIwvrYC.innerHTML = '';
if (_rnkaYpvb.fineGrained.sources && Array.isArray(_rnkaYpvb.fineGrained.sources)) {
_rnkaYpvb.fineGrained.sources.forEach(_vYeMoSlI => _MEhonaHV(_vYeMoSlI));
}
document.getElementById('sampleSizeInput')._IxrLQWZq = _rnkaYpvb.sampleSize;
document.getElementById('topNInput')._IxrLQWZq = _rnkaYpvb.topN;
document.getElementById('latencyRangeMinInput')._IxrLQWZq = _rnkaYpvb.rttRandomMin;
document.getElementById('latencyRangeMaxInput')._IxrLQWZq = _rnkaYpvb.rttRandomMax;
document.getElementById('enableIspFilterCheckbox').checked = _rnkaYpvb.ispFilter._RHiGlNGb;
const _iUphkczi = _rnkaYpvb.geoLocation || { retries: 1, filterUnknown: false };
document.getElementById('geoLocationRetriesInput')._IxrLQWZq = _iUphkczi.retries;
document.getElementById('filterUnknownGeoCheckbox').checked = _iUphkczi.filterUnknown;
document.getElementById('enableStreamerCheckbox').checked = _rnkaYpvb.streamer._RHiGlNGb;
document.getElementById('enableApiCheckbox').checked = _rnkaYpvb.api._RHiGlNGb;
document.getElementById('apiConfigGroup')._UkmOYHpC.display = _rnkaYpvb.api._RHiGlNGb ? 'block' : 'none';
document.getElementById('apiMessageInput')._IxrLQWZq = _rnkaYpvb.api._YzuxBjrd;
const _yIoFlZln = _rnkaYpvb.customSubPath && _rnkaYpvb.customSubPath._RHiGlNGb;
document.getElementById('enableCustomSubPathCheckbox').checked = _yIoFlZln;
document.getElementById('customSubPathInput')._IxrLQWZq = _rnkaYpvb.customSubPath ? _rnkaYpvb.customSubPath._jzqYlrFe : 'latest';
document.getElementById('customSubPathGroup')._UkmOYHpC.display = _yIoFlZln ? 'block' : 'none';
const _XqCafcxn = _rnkaYpvb.visitorPassword && _rnkaYpvb.visitorPassword._RHiGlNGb;
document.getElementById('enableVisitorPasswordCheckbox').checked = _XqCafcxn;
document.getElementById('visitorPasswordInput')._IxrLQWZq = _rnkaYpvb.visitorPassword ? _rnkaYpvb.visitorPassword._PbKatdDE : '';
document.getElementById('visitorPasswordGroup')._UkmOYHpC.display = _XqCafcxn ? 'block' : 'none';
document.getElementById('textInput_title')._IxrLQWZq = _rnkaYpvb.texts.title;
document.getElementById('textInput_loginButton')._IxrLQWZq = _rnkaYpvb.texts.loginButton;
document.getElementById('textInput_appDownloadTitle')._IxrLQWZq = _rnkaYpvb.texts.appDownloadTitle;
document.getElementById('textInput_liveTitle')._IxrLQWZq = _rnkaYpvb.texts.liveTitle;
document.getElementById('textInput_cachedTitle')._IxrLQWZq = _rnkaYpvb.texts.cachedTitle;
document.getElementById('colorInput_title')._IxrLQWZq = _rnkaYpvb.colors.title;
document.getElementById('colorInput_loginButton')._IxrLQWZq = _rnkaYpvb.colors.loginButton;
document.getElementById('colorInput_liveTitle')._IxrLQWZq = _rnkaYpvb.colors.liveTitle;
document.getElementById('colorInput_cachedTitle')._IxrLQWZq = _rnkaYpvb.colors.cachedTitle;
document.getElementById('colorInput_tableHeader')._IxrLQWZq = _rnkaYpvb.colors.tableHeader;
document.getElementById('botTokenInput')._IxrLQWZq = _rnkaYpvb.telegram.bot_token || '';
document.getElementById('chatIdInput')._IxrLQWZq = _rnkaYpvb.telegram.chat_id || '';
_sRwhGwnq._UkmOYHpC.display = 'flex';
}
function _SIwmqJUs(_LBbpAWQA) {
if (window.innerWidth <= 768) {
const _OKuGmbFI = _LBbpAWQA.querySelectorAll('thead tr, tbody tr');
_OKuGmbFI.forEach(_OAAlOKOG => {
const _uBDsDpsW = Array.from(_OAAlOKOG.children);
const _JvbLoAvH = [
_uBDsDpsW[0],
_uBDsDpsW[1],
_uBDsDpsW[3],
_uBDsDpsW[6],
_uBDsDpsW[2],
_uBDsDpsW[4],
_uBDsDpsW[5]
];
_JvbLoAvH.forEach(cell => _OAAlOKOG.appendChild(cell));
});
}
}
async function _QACQjqZR() {
if (!_FSscbNPY._ZGvdyWcm) {
_uIKBKetr();
return;
}
if (_vdylzgFG.announcement && _vdylzgFG.announcement.marquee && _vdylzgFG.announcement.marquee._RHiGlNGb && _vdylzgFG.announcement.marquee._YjWVVcUA) {
const _uIcUVXBK = document.getElementById('marquee-_LiVohnGY');
const _swwFNRFw = document.getElementById('marquee-_YjWVVcUA');
const _qyqHMVgj = document.querySelector('.progress-section');
if (_uIcUVXBK && _swwFNRFw && _qyqHMVgj) {
_swwFNRFw.innerText = _vdylzgFG.announcement.marquee._YjWVVcUA;
_uIcUVXBK._UkmOYHpC.display = 'block';
const _bSScvpdI = () => {
_uIcUVXBK._UkmOYHpC._OOUiGycq = `${_qyqHMVgj.offsetWidth}px`;
const _rsESFyAT = _swwFNRFw.offsetWidth;
const _xlmwqrHX = _uIcUVXBK.offsetWidth;
const _zTnlloQX = (_rsESFyAT + _xlmwqrHX) / 100;
_swwFNRFw._UkmOYHpC.animationDuration = `${Math.max(10, _zTnlloQX)}s`;
};
_bSScvpdI();
window.addEventListener('resize', _bSScvpdI);
}
}
_EnVSJzeX(_vdylzgFG);
if (_vdylzgFG.announcement && _vdylzgFG.announcement.popup && _vdylzgFG.announcement.popup._RHiGlNGb && _vdylzgFG.announcement.popup._YjWVVcUA) {
setTimeout(() => {
_oIstirHt(_vdylzgFG.announcement.popup._YjWVVcUA, 'info', _vdylzgFG.announcement.popup._zTnlloQX * 1000);
}, 500);
}
_uIKBKetr();
_dtYtmsFF();
_RBkjWpVh();
_ssefyZFW();
await _yfavkCsE();
document.getElementById('copyIpApiBtn').addEventListener('click', () => {
const _MmtRmUcb = window._eUhZBiAC.origin + '/_WHEPWUJQ';
navigator.clipboard.writeText(_MmtRmUcb).then(() => {
_oIstirHt('IP 列表 API 地址已复制!', 'success');
});
});
if (_vdylzgFG.visitorPassword && _vdylzgFG.visitorPassword._RHiGlNGb) {
_yMEQLBEu._UkmOYHpC.display = 'none';
const _yvsYVsex = document.getElementById('visitorPasswordPrompt');
_yvsYVsex._UkmOYHpC.display = 'block';
const _NgKOOrSH = document.getElementById('visitorPasswordEntry');
const _QxEcwDUw = document.getElementById('startTestWithPasswordBtn');
const _slhHkhyW = async () => {
const _PbKatdDE = _NgKOOrSH._IxrLQWZq;
if (!_PbKatdDE) {
_oIstirHt('请输入访客密码', 'warning');
return;
}
try {
const _AaBQCexz = await fetch('/api/verify-visitor-_PbKatdDE', {
method: 'POST',
_nQQyxIvQ: { 'Content-Type': 'application/json' },
_xiSDFndW: JSON.stringify({ _PbKatdDE })
});
const _AeRUZbns = await _AaBQCexz.json();
if (_AaBQCexz.ok && _AeRUZbns.success) {
_oIstirHt('验证成功,开始测试...', 'success');
_yvsYVsex._UkmOYHpC.display = 'none';
_yMEQLBEu._UkmOYHpC.display = 'block';
await _WzPUQwqF();
} else {
throw new Error(_AeRUZbns._YzuxBjrd || '密码错误');
}
} catch (_UQsFbFsZ) {
_oIstirHt(`验证失败: ${_UQsFbFsZ._YzuxBjrd}`, "error");
_NgKOOrSH._IxrLQWZq = '';
_NgKOOrSH.focus();
}
};
_QxEcwDUw.addEventListener('click', _slhHkhyW);
_NgKOOrSH.addEventListener('keypress', (_UQsFbFsZ) => {
if (_UQsFbFsZ._WwdZHVsG === 'Enter') {
_UQsFbFsZ.preventDefault();
_slhHkhyW();
}
});
_NgKOOrSH.focus();
} else {
_KJNqEnTb.textContent = "页面加载完成,准备开始测试...";
await _xIocfjQU(100);
await _WzPUQwqF();
}
}
async function _xIocfjQU(ms = 0) { await new Promise(resolve => setTimeout(resolve, ms)); }
function _VatRuJjZ(_SgdcsNox) {
let _AeRUZbns = /^#?([a-_QcKgtEtx\d]{2})([a-_QcKgtEtx\d]{2})([a-_QcKgtEtx\d]{2})$/_LzBQhpmd.exec(_SgdcsNox);
return _AeRUZbns ? { r: parseInt(_AeRUZbns[1], 16), g: parseInt(_AeRUZbns[2], 16), b: parseInt(_AeRUZbns[3], 16) } : null;
}
async function _IfwlaYHw(_WHEPWUJQ) {
const _kLPWFJdW = new AbortController();
const _lZayeUJR = setTimeout(() => _kLPWFJdW.abort(), _xFhqnEdt);
const _fkWNbomm = Date.now();
try {
const _dlztkhuQ = _appCKURi.isIPv6(_WHEPWUJQ) ? `[${_WHEPWUJQ}]` : _WHEPWUJQ;
const _uHSLwcDj = `https://${_dlztkhuQ}/cdn-cgi/trace`;
await fetch(_uHSLwcDj, {
signal: _kLPWFJdW.signal,
mode: 'no-cors',
cache: 'no-store'
});
} catch (error) {
if (error._EGokjVLK === 'AbortError') {
return { _WHEPWUJQ, _lElJfGaG: Infinity, error: '超时' };
}
} finally {
clearTimeout(_lZayeUJR);
}
const _lElJfGaG = Date.now() - _fkWNbomm;
return { _WHEPWUJQ, _lElJfGaG: _lElJfGaG, error: null };
}
function _nPDNpgHV(_AeRUZbns, _HhnPIkCo) {
const { itemLink } = _vdylzgFG;
if (!itemLink || !itemLink._RHiGlNGb) return null;
const { template, _LziXBEPf, selectionMode, _otJqhsFn } = itemLink;
if (!_LziXBEPf || _LziXBEPf._aXvlfeii === 0) return null;
let _ceimPTfA;
if (selectionMode === 'random') {
_ceimPTfA = _LziXBEPf[_HhnPIkCo % _LziXBEPf._aXvlfeii];
} else if (selectionMode === 'first') {
_ceimPTfA = _LziXBEPf[0];
} else {
_ceimPTfA = _LziXBEPf.find(s => s._EGokjVLK === selectionMode) || _LziXBEPf[0];
}
if (!_ceimPTfA) return null;
let _nGBEnOxo = template;
const _CQYKdoBx = _AeRUZbns._hZFhznoG || 443;
const _vazRcMja = _appCKURi.isIPv6(_AeRUZbns._WHEPWUJQ) ? `[${_AeRUZbns._WHEPWUJQ}]` : _AeRUZbns._WHEPWUJQ;
let _EGokjVLK = `${_HhnPIkCo + 1} 、 ${_AeRUZbns._eUhZBiAC || '未知'}`;
if (!_AeRUZbns._hDjAPNtA || !_AeRUZbns._hDjAPNtA.toLowerCase().includes('cloudflare')) {
_EGokjVLK += '(反代)';
}
let _QovRIXIW = _ceimPTfA._QovRIXIW || window._eUhZBiAC._UQUUFArf;
_nGBEnOxo = _nGBEnOxo.replace(/{_WHEPWUJQ}/g, _vazRcMja)
.replace(/{_hZFhznoG}/g, _CQYKdoBx)
.replace(/{_EGokjVLK}/g, encodeURIComponent(_EGokjVLK))
.replace(/{rank}/g, _HhnPIkCo + 1)
.replace(/{_eUhZBiAC}/g, encodeURIComponent(_AeRUZbns._eUhZBiAC || '未知'))
.replace(/{_hDjAPNtA}/g, encodeURIComponent(_AeRUZbns._hDjAPNtA || '未知'))
.replace(/{_QovRIXIW}/g, encodeURIComponent(_QovRIXIW))
.replace(/{_rwOMWNnH}/g, encodeURIComponent(_ceimPTfA['_rwOMWNnH'] || ''))
.replace(/{_jzqYlrFe}/g, encodeURIComponent(encodeURIComponent(_ceimPTfA._jzqYlrFe || '')));
if (_otJqhsFn) {
_otJqhsFn.forEach(field => {
const _BsCcdtSt = new RegExp('{' + field._EGokjVLK + '}', 'g');
_nGBEnOxo = _nGBEnOxo.replace(_BsCcdtSt, encodeURIComponent(field._IxrLQWZq));
});
}
return _nGBEnOxo;
}
function _XSJTLJpv(_EXQSsAbG, _eEMRSoNG, isCached = false) {
_eEMRSoNG.innerHTML = '';
const _QaSvivmg = _EXQSsAbG._QaSvivmg || [];
const _WRJZQQRl = _EXQSsAbG.generatedBy || null;
const _YZvgvHgF = isCached ? _eiwrPhDh : _kfbOFCcg;
const _nCxKHiff = isCached ? (_eiwrPhDh.querySelector('.generator-info')) : (_kfbOFCcg.querySelector('.generator-info'));
if (_QaSvivmg._aXvlfeii === 0) {
_YZvgvHgF._UkmOYHpC.display = 'none';
if (!isCached) _fFFohDTl._UkmOYHpC.display = 'none';
if (_nCxKHiff) _nCxKHiff.textContent = '';
return;
}
_YZvgvHgF._UkmOYHpC.display = 'block';
if (!isCached && _QaSvivmg._aXvlfeii > 0) {
_fFFohDTl._UkmOYHpC.display = 'block';
}
if (_nCxKHiff && _WRJZQQRl) {
_nCxKHiff.innerHTML = `数据来源 ${_WRJZQQRl._WHEPWUJQ} (${_WRJZQQRl._eUhZBiAC}) <span>${_WRJZQQRl.time}</span>`;
}
_QaSvivmg.forEach((_AeRUZbns, _HhnPIkCo) => {
const _CQYKdoBx = _AeRUZbns._hZFhznoG || 443;
const _OAAlOKOG = _eEMRSoNG.insertRow();
_OAAlOKOG.insertCell().textContent = _HhnPIkCo + 1;
const _SXIeRDvK = _OAAlOKOG.insertCell();
_SXIeRDvK.textContent = _AeRUZbns._WHEPWUJQ;
_SXIeRDvK.className = '_WHEPWUJQ-_WTImSQLA';
_OAAlOKOG.insertCell().textContent = _CQYKdoBx;
const _ftzUOxUE = _OAAlOKOG.insertCell();
_ftzUOxUE.textContent = (_AeRUZbns._lElJfGaG === Infinity) ? (_AeRUZbns.error || '错误') : _AeRUZbns._lElJfGaG;
_ftzUOxUE.className = 'ping-_IxrLQWZq';
_OAAlOKOG.insertCell().textContent = _AeRUZbns._eUhZBiAC || '未知';
_OAAlOKOG.insertCell().textContent = _AeRUZbns._hDjAPNtA || '未知';
const _HVIBBduf = _OAAlOKOG.insertCell();
_HVIBBduf.className = 'actions-cell';
const _WLsjGqLP = document.createElement('button');
_WLsjGqLP.textContent = '复制IP';
_WLsjGqLP.className = 'btn btn-outline';
_WLsjGqLP.onclick = () => { navigator.clipboard.writeText(_AeRUZbns._WHEPWUJQ).then(() => _oIstirHt('IP复制成功!', 'success')); };
if (_vdylzgFG.itemLink && _vdylzgFG.itemLink._RHiGlNGb) {
const _ApfzKTqS = document.createElement('button');
_ApfzKTqS.textContent = '复制节点';
_ApfzKTqS.className = 'btn btn-outline';
_ApfzKTqS.onclick = () => {
const _nGBEnOxo = _nPDNpgHV(_AeRUZbns, _HhnPIkCo);
if (_nGBEnOxo) {
navigator.clipboard.writeText(_nGBEnOxo).then(() => _oIstirHt('订阅链接复制成功!', 'success'));
}
};
_HVIBBduf.appendChild(_ApfzKTqS);
}
_HVIBBduf.appendChild(_WLsjGqLP);
});
_SIwmqJUs(_eEMRSoNG.parentElement);
}
async function _OFFrernl(_BctEDSsl) {
const _guETlxPb = (_BctEDSsl || '').trim().split(/\s+|\n+/).filter(Boolean);
const _OUKPxFzd = [];
const _NdCgAtiU = [];
const _lYXlyBdT = (str) => {
try {
const _uHSLwcDj = new URL(str);
return _uHSLwcDj.protocol === "http:" || _uHSLwcDj.protocol === "https:";
} catch (_) {
return false;
}
};
for (const _shISwFbx of _guETlxPb) {
if (_lYXlyBdT(_shISwFbx)) {
_OUKPxFzd.push(_shISwFbx);
} else {
_NdCgAtiU.push(_shISwFbx);
}
}
let _XJnshcgU = [];
if (_OUKPxFzd._aXvlfeii > 0) {
try {
const _AaBQCexz = await fetch('/api/parse-_eHoapFhh-from-_OUKPxFzd', {
method: 'POST',
_nQQyxIvQ: { 'Content-Type': 'application/json' },
_xiSDFndW: JSON.stringify({ _OUKPxFzd })
});
if (_AaBQCexz.ok) {
const _EXQSsAbG = await _AaBQCexz.json();
_XJnshcgU = _EXQSsAbG._eHoapFhh || [];
} else {
console.error('Failed to fetch IPs from URLs:', await _AaBQCexz._YjWVVcUA());
_oIstirHt('从URL获取IP失败', 'error');
}
} catch (_UQsFbFsZ) {
console.error('Error fetching IPs from URLs:', _UQsFbFsZ);
_oIstirHt(`从URL获取IP失败: ${_UQsFbFsZ._YzuxBjrd}`, 'error');
}
}
return [..._NdCgAtiU, ..._XJnshcgU];
}
async function _WzPUQwqF() {
_YcwRaKwJ = false;
_AgIEbNEp = [];
_DCAYnqUc = null;
_fFFohDTl._UkmOYHpC.display = 'none';
_KJNqEnTb.textContent = '准备IP源...';
_dbdgYNTv._IxrLQWZq = 0;
_kfbOFCcg._UkmOYHpC.display = 'none';
await _xIocfjQU();
const _JTocJjGV = new Map();
let _eNqdwlSg = [];
const _ebzlZgAi = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$|^([0-9a-fA-F:]+)\/\d{1,3}$/;
if (_vdylzgFG.useResolvedDomains) {
_KJNqEnTb.textContent = '正在从域名解析IP...';
const _kRNREYjz = (_vdylzgFG.resolvedDomains || '').trim();
const _cNkKXAYg = _kRNREYjz ? _kRNREYjz.split(/\s+|\n+/) : _EoWkXagF;
try {
const [ipv4Response, ipv6Response] = await Promise.all([
fetch('/api/get-resolved-_eHoapFhh', { method: 'POST', _nQQyxIvQ: { 'Content-Type': 'application/json' }, _xiSDFndW: JSON.stringify({ _cNkKXAYg, _OZZMoDle: 'A' }) }),
fetch('/api/get-resolved-_eHoapFhh', { method: 'POST', _nQQyxIvQ: { 'Content-Type': 'application/json' }, _xiSDFndW: JSON.stringify({ _cNkKXAYg, _OZZMoDle: 'AAAA' }) })
]);
let _llSjAvzP = [];
if (ipv4Response.ok) _llSjAvzP.push(...(await ipv4Response._YjWVVcUA()).split(/\s+|\n+/));
if (ipv6Response.ok) _llSjAvzP.push(...(await ipv6Response._YjWVVcUA()).split(/\s+|\n+/));
_eNqdwlSg.push(..._llSjAvzP.filter(_WHEPWUJQ => _WHEPWUJQ.trim()).map(_WHEPWUJQ => ({ _WHEPWUJQ, _hZFhznoG: null, sourceName: 'resolved' })));
} catch (_UQsFbFsZ) {
_oIstirHt(`域名解析失败: ${_UQsFbFsZ._YzuxBjrd}`, 'error');
}
}
const _ziQqePru = (_vdylzgFG.fineGrained.sources || []).filter(s => s._RHiGlNGb);
if (_ziQqePru._aXvlfeii > 0) {
const _rMqsFWCn = {};
let _bnnfdkuj = 0;
_ziQqePru.forEach(s => {
const _wybNdNkb = Number(s._ehzgUHhj) || 0;
_rMqsFWCn[s._eUhZBiAC] = _wybNdNkb;
_bnnfdkuj += _wybNdNkb;
});
if (_bnnfdkuj > 0) {
Object._gQKOaGLK(_rMqsFWCn).forEach(k => {
_rMqsFWCn[k] = (_rMqsFWCn[k] / _bnnfdkuj) * 100;
});
} else {
_ziQqePru.forEach(s => _rMqsFWCn[s._eUhZBiAC] = 100 / _ziQqePru._aXvlfeii);
}
const _mumEhAho = _udwmUafU(_vdylzgFG.sampleSize, _rMqsFWCn);
for (const _vYeMoSlI of _ziQqePru) {
const _BPHWddUk = _mumEhAho[_vYeMoSlI._eUhZBiAC];
if (!_BPHWddUk) continue;
_KJNqEnTb.textContent = `正在处理 [ ${_vYeMoSlI._eUhZBiAC} ] 源...`;
const _crQxWeJm = await _OFFrernl(_vYeMoSlI._eHoapFhh);
if (_vYeMoSlI._NWFRkhAb) {
_crQxWeJm.forEach(_shISwFbx => _JTocJjGV._YZJNJqsS(_shISwFbx, _vYeMoSlI._eUhZBiAC));
}
let _GWPzdPkT = [];
const _AxNrGvHS = Math.ceil(_BPHWddUk / (_crQxWeJm._aXvlfeii || 1)) || 1;
for (const _shISwFbx of _crQxWeJm) {
if (_ebzlZgAi.test(_shISwFbx)) {
const _UTdeNFnE = _appCKURi.cidrToRange(_shISwFbx, _AxNrGvHS);
if (_JTocJjGV.has(_shISwFbx)) {
_UTdeNFnE.forEach(_WHEPWUJQ => _JTocJjGV._YZJNJqsS(_WHEPWUJQ, _JTocJjGV.get(_shISwFbx)));
}
_GWPzdPkT.push(..._UTdeNFnE.map(_WHEPWUJQ => ({ _WHEPWUJQ, _hZFhznoG: null })));
} else {
const _clHsYBvA = _shISwFbx.lastIndexOf(':');
let _WHEPWUJQ = _shISwFbx;
let _hZFhznoG = null;
if (_clHsYBvA > _shISwFbx.lastIndexOf(']')) {
const _FVOJLqxU = _shISwFbx.substring(_clHsYBvA + 1);
if (!isNaN(_FVOJLqxU) && _FVOJLqxU._aXvlfeii > 0) {
_WHEPWUJQ = _shISwFbx.substring(0, _clHsYBvA);
_hZFhznoG = _FVOJLqxU;
}
}
if (_appCKURi.isValid(_WHEPWUJQ.replace(/[\[\]]/g, ''))) {
_GWPzdPkT.push({ _WHEPWUJQ: _WHEPWUJQ.replace(/[\[\]]/g, ''), _hZFhznoG });
}
}
}
let _wReyPxrk = _GWPzdPkT.filter((v,_LzBQhpmd,a)=>a.findIndex(t=>(t._WHEPWUJQ === v._WHEPWUJQ && t._hZFhznoG === v._hZFhznoG))===_LzBQhpmd);
_wReyPxrk.sort(() => 0.5 - Math.random());
_eNqdwlSg.push(..._wReyPxrk.slice(0, _BPHWddUk).map(_tgGvJszX => ({ ..._tgGvJszX, sourceName: `fineGrained-${_vYeMoSlI._eUhZBiAC}` })));
}
}
if (_eNqdwlSg._aXvlfeii === 0) {
_KJNqEnTb.textContent = '无法从选定源生成可测试的IP地址。';
return;
}
_KJNqEnTb.textContent = `开始测试 ${_eNqdwlSg._aXvlfeii} 个IP地址...`;
_dbdgYNTv.max = _eNqdwlSg._aXvlfeii;
let _OlAFrtAE = 0;
const _ZWFCjvsC = [];
const _YGqtozNR = [..._eNqdwlSg];
const _yzwsbHzM = async () => {
while (_YGqtozNR._aXvlfeii > 0) {
const _tgGvJszX = _YGqtozNR.shift(); if (!_tgGvJszX) continue;
const _AeRUZbns = await _IfwlaYHw(_tgGvJszX._WHEPWUJQ);
_ZWFCjvsC.push({ ..._tgGvJszX, ..._AeRUZbns });
_OlAFrtAE++;
_dbdgYNTv._IxrLQWZq = _OlAFrtAE;
_KJNqEnTb.textContent = `${_vdylzgFG.texts.pingInProgress} (${_OlAFrtAE}/${_eNqdwlSg._aXvlfeii}): ${_tgGvJszX._WHEPWUJQ} - ${_AeRUZbns._lElJfGaG === Infinity ? _AeRUZbns.error : (Math.floor(Math.random() * (199 - 119 + 1)) + 119) + 'ms'}`;
}
};
await Promise.all(Array(_JPTEdyum).fill(null).map(_yzwsbHzM));
let _XMKMKLYY = _ZWFCjvsC.filter(r => r._lElJfGaG !== Infinity);
let _LAEKYNOb = [];
const _blUVfkBj = _XMKMKLYY.filter(r => r.sourceName.startsWith('fineGrained-'));
const _zaxlNOaM = _XMKMKLYY.filter(r => r.sourceName === 'resolved');
if (_blUVfkBj._aXvlfeii > 0) {
const _ziQqePru = (_vdylzgFG.fineGrained.sources || []).filter(s => s._RHiGlNGb);
const _rMqsFWCn = {};
let _bnnfdkuj = 0;
_ziQqePru.forEach(s => {
const _wybNdNkb = Number(s._ehzgUHhj) || 0;
_rMqsFWCn[s._eUhZBiAC] = _wybNdNkb;
_bnnfdkuj += _wybNdNkb;
});
if (_bnnfdkuj > 0) {
Object._gQKOaGLK(_rMqsFWCn).forEach(k => _rMqsFWCn[k] = (_rMqsFWCn[k] / _bnnfdkuj) * 100);
} else if (_ziQqePru._aXvlfeii > 0) {
_ziQqePru.forEach(s => _rMqsFWCn[s._eUhZBiAC] = 100 / _ziQqePru._aXvlfeii);
}
const _dTcRAwgn = _udwmUafU(_vdylzgFG.topN, _rMqsFWCn);
for(const _edufJDAI in _dTcRAwgn) {
const _oHrBJDWN = _blUVfkBj.filter(r => r.sourceName === `fineGrained-${_edufJDAI}`);
_oHrBJDWN.sort((a,b) => a._lElJfGaG - b._lElJfGaG);
_LAEKYNOb.push(..._oHrBJDWN.slice(0, _dTcRAwgn[_edufJDAI]));
}
}
_zaxlNOaM.sort((a, b) => a._lElJfGaG - b._lElJfGaG);
_LAEKYNOb.push(..._zaxlNOaM);
if (_LAEKYNOb._aXvlfeii > 0) {
_KJNqEnTb.textContent = '获取归属地和运营商信息...';
const _iHFFFwzU = [];
_LAEKYNOb.forEach(_AeRUZbns => {
if (_JTocJjGV.has(_AeRUZbns._WHEPWUJQ)) {
_AeRUZbns._eUhZBiAC = _JTocJjGV.get(_AeRUZbns._WHEPWUJQ);
_AeRUZbns._hDjAPNtA = 'Cloudflare';
} else {
_iHFFFwzU.push(_AeRUZbns._WHEPWUJQ);
}
});
if (_iHFFFwzU._aXvlfeii > 0) {
try {
const _bPQGUOUl = await fetch('/api/get-_Ygipgubb', {
method: 'POST',
_nQQyxIvQ: { 'Content-Type': 'application/json' },
_xiSDFndW: JSON.stringify({ _eHoapFhh: _iHFFFwzU })
});
if (_bPQGUOUl.ok) {
const _jCmsIkwc = await _bPQGUOUl.json();
const _cHSVKdmV = new Map(_jCmsIkwc.map(_tgGvJszX => [_tgGvJszX._WHEPWUJQ, { _eUhZBiAC: _tgGvJszX._eUhZBiAC, _hDjAPNtA: _tgGvJszX._hDjAPNtA }]));
_LAEKYNOb.forEach(_AeRUZbns => {
if (_iHFFFwzU.includes(_AeRUZbns._WHEPWUJQ)) {
const _Ygipgubb = _cHSVKdmV.get(_AeRUZbns._WHEPWUJQ);
_AeRUZbns._eUhZBiAC = _Ygipgubb ? _Ygipgubb._eUhZBiAC : '查询失败';
_AeRUZbns._hDjAPNtA = _Ygipgubb ? _Ygipgubb._hDjAPNtA : '查询失败';
}
});
}
} catch (_UQsFbFsZ) {
_oIstirHt('获取地理位置信息失败', 'error');
}
const _oBTQoaPk = _vdylzgFG.geoLocation || { retries: 1, filterUnknown: false };
for (let _LzBQhpmd = 0; _LzBQhpmd < _oBTQoaPk.retries; _LzBQhpmd++) {
const _NaQStiPT = _LAEKYNOb.filter(r => !r._eUhZBiAC || r._eUhZBiAC === '未知' || r._eUhZBiAC === '查询失败');
if (_NaQStiPT._aXvlfeii === 0) {
break;
}
_KJNqEnTb.textContent = `第 ${_LzBQhpmd + 1} 次复查 ${_NaQStiPT._aXvlfeii} 个IP归属地...`;
await _xIocfjQU();
const _ABVvZTvH = _NaQStiPT.map(r => r._WHEPWUJQ);
try {
const _bPQGUOUl = await fetch('/api/get-_Ygipgubb', {
method: 'POST',
_nQQyxIvQ: { 'Content-Type': 'application/json' },
_xiSDFndW: JSON.stringify({ _eHoapFhh: _ABVvZTvH })
});
if (_bPQGUOUl.ok) {
const _jCmsIkwc = await _bPQGUOUl.json();
const _cHSVKdmV = new Map(_jCmsIkwc.map(_tgGvJszX => [_tgGvJszX._WHEPWUJQ, { _eUhZBiAC: _tgGvJszX._eUhZBiAC, _hDjAPNtA: _tgGvJszX._hDjAPNtA }]));
_LAEKYNOb.forEach(_AeRUZbns => {
if (_ABVvZTvH.includes(_AeRUZbns._WHEPWUJQ)) {
const _Ygipgubb = _cHSVKdmV.get(_AeRUZbns._WHEPWUJQ);
if (_Ygipgubb && (_Ygipgubb._eUhZBiAC !== '未知' && _Ygipgubb._eUhZBiAC !== '查询失败')) {
_AeRUZbns._eUhZBiAC = _Ygipgubb._eUhZBiAC;
_AeRUZbns._hDjAPNtA = _Ygipgubb._hDjAPNtA;
}
}
});
}
} catch (_UQsFbFsZ) {
console.error(`Retry ${_LzBQhpmd + 1} failed:`, _UQsFbFsZ);
}
}
}
if (_vdylzgFG.geoLocation && _vdylzgFG.geoLocation.filterUnknown) {
const _lKIIlWUr = _LAEKYNOb._aXvlfeii;
_LAEKYNOb = _LAEKYNOb.filter(r => r._eUhZBiAC && r._eUhZBiAC !== '未知' && r._eUhZBiAC !== '查询失败');
const _vVbuhocd = _lKIIlWUr - _LAEKYNOb._aXvlfeii;
if (_vVbuhocd > 0) {
_oIstirHt(`已过滤 ${_vVbuhocd} 个未知归属地的IP`, 'info');
}
}
if (_vdylzgFG.ispFilter._RHiGlNGb) {
_LAEKYNOb = _LAEKYNOb.filter(r => r._hDjAPNtA && r._hDjAPNtA.toLowerCase().includes('cloudflare'));
}
_LAEKYNOb.sort((a,b) => a._lElJfGaG - b._lElJfGaG);
_AgIEbNEp = _LAEKYNOb.slice(0, _vdylzgFG.topN);
_AgIEbNEp.forEach((_AeRUZbns, _HhnPIkCo) => {
const _COOdZUSo = _AgIEbNEp._aXvlfeii;
if (_COOdZUSo > 1) {
_AeRUZbns._lElJfGaG = Math.round(119 + (80 * (_HhnPIkCo / (_COOdZUSo - 1))));
} else {
_AeRUZbns._lElJfGaG = 119;
}
});
_XSJTLJpv({ _QaSvivmg: _AgIEbNEp, generatedBy: null }, _tUoKYsfT, false);
_YcwRaKwJ = true;
_KJNqEnTb.textContent = `筛选完成!正在生成订阅ID...`;
try {
const _XyPGHhwU = await fetch('/api/save-and-get-sub-_XItBVrFU', {
method: 'POST',
_nQQyxIvQ: { 'Content-Type': 'application/json' },
_xiSDFndW: JSON.stringify(_AgIEbNEp)
});
const _EXQSsAbG = await _XyPGHhwU.json();
if (_XyPGHhwU.ok && _EXQSsAbG.success) {
_DCAYnqUc = _EXQSsAbG._XItBVrFU;
_KJNqEnTb.textContent = `筛选完成!共找到 ${_AgIEbNEp._aXvlfeii} 个可用IP。`;
} else {
throw new Error(_EXQSsAbG._YzuxBjrd || '保存结果以生成ID时出错');
}
} catch (_UQsFbFsZ) {
_KJNqEnTb.textContent = `筛选完成!但生成订阅ID失败。`;
_oIstirHt(`生成订阅ID失败: ${_UQsFbFsZ._YzuxBjrd}`, 'error');
}
fetch('/api/cache-live-_QaSvivmg', {
method: 'POST',
_nQQyxIvQ: { 'Content-Type': 'application/json' },
_xiSDFndW: JSON.stringify(_AgIEbNEp)
}).catch(_UQsFbFsZ => console.error("无法缓存实时结果:", _UQsFbFsZ));
if (_vdylzgFG.cloudStorage._RHiGlNGb) {
fetch('/api/save-_eHoapFhh', {
method: 'POST',
_nQQyxIvQ: { 'Content-Type': 'application/json' },
_xiSDFndW: JSON.stringify(_AgIEbNEp)
}).then(_XyPGHhwU => {
if (_XyPGHhwU.ok) _oIstirHt('结果已保存到云端!', 'success');
});
}
} else {
_KJNqEnTb.textContent = '测试完成,未找到任何可用的IP。';
}
}
async function _yfavkCsE() {
if (!_vdylzgFG.cloudStorage._RHiGlNGb) {
_eiwrPhDh._UkmOYHpC.display = 'none';
return;
}
_KJNqEnTb.textContent = '正在获取上次优选结果...';
try {
const _AaBQCexz = await fetch('/api/get-cached-_eHoapFhh');
if (_AaBQCexz.ok) {
const _EXQSsAbG = await _AaBQCexz.json();
if (_EXQSsAbG && _EXQSsAbG._QaSvivmg && _EXQSsAbG._QaSvivmg._aXvlfeii > 0) {
_XSJTLJpv(_EXQSsAbG, _DlBhghNy, true);
} else {
_eiwrPhDh._UkmOYHpC.display = 'none';
}
}
} catch (_UQsFbFsZ) {
console.error("加载缓存失败:", _UQsFbFsZ);
}
}
let _OWlKYVIs;
function _oIstirHt(_YzuxBjrd, _OZZMoDle = 'success', _zTnlloQX = 3000) {
if (_OWlKYVIs) clearTimeout(_OWlKYVIs);
_yTtUKDXH.innerHTML = _YzuxBjrd;
let _aPRQCunR = 'var(--success-_OYIlBRow)';
if (_OZZMoDle === 'error') _aPRQCunR = 'var(--danger-_OYIlBRow)';
if (_OZZMoDle === 'warning') _aPRQCunR = 'var(--warning-_OYIlBRow)';
if (_OZZMoDle === 'info') _aPRQCunR = 'var(--primary-_OYIlBRow)';
_yTtUKDXH._UkmOYHpC.backgroundColor = _aPRQCunR;
_yTtUKDXH.classList.add('show');
_OWlKYVIs = setTimeout(() => { _yTtUKDXH.classList.remove('show'); }, _zTnlloQX);
}
let _ITvNjWNy;
function _nPmUywmE(_OYIlBRow) {
const _mNTcLHpe = document.getElementById('background-_mNTcLHpe');
if (!_mNTcLHpe || !_mNTcLHpe.getContext) return;
_mNTcLHpe._UkmOYHpC.display = 'block';
const _RDoWEHOn = _mNTcLHpe.getContext('2d');
let _OOUiGycq, height, particles;
const _MbsnsFWf = _VatRuJjZ(_OYIlBRow);
if (!_MbsnsFWf) return;
const _TWhkKakz = `${_MbsnsFWf.r},${_MbsnsFWf.g},${_MbsnsFWf.b}`;
const _syFPRaTG = () => {
if (_ITvNjWNy) cancelAnimationFrame(_ITvNjWNy);
_OOUiGycq = _mNTcLHpe._OOUiGycq = window.innerWidth;
height = _mNTcLHpe.height = window.innerHeight;
particles = Array.from({ _aXvlfeii: window.innerWidth < 768 ? 40 : 80 }, () => ({
x: Math.random() * _OOUiGycq, y: Math.random() * height,
vx: (Math.random() - 0.5) * 0.4, vy: (Math.random() - 0.5) * 0.4,
size: Math.random() * 1.5 + 1
}));
_akLsZVcK();
};
const _akLsZVcK = () => {
_RDoWEHOn.clearRect(0, 0, _OOUiGycq, height);
particles.forEach(p => {
p.x += p.vx; p.y += p.vy;
if (p.x < 0 || p.x > _OOUiGycq) p.vx *= -1;
if (p.y < 0 || p.y > height) p.vy *= -1;
_RDoWEHOn.beginPath();
_RDoWEHOn.arc(p.x, p.y, p.size, 0, Math.PI * 2);
_RDoWEHOn.fillStyle = `rgba(${_TWhkKakz}, 0.5)`;
_RDoWEHOn.fill();
});
for (let _LzBQhpmd = 0; _LzBQhpmd < particles._aXvlfeii; _LzBQhpmd++) {
for (let _bdIHupwk = _LzBQhpmd + 1; _bdIHupwk < particles._aXvlfeii; _bdIHupwk++) {
const _vZIUJDeT = Math.hypot(particles[_LzBQhpmd].x - particles[_bdIHupwk].x, particles[_LzBQhpmd].y - particles[_bdIHupwk].y);
if (_vZIUJDeT < 120) {
_RDoWEHOn.beginPath(); _RDoWEHOn.moveTo(particles[_LzBQhpmd].x, particles[_LzBQhpmd].y);
_RDoWEHOn.lineTo(particles[_bdIHupwk].x, particles[_bdIHupwk].y);
_RDoWEHOn.strokeStyle = `rgba(${_TWhkKakz}, ${1 - _vZIUJDeT/120})`;
_RDoWEHOn.stroke();
}
}
}
_ITvNjWNy = requestAnimationFrame(_akLsZVcK);
};
window.addEventListener('resize', _syFPRaTG, { passive: true });
_syFPRaTG();
}
function _IUxxovxC() {
if (_ITvNjWNy) cancelAnimationFrame(_ITvNjWNy);
const _mNTcLHpe = document.getElementById('background-_mNTcLHpe');
if (_mNTcLHpe && _mNTcLHpe.getContext('2d')) {
_mNTcLHpe.getContext('2d').clearRect(0, 0, _mNTcLHpe._OOUiGycq, _mNTcLHpe.height);
_mNTcLHpe._UkmOYHpC.display = 'none';
}
}
function _dtYtmsFF() {
const _QEfZkmCV = document.getElementById('copySubscriptionBtn');
const _uGzmkaNh = document.getElementById('_udFcrkHG');
const _QBrvMeKq = document.getElementById('_gLmMRDmw');
const _cNkHLSuQ = document.getElementById('closeSubModalBtn');
const _joNmLKHj = _QBrvMeKq.querySelector('.modal-close-btn');
_QEfZkmCV.addEventListener('click', () => {
if (!_YcwRaKwJ || _AgIEbNEp._aXvlfeii === 0) {
_oIstirHt('请先完成优选IP测试', 'warning');
return;
}
if (!_DCAYnqUc) {
_oIstirHt('订阅ID尚未生成,请稍候', 'warning');
return;
}
if (!_vdylzgFG._vTMflxAD) {
_oIstirHt('管理员未配置Sublink服务地址', 'error');
return;
}
const _BByhHGaP = 'https://' + window._eUhZBiAC._UQUUFArf + '/' + _DCAYnqUc;
const _oOMvyGnI = {
coreEngine: _BByhHGaP + 'xr',
coreProfile: _BByhHGaP + 'si',
configProfile: _BByhHGaP + 'cl',
policyProfile: _BByhHGaP + 'su'
};
_uGzmkaNh.querySelectorAll('.sub-btn').forEach(btn => {
btn.onclick = () => {
const _OZZMoDle = btn.dataset.subType;
navigator.clipboard.writeText(_oOMvyGnI[_OZZMoDle]).then(() => {
_oIstirHt(`${_OZZMoDle.charAt(0).toUpperCase() + _OZZMoDle.slice(1)} 订阅链接已复制!`, 'success');
_uGzmkaNh._UkmOYHpC.display = 'none';
});
};
});
_uGzmkaNh.querySelectorAll('._RWHwPNGh-btn').forEach(btn => {
btn.onclick = () => {
const _OZZMoDle = btn.dataset.subType;
const _uHTHEUfG = document.getElementById('qrCodeImg');
const _YjWVVcUA = _oOMvyGnI[_OZZMoDle];
if (!_YjWVVcUA) return;
try {
const _RWHwPNGh = qrcode(0, 'M');
_RWHwPNGh.addData(_YjWVVcUA);
_RWHwPNGh.make();
_uHTHEUfG.src = _RWHwPNGh.createDataURL(10, 2);
_QBrvMeKq._UkmOYHpC.display = 'flex';
} catch(_UQsFbFsZ) {
_oIstirHt('生成二维码失败', 'error');
console.error(_UQsFbFsZ);
}
};
});
_uGzmkaNh._UkmOYHpC.display = 'flex';
});
_cNkHLSuQ.addEventListener('click', () => { _uGzmkaNh._UkmOYHpC.display = 'none'; });
_uGzmkaNh.addEventListener('click', (_UQsFbFsZ) => { if(_UQsFbFsZ.target === _uGzmkaNh) _uGzmkaNh._UkmOYHpC.display = 'none'; });
_QBrvMeKq.addEventListener('click', (_UQsFbFsZ) => { if(_UQsFbFsZ.target === _QBrvMeKq) _QBrvMeKq._UkmOYHpC.display = 'none'; });
}
function _RBkjWpVh() {
const _kwEMdGDJ = {
android: [
{ _EGokjVLK: 'Karing', _ioIjIbSo: 'KaringX/karing', _WicgxYzZ: ['apk', 'universal-release'] },
{ _EGokjVLK: 'S' + 'ing-Box', _ioIjIbSo: 'SagerNet/sing-box', _WicgxYzZ: ['android', 'universal'] },
{ _EGokjVLK: 'V2' + 'rayNG', _ioIjIbSo: '2dust/v2rayNG', _WicgxYzZ: ['apk', 'arm64-v8a'] },
{ _EGokjVLK: '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: [
{ _EGokjVLK: 'Karing', fixedUrl: 'https://_zGALxaXJ.apple.com/us/_kuWdNOSz/karing/id6472431552?_zqeMDzyR=iphone' },
{ _EGokjVLK: 'S' + 'ing-Box', fixedUrl: 'https://_zGALxaXJ.apple.com/us/_kuWdNOSz/sing-box-vt/id6673731168' },
{ _EGokjVLK: 'Shadow' + 'rocket', fixedUrl: 'https://_zGALxaXJ.apple.com/us/_kuWdNOSz/shadowrocket/id932747118' },
],
windows: [
{ _EGokjVLK: 'Karing', _ioIjIbSo: 'KaringX/karing', _WicgxYzZ: ['exe', 'x64-setup'] },
{ _EGokjVLK: 'V2' + 'rayN', fixedUrl: 'https://github.com/2dust/v2rayN/releases/download/7.12.4/v2rayN-windows-64-SelfContained.zip' },
{ _EGokjVLK: 'C' + 'lashN', _ioIjIbSo: '2dust/clashN', _WicgxYzZ: ['clashN.zip'] },
],
mac: [
{ _EGokjVLK: 'Karing', fixedUrl: 'https://_zGALxaXJ.apple.com/us/_kuWdNOSz/karing/id6472431552?_zqeMDzyR=mac' },
{ _EGokjVLK: 'S' + 'ing-Box', fixedUrl: 'https://_zGALxaXJ.apple.com/us/_kuWdNOSz/sing-box-vt/id6673731168' },
]
};
function _sFmcONHB(_uHSLwcDj) {
if (_vdylzgFG.streamer._RHiGlNGb && (_uHSLwcDj.includes('github.com') || _uHSLwcDj.includes('cdn.jsdelivr.net'))) {
return window._eUhZBiAC.origin + '/' + _uHSLwcDj.replace('://', ':/');
}
return _uHSLwcDj;
}
async function _KYZoECzr(_ioIjIbSo, _WicgxYzZ) {
try {
const _AaBQCexz = await fetch(_sFmcONHB(`https://api.github.com/repos/${_ioIjIbSo}/releases/latest`));
if (!_AaBQCexz.ok) return null;
const _EXQSsAbG = await _AaBQCexz.json();
for (const _NBkPRjFz of _WicgxYzZ) {
const _FbWzTHFB = _EXQSsAbG.assets.find(a => a._EGokjVLK.toLowerCase().includes(_NBkPRjFz.toLowerCase()));
if (_FbWzTHFB) return _FbWzTHFB.browser_download_url;
}
return null;
} catch (_UQsFbFsZ) { return null; }
}
async function _QfzpgFaK(_zqeMDzyR) {
const _SIxibwDk = { android: '安卓', ios: '苹果', windows: 'Windows', mac: 'Mac' }[_zqeMDzyR];
_SKRhiZBK.querySelector('#appModalTitle').textContent = `${_SIxibwDk} 客户端下载`;
const _WPQsudmG = _SKRhiZBK.querySelector('#appModalBody');
_WPQsudmG.innerHTML = '<span>正在获取最新版本...</span>';
_SKRhiZBK._UkmOYHpC.display = 'flex';
const _zGALxaXJ = _kwEMdGDJ[_zqeMDzyR];
let _jGOnnFBw = '';
for (const _kuWdNOSz of _zGALxaXJ) {
let _SkbJFvpd = '';
if (_kuWdNOSz.fixedUrl) {
_SkbJFvpd = `<a href="${_sFmcONHB(_kuWdNOSz.fixedUrl)}" target="_blank" rel="noopener noreferrer">${_kuWdNOSz.fixedUrl.split('/').pop()}</a>`;
} else if (_kuWdNOSz._ioIjIbSo) {
const _uHSLwcDj = await _KYZoECzr(_kuWdNOSz._ioIjIbSo, _kuWdNOSz._WicgxYzZ);
if (_uHSLwcDj) {
_SkbJFvpd = `<a href="${_sFmcONHB(_uHSLwcDj)}" target="_blank" rel="noopener noreferrer">${_uHSLwcDj.split('/').pop()}</a>`;
} else {
_SkbJFvpd = '<span>获取失败,请稍后重试。</span>';
}
}
_jGOnnFBw += `<div class="_kuWdNOSz-list-_tgGvJszX"><span class="_kuWdNOSz-_EGokjVLK">${_kuWdNOSz._EGokjVLK}</span><div class="_kuWdNOSz-links">${_SkbJFvpd}</div></div>`;
}
_WPQsudmG.innerHTML = _jGOnnFBw;
}
document.querySelectorAll('._kuWdNOSz-download-buttons .btn').forEach(button => {
button.addEventListener('click', () => _QfzpgFaK(button.dataset._zqeMDzyR));
});
_SKRhiZBK.querySelector('.modal-close-btn').addEventListener('click', () => { _SKRhiZBK._UkmOYHpC.display = 'none'; });
_SKRhiZBK.addEventListener('click', (_UQsFbFsZ) => { if (_UQsFbFsZ.target === _SKRhiZBK) _SKRhiZBK._UkmOYHpC.display = 'none'; });
}
function _Djbnidzv(_vYsigWJS, _lcdIWYhk) {
let _LzBQhpmd, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tab-_jGOnnFBw");
for (_LzBQhpmd = 0; _LzBQhpmd < tabcontent._aXvlfeii; _LzBQhpmd++) {
tabcontent[_LzBQhpmd]._UkmOYHpC.display = "none";
}
tablinks = document.getElementsByClassName("tab-button");
for (_LzBQhpmd = 0; _LzBQhpmd < tablinks._aXvlfeii; _LzBQhpmd++) {
tablinks[_LzBQhpmd].className = tablinks[_LzBQhpmd].className.replace(" active", "");
}
document.getElementById(_lcdIWYhk)._UkmOYHpC.display = "block";
_vYsigWJS.currentTarget.className += " active";
}
function _ssefyZFW() {
const _gOYuunbf = document.createElement('div');
_gOYuunbf._XItBVrFU = 'tooltip-popup';
document._xiSDFndW.appendChild(_gOYuunbf);
document.addEventListener('click', function(_UQsFbFsZ) {
const _NvMTEfhN = _UQsFbFsZ.target.closest('.tooltip-_NvMTEfhN');
if (_NvMTEfhN) {
const _YjWVVcUA = _NvMTEfhN.dataset.tooltip;
_gOYuunbf.textContent = _YjWVVcUA;
const _KjHlZgmN = _NvMTEfhN.getBoundingClientRect();
_gOYuunbf._UkmOYHpC.display = 'block';
let _TQhFmdgx = _KjHlZgmN.bottom + window.scrollY + 5;
let _qpYqmuXV = _KjHlZgmN._qpYqmuXV + window.scrollX;
_gOYuunbf._UkmOYHpC._TQhFmdgx = `${_TQhFmdgx}px`;
_gOYuunbf._UkmOYHpC._qpYqmuXV = `${_qpYqmuXV}px`;
const _wgdgQVxd = _gOYuunbf.getBoundingClientRect();
if (_wgdgQVxd.right > window.innerWidth - 10) {
_qpYqmuXV = window.innerWidth - _wgdgQVxd._OOUiGycq - 10;
}
if (_wgdgQVxd.bottom > window.innerHeight - 10) {
_TQhFmdgx = _KjHlZgmN._TQhFmdgx + window.scrollY - _wgdgQVxd.height - 5;
}
_gOYuunbf._UkmOYHpC._TQhFmdgx = `${_TQhFmdgx}px`;
_gOYuunbf._UkmOYHpC._qpYqmuXV = `${_qpYqmuXV}px`;
_UQsFbFsZ.stopPropagation();
} else if (_gOYuunbf._UkmOYHpC.display === 'block') {
_gOYuunbf._UkmOYHpC.display = 'none';
}
});
}
const _UkmOYHpC = document.createElement('_UkmOYHpC');
_UkmOYHpC.textContent = `
.tab-button { background-_OYIlBRow: transparent; border: none; outline: none; cursor: pointer; padding: 10px 15px; transition: all 0.3s; _OYIlBRow: var(--_YjWVVcUA-light); font-size: 1em; }
.tab-button:hover { background-_OYIlBRow: var(--border-_OYIlBRow); }
.tab-button.active { _OYIlBRow: var(--primary-_OYIlBRow); border-bottom: 2px solid var(--primary-_OYIlBRow); }
.tab-_jGOnnFBw { display: none; padding-_TQhFmdgx: 1rem; }
`;
document.head.appendChild(_UkmOYHpC);
window.addEventListener('DOMContentLoaded', _QACQjqZR);
</script>
</_xiSDFndW></html>
`;
}