async function showDevice(id){
const d=await api('/api/accounts/'+id+'/device');
if(d.error) return fail('无法查看设备', d.error);
const cell=(k,v,span)=>'
'+esc(k)+''+esc(v||'-')+'
';
const html=''+
cell('androidId', d.android_id)+
cell('androidId hex', d.android_id_hex)+
cell('serial', d.serial)+
cell('品牌 / 型号', [d.brand, d.model].filter(Boolean).join(' '))+
cell('设备名', d.device_name)+
cell('product', d.product)+
cell('manufacturer', d.manufacturer)+
cell('hardware', d.hardware)+
cell('release / sdk', [d.release, d.sdk].filter(Boolean).join(' / '))+
cell('build', d.build_id)+
cell('bootloader', d.bootloader)+
cell('GMS', d.gms_version)+
cell('分辨率', [d.width, d.height, d.dpi].filter(Boolean).join(' × '))+
cell('GPU', d.gpu, 'span3')+
cell('字体', d.fonts, 'span3')+
cell('TLS', d.tls, 'span3')+
cell('ABI', d.abis, 'span2')+
cell('MAC', d.mac)+
cell('locale', d.locale)+
cell('时区', d.timezone)+
cell('出口 IP', d.egress_ip)+
cell('client id', d.client_id, 'span2')+
cell('logging id', d.logging_id)+
cell('digest', d.digest, 'span3')+
cell('checkin UA', d.checkin_ua, 'span3')+
cell('Finsky UA', d.user_agent, 'span3')+
cell('WebView UA', d.webview_ua, 'span3')+
'
';
const root=$('#modalRoot');
root.innerHTML='';
const close=()=>{ document.removeEventListener('keydown', onEsc); root.innerHTML=''; };
const onEsc=e=>{ if(e.key==='Escape'){ e.preventDefault(); close(); } };
document.addEventListener('keydown', onEsc);
bindMaskClose(root, close);
$('#mOk').onclick=close;
$('#devRotate').onclick=async()=>{
const ok=await modal({title:'轮换设备', message:'会重置设备身份、清除 master token,然后重新登录。账号 #'+id, okText:'轮换', cancelText:'取消'});
if(!ok) return;
const j=await api('/api/accounts/'+id+'/device/rotate',{method:'POST',body:'{}'});
if(j.error) return fail('无法轮换', j.error);
close();
notice('正在轮换设备', '任务 #'+(j.job_id||''));
watchAccountJob(id, 'keep', j.job_id, '轮换设备');
};
}