Ë
    Cµj¾b ã                   óþ  — d Z ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZd„ ZdZdZdZh d£Zdd	d
dœZd„ ZdZdZdZdZdZd„ Zddddœddddœddddœddddœd d!d"dœd#d$d%dœgZeD � ci c]  } | d&   | “Œ
 c} Z d'd(g d)¢fd*d+g d,¢fd-d.g d/¢fd0d1g d2¢fd3d4g d5¢fd6d7g d8¢fd9d:g d;¢fd<d=g d>¢fd?d@g dA¢fdBdCg dD¢fdEdFg dG¢fdHdIg dJ¢fdKdLg dM¢fdNdOg dP¢fgZ!e!D ���ci c]  \  }}}||||dQœ“Œ c}}}Z" e#dR„ e!D «       dS„ ¬T«      Z$g dU¢Z%dV„ Z&dW„ Z'dXdXdYœgZ(dZ„ Z)d[„ Z*d\Z+d]„ Z,d^„ Z-d_„ Z.d`„ Z/da„ Z0dbZ1da2dca3dd„ Z4 ejj                  de«      Z6df„ Z7dg„ Z8dh„ Z9�d:dk„Z:dl„ Z;�d;dn„Z<do„ Z=�d;dp„Z>dq„ Z?�d;dr„Z@ds„ ZAdt„ ZBdu„ ZC�d<dw„ZDh dx£ZEdyZFdzZG�d=d|„ZHd}ZId~„ ZJ eJ«         e'«         ejj                  d«      ZK ejj                  d€ej˜                  ejš                  z  «      ZN ejj                  d�ej˜                  ejš                  z  «      ZO ejj                  d‚ejš                  «      ZP ejj                  dƒej˜                  «      ZQ ejj                  d„ej˜                  «      ZRd…„ ZSd†ZT ejj                  d‡eTz   dˆz   «      ZU ejj                  d‰«      ZV ejj                  dŠ«      ZW ejj                  d‹«      ZX ejj                  dŒ«      ZY ejj                  d�«      ZZ ejj                  dŽ«      Z[ ejj                  d�«      Z\ ejj                  d�«      Z] ejj                  d‘«      Z^ ejj                  d’«      Z_d“„ Z`d”„ Zad•„ Zb ejj                  d–«      Zc edh d—£«      Ze ejj                  d˜«      Zf ejj                  d™«      ZgdšZh�d>d›„Zi�d>dœ„Zj ejj                  d�«      Zk ejj                  dž«      ZldŸ„ Zd Zmd¡Zn�d?d£„ZoddlpZpdidvd¤d¥d¦d§d¨œZqd©„ Zrdª„ Zsd«Ztd¬Zud­Zvd®Zwd¯„ Zx�d>d°„Zy	 	 �d@d±„Zz�dAd²„Z{d³Z|d´Z}�dBdµ„Z~d¶„ Zd·„ Z€�dCd¸„Z��dDd¹„Z‚dºd»d¼d¼d½d¾d¿œdÀdÁd¼d{d½dÂd¿œdÃdÄd¼d{d½dÅd¿œdÆdÇd{d{dÈdÉd¿œdÊœZƒ�dDdË„Z„dÌ„ Z…dÍ„ Z†dÎ„ Z‡�dEdÏ„ZˆdÐ„ Z‰dÑ„ ZŠdÒ„ Z‹	 	 �dFdÓ„ZŒ	 	 �d@dÔ„Z�dÕ„ ZŽ�dAdÖ„Z�d×„ Z�dØ„ Z‘dÙ„ Z’d¢Z“d¢Z”ddlZ•ddlZ–ddl	Z—ddl˜Z™ddlšZ›dÚZœdÛZ�dÜZži ZŸdjdÝdÞdßdàœdádâdãdßdàœdädådædçdàœdèdédêdëdàœdìdídîdïdàœdðdñdòdódàœdôdõdöd÷dàœdødùdúdûdàœgZ dü„ Z¡dý„ Z¢dþ„ Z£dÿ„ Z¤�d Z¥�d„ Z¦�d„ Z§�d„ Z¨�d„ Z©�dG�d„Zª�d„ Z«�d„ Z¬�d„ Z­�d	Z®�dH�d
„Z¯�d„ Z°�d„ Z±�d„ Z²�dH�d„Z³�d„ Z´�dZµ�d„ Z¶�d„ Z·�dZ¸ G �d„ �de�jr                  �jt                  «      Z»ddl	Z	ddlZddlZddl¼Z¼ddlZ�dZ½dZ¾�dZ¿�dZÀ�dZÁd<d=�d�dœd0d1�d�dœd3d4�d�dœd-d.�d�dœd*d+�d�dœd9d:�d �dœd6d7�d!�dœdHdI�d"�dœd?d@�d#�dœdBdC�d$�dœdEdF�d%�dœdKdL�d&�dœdNdO�d'�dœd'd(�d(�dœgZÂ�d)„ ZÃeÂD �cg c]  }|d&   ‘Œ	 c}ZÄeÂD �ci c]  }|d&   |�d*   “Œ c}ZÅ�d+„ ZÆi ZÇi ZÈ�d,„ ZÉ�d-„ ZÊ�d.„ ZË�d/„ ZÌ�dI�d0„ZÍ�d1„ ZÎ	 	 �dJ�d2„ZÏ�d3„ ZÐ�d4„ ZÑ�d5ZÒdmZÓ�d6„ ZÔ�d7„ ZÕeÖ�d8k(  r1e�jr                  �j¯                  �d9efe»«      �j±                  «        yyc c} w c c}}}w c c}w c c}w (K  uh   

ç»Ÿä¸€æ�œç´¢æœ�åŠ¡ï¼ˆç«¯å�£8000ï¼‰

é›†æˆ�ï¼šgov FTS5æ�œç´¢ + ä¸­é¡¹ç½‘/ä¸­èƒ½è�”å�ˆ/ä¸­ç­–å¤§æ•°æ�®

é    Nc                 ó@   — t        t        j                  d| «      «      S )Nz[\u4e00-\u9fff\u3400-\u4dbf])ÚboolÚreÚsearch©Útexts    ú/root/gov_crawler/search_app.pyÚcontains_chineser
      s   € Ü”—	‘	Ð9¸4Ó@ÓAÐAó    ú/root/search.dbz/root/ccpc.dbz/root/contact.db>   õ	   ä¸šä¸»æ–¹ÚrefÚownerõ   ä¸šä¸»õ   ä¸šä¸»å�•ä½�r   õ	   è®¾è®¡é™¢u   æ–½å·¥å�•ä½�)r   ÚdesignÚ
contractorc                 ót  — | xs dj                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}g }|D ][  }t        j                  |j	                  «       |«      }|t
        v s|j	                  «       t
        v rŒF||vsŒK|j                  |«       Œ] dj                  |«      S c c}w )NÚ z / )ÚsplitÚstripÚCONTACT_ROLE_ALIASÚgetÚlowerÚCONTACT_TEMPLATE_ROLESÚappendÚjoin)ÚrawÚpÚpartsÚoutÚvs        r	   Úcontact_role_displayr$   $   s    € Ø!$¢¨× 1Ñ 1°%Ó 8ÖF˜1¸A¿G¹G½IˆQ�W‰W�YÐF€EÐFØ
€CØò ˆÜ×"Ñ" 1§7¡7£9¨aÓ0ˆØÔ&Ñ&¨!¯'©'«)Ô7MÑ*MØØ�CŠ<Ø�J‰J�q�Mðð �:‰:�c‹?Ðùò Gs
   ˜B5®B5z/home/ccbuild/znlh.dbz/root/ZC.dbz/root/eia.dbz/root/data.csvi@  c                 óæ   — | syt        j                  d| «      }|r|j                  d«      j                  «       S t        j                  d| «      }|r|j                  d«      j                  «       S y)Nú-u_   [æ€»]?æŠ•èµ„[é¢�é‡‘]?[ï¼š:ä¸º]?\s*[çº¦]?\s*[\d,.]+\s*[ä¸‡äº¿å�ƒç™¾å��ä¸‡å�ƒç™¾å…ƒç¾Ž]?[å…ƒç¾Ž]?r   u   æŠ•èµ„.{0,6}?[\d,.]+[ä¸‡äº¿]?)r   r   Úgroupr   )r   Úms     r	   Úextract_investmentr)   ;   s_   € á˜ä
�	‰	ÐtÐvzÓ{€Aá�—‘˜“×!Ñ!Ó#Ð
#ä
�	‰	Ð2°DÓ9€Aá�—‘˜“×!Ñ!Ó#Ð
#àr   Úeiau   çŽ¯è¯„é˜¶æ®µuŽ   çŽ¯è¯„ OR çŽ¯å¢ƒå½±å“�è¯„ä»· OR çŽ¯å¢ƒå½±å“�æŠ¥å‘Š OR çŽ¯å¢ƒå½±å“�ç™»è®° OR ç¬¬ä¸€æ¬¡å…¬ç¤º OR ç¬¬äºŒæ¬¡å…¬ç¤º OR å¾�æ±‚æ„�è§� OR å…¬ä¼—å�‚ä¸Ž)ÚidÚlabelÚkeywordsÚapprovalu   å®¡æ‰¹æŠ¥æ‰¹u^   å®¡æ‰¹ OR æŠ¥æ‰¹ OR æ‰¹å¤� OR æ ¸å‡† OR å¤‡æ¡ˆ OR è¡Œæ”¿è®¸å�¯ OR å®¡æŸ¥æ„�è§� OR å�Œæ„�å»ºè®¾Úbiddingu   æ‹›æ ‡é‡‡è´­ux   æ‹›æ ‡ OR ä¸­æ ‡ OR é‡‡è´­ OR æ¯”é€‰ OR é‚€æ ‡ OR ç«žæ ‡ OR ç«žäº‰æ€§è°ˆåˆ¤ OR è¯¢ä»· OR æ‹›æ ‡å…¬å‘Š OR ä¸­æ ‡å€™é€‰äººÚ
acceptanceu   ç«£å·¥éªŒæ”¶uW   éªŒæ”¶ OR ç«£å·¥ OR è¯•è¿�è¡Œ OR æŠ•äº§ OR è°ƒè¯• OR çŽ¯å¢ƒä¿�æŠ¤éªŒæ”¶ OR ç«£å·¥éªŒæ”¶Úplanningu   è§„åˆ’è®¾è®¡ug   è§„åˆ’ OR è®¾è®¡ OR å�¯è¡Œæ€§ç ”ç©¶ OR å�¯ç ” OR é€‰å�€ OR ç”¨åœ°é¢„å®¡ OR æ–¹æ¡ˆè®¾è®¡ OR åˆ�æ­¥è®¾è®¡Úsecurityu   å®‰å…¨è¯„ä»·uo   å®‰å…¨è¯„ä»· OR å®‰å…¨è®¾æ–½ OR å®‰å…¨éªŒæ”¶ OR å®‰å…¨é¢„è¯„ä»· OR å®‰å…¨ä¸“ç¯‡ OR å®‰å…¨ç”Ÿäº§ OR é£Žé™©è¯„ä¼°r+   Úpharmau   åˆ¶è�¯ä¸Žç”Ÿç‰©æŠ€æœ¯)3ÚAPIsÚAPIÚGMPÚcGMPu   ç–«è‹—u   ç”Ÿç‰©åˆ¶å“�u	   å¹²ç»†èƒžu   æŠ—ä½“u   åŸºå› u   è¯Šæ–­è¯•å‰‚u   åŒ»ç–—å™¨æ¢°u   è�¯å“�u   åˆ¶è�¯õ   åŒ»è�¯u   è�¯ä¸šr8   u   èƒ¶åŽŸè›‹ç™½u	   å�•å…‹éš†u   è¡€æµ†u	   èƒ°å²›ç´ u	   é€ å½±å‰‚u	   ç¼�å�ˆçº¿u   å¯¼ç®¡u	   å†…çª¥é•œu	   èµ·æ��å™¨u   é€�æž�u   ç¥žç»�å¤–ç§‘u   ç‰‡å‰‚u   ä¸¸å‰‚u   èƒ¶å›Šu   è½¯è†�u	   æ³¨å°„å‰‚u	   æ³¨å°„å™¨u	   å�£æœ�æ¶²u   è¾…æ–™ÚCDMOu   å¤šè‚½u   åŽŸè�¯u   æ¯�è�¯u	   åŽŸæ–™è�¯u   å…½è�¯u   åˆ¶å‰‚u	   ä¸­æˆ�è�¯u   ç”Ÿç‰©åŒ»è�¯u   åˆ¶è�¯é¡¹ç›®u   åŒ»è�¯ä¸­é—´ä½“u   åŽŸæ–™è�¯å�Šu   è�¯åŽ‚u	   åˆ¶è�¯åŽ‚u   åŒ»è�¯äº§ä¸šå›­u   è�¯ç”¨Ú
productionu   ç”Ÿäº§/å¼€é‡‡)u   æ²¹ç”°u   æ°”ç”°u   é‡‡æ²¹u   é‡‡æ°”u   é’»äº•u	   é¡µå²©æ°”u   æµ·ä¸Šå¹³å�°u   é…¸æ°”å¤„ç�†u   å¤©ç„¶æ°”å¤„ç�†ç«™u   å¤©ç„¶æ°”é›†æ°”ç«™u   å¤©ç„¶æ°”ç”Ÿäº§å¹³å�°u   ç…¤å±‚æ°”ç”Ÿäº§å¹³å�°Útransmissionu   ç®¡é�“è¾“é€�)u   ç®¡é�“u   è¾“æ°”u   è¾“æ²¹u   é—¨ç«™u	   è®¡é‡�ç«™u	   åŽ‹æ°”ç«™u   é˜€å®¤u   è£…å�¸ç«™å�Šä¸“ç”¨é“�è·¯Ú	terminalsu   ç»ˆç«¯/æŽ¥æ”¶ç«™)u	   æŽ¥æ”¶ç«™u	   LNGç»ˆç«¯ÚLNGu   å¤©ç„¶æ°”ç»ˆç«¯u   å¤©ç„¶æ°”å‚¨å­˜ç»ˆç«¯u   æ²¹åº“u   ç½�åŒºu   åŽŸæ²¹å‚¨ç½�u   æˆ�å“�æ²¹ç½�u   å‚¨è¿�u   æˆ�å“�æ²¹ä»“å‚¨ç �å¤´u	   ç”µç…¤æ¸¯u	   ç…¤ç‚­æ¸¯u   æ²¹å“�ç �å¤´u   åŽŸæ²¹ç �å¤´u   æˆ�å“�æ²¹ç �å¤´u	   LNGç �å¤´u   æ¶²åŒ–å¤©ç„¶æ°”ç �å¤´u   å¤©ç„¶æ°”ç �å¤´u   æ²¹æ°”ç �å¤´u   æ¶²ä½“åŒ–å·¥ç �å¤´u	   åŠ æ²¹ç«™u	   åŠ æ°”ç«™u   åŠ æ²¹ç«™æ‰©å»ºu   æˆ�å“�æ²¹é”€å”®u   ç‡ƒæ°”å…¬å�¸u   ç‡ƒæ°”ä¾›åº”u   æ¶²åŒ–æ°”ç«™u	   å……ç”µç«™u	   æ�¢ç”µç«™Úportu   æ¸¯å�£ç �å¤´)u   æ¸¯å�£u   ç �å¤´u   æ³Šä½�u   æ¸¯åŒºu   æ¸¯åŠ¡u	   é›†è£…ç®±u   æ•£è´§u	   ä»¶æ�‚è´§u   å®¢æ»šu   è½®æ¸¡u   èˆªè¿�u   ç–�æµšu   èˆªé�“u   èˆ¹é—¸u   å¼•èˆªu   æ¸¡å�£u   è£…å�¸Úhpiu   çŸ³æ²¹ç‚¼åˆ¶)u   ç‚¼åŒ–ä¸€ä½“u   ç‚¼åŒ–u   ç‚¼æ²¹u   ç‚¼åŽ‚u	   çŸ³è„‘æ²¹u   å‚¬åŒ–è£‚åŒ–u   åŠ æ°¢è£‚åŒ–ÚFCCÚaltfuelu   æ›¿ä»£ç‡ƒæ–™)u   ç”Ÿç‰©æŸ´æ²¹u   ç”Ÿç‰©ä¹™é†‡u   å�¯æŒ�ç»­èˆªç©ºç‡ƒæ–™u   æ²¼æ°”u   ç‡ƒæ–™ç”µæ± u   ä¹™é†‡ç‡ƒæ–™u   ç”²é†‡ç‡ƒæ–™ÚSAFu   ç”Ÿç‰©è´¨é¢—ç²’u   ç”Ÿç‰©è´¨ç‡ƒæ–™u   ç”Ÿç‰©è´¨æˆ�åž‹u   ç”Ÿç‰©è´¨èƒ½u   ç”Ÿç‰©è´¨æ°”åŒ–Úpoweru   ç”µåŠ›)u   å�‘ç”µu   ç”µç«™u   å…‰ä¼�u   é£Žç”µu	   å¤ªé˜³èƒ½u   å‚¨èƒ½ÚBESSÚCAESÚCSPu	   å�˜ç”µç«™u	   å�˜ç”µæ‰€u	   è¾“å�˜ç”µu   è¾“ç”µu   ç”µç½‘u   æ ¸ç”µu	   æ°´ç”µç«™u   æŠ½æ°´è“„èƒ½u   åŽ‹ç¼©ç©ºæ°”å‚¨èƒ½u   ç…¤ç”µu   ä¾›çƒ­u   ç”Ÿç‰©è´¨å�‘ç”µu   ç”Ÿç‰©è´¨é”…ç‚‰u   ç”Ÿç‰©è´¨çƒ­ç”µÚmetalsõ   é‡‘å±žä¸ŽçŸ¿ç‰©)HrH   u   æœ‰è‰²é‡‘å±žu   ç¨€åœŸu   ç¨€æœ‰é‡‘å±žu	   ä¸�é”ˆé’¢u   é’¢é“�u   å†¶é‡‘u   çŸ¿å±±u   é‡‡çŸ¿u   é€‰çŸ¿u   å°¾çŸ¿u   å†¶ç‚¼u   é’¢åŽ‚u   è½§é’¢u   ç‚¼é“�u   ç‚¼é’¢u	   é“�å�ˆé‡‘u	   é’¢é“�åŽ‚u   é‡‘çŸ¿u   é“�çŸ¿u   é“œçŸ¿u	   é“�åœŸçŸ¿u   ç£·çŸ¿u	   çŸ³å¢¨çŸ¿u   çŸ³å¢¨åŒ–ç”µæž�u   çŸ³å¢¨õ	   é’¢ç»“æž„u   çŸ³æ–™u   å¤šé‡‘å±žçŸ¿u   é”ŒçŸ¿u   é“…çŸ¿u   é•�çŸ¿u	   é•�å�ˆé‡‘u	   é“�å�ˆé‡‘u	   é’›å�ˆé‡‘u	   é“œå�ˆé‡‘u	   é”Œå�ˆé‡‘u	   è½»å�ˆé‡‘u   é“�æ�¿u   é“�ä¸šu   é“œä¸šu   é”Œä¸šu   é‡‘å±žu   çŸ¿ç‰©u   é“�u   é“œu   é”Œu   é“…u   é•�u   é”¡u   é’¨u   é’¼u   å�ˆé‡‘u   çŸ¿u   æ°´æ³¥u   é¢„æ‹Œæ··å‡�åœŸu   å»ºæ��u   çŸ³æ��u   ç“·ç –u	   çŸ³è†�æ�¿u   é˜²æ°´æ��æ–™u   ä¿�æ¸©æ��æ–™u   è€�ç�«æ��æ–™u	   é©¬å�£é“�u	   æ˜“æ‹‰ç½�u	   æ··å‡�åœŸu   ç ‚æµ†u   å•†ç ¼u   æ²¥é�’æ··å‡�åœŸu   æ°´æ³¥åˆ¶å“�u	   æ�…æ‹Œç«™u   é¢„æ‹Œç ‚æµ†Úpulpu   åˆ¶æµ†/é€ çº¸/æœ¨æ��)u   çº¸æµ†u   é€ çº¸u   çº¸æ�¿u   æœ¨æ��u   æœ¨ä¸šu	   äººé€ æ�¿u   ç“¦æ¥žu	   åˆ¨èŠ±æ�¿u	   èƒ¶å�ˆæ�¿u   çº¸åŽ‚u	   å�°åˆ·å“�u   å�°åˆ·åŒ…è£…u	   çº¸åŒ…è£…Úfoodu   é£Ÿå“�ä¸Žé¥®æ–™)1u   é£Ÿå“�u   é¥®æ–™u   è‚‰ç±»u   å± å®°u   ä¹³u   ç‰›å¥¶u   æžœæ±�u   å•¤é…’u   è°ƒå‘³u   é�¢åŒ…u	   è±†åˆ¶å“�u	   é£Ÿç”¨æ²¹u   é¥²æ–™u   ç³–u   æ·€ç²‰u   é…±æ²¹u   é…µæ¯�u   èŒ¶u   å’–å•¡u   æ°´äº§u   ç¦½u   ç•œu   ç¢¾ç±³u   é…’åŽ‚u   çƒˆé…’u   æ¤�ç‰©äº§å“�u	   ç“¶è£…æ°´u	   çŸ¿æ³‰æ°´u   çƒ˜ç„™u   èŠ±ç”ŸåŠ å·¥u   é¸¡è›‹åŠ å·¥u   é±¼ç‰‡u   é¦™æ–™u   å…»æ®–u   ç”ŸçŒªu   è›‹é¸¡u   è‚‰é¸­u   è‚‰é¸¡u   æ°´äº§å…»æ®–u   é…¿é…’u   ç™½é…’u	   å•¤é…’åŽ‚u   é…±u	   é¢„åˆ¶è�œu   æžœå¹²u	   æžœæ±�åŽ‚u   è‚‰ç±»åŠ å·¥u	   å± å®°åœºu	   é¥²æ–™åŽ‚Úcpiu   åŒ–å·¥åŠ å·¥)ku   åºŸçŸ¿ç‰©æ²¹u   åŒ–å·¥u	   åŒ–å­¦å“�u   æ ‘è„‚u	   è�šå�ˆç‰©u	   è�šä¹™çƒ¯u	   è�šä¸™çƒ¯ÚPVCÚPETÚPTAÚABSÚEVAÚHDPEÚLDPEu   PEç®¡ÚPPRu   å¡‘æ–™u   æ©¡èƒ¶u   æ¶‚æ–™u   æŸ“æ–™u   è‚¥æ–™u   å†œè�¯u   æº¶å‰‚u	   å‚¬åŒ–å‰‚u   é…¸u   é…¯u   é†‡u   ç¡«é…¸u   ç›�é…¸u	   æ°¢æ°§åŒ–u	   æ°§åŒ–ç‰©u   ä¸™çƒ¯u   ä¹™çƒ¯u   è‹¯u   é…®u   é†šu   èƒºu   çƒ¯u   ç¡…u   æ°Ÿu   æ°¯u   æº´u   ç¢˜u	   ç²˜å�ˆå‰‚u	   æ·»åŠ å‰‚u	   é˜»ç‡ƒå‰‚u   è¡¨é�¢æ´»æ€§å‰‚u   ç²¾ç»†åŒ–å­¦å“�u   æ°´å¤„ç�†å‰‚u	   å¤�å�ˆè‚¥u	   æ°´æº¶è‚¥u   é¢œæ–™u	   æ´—æ¶¤å‰‚u	   å¢žå¡‘å‰‚u	   æ´»æ€§ç‚­u   é«˜çº¯åº¦åŒ–å­¦å“�u   æ¹¿åŒ–å­¦å“�u   è¿‡æ°§åŒ–æ°¢u   ç”²é†›u   ç”²é†‡u   æ°¨u   æ°§æ°”u   ç©ºæ°”åˆ†ç¦»u   çƒ§ç¢±u   åŒ–å­¦è¯•å‰‚u   åŒ–å­¦ä¸­é—´ä½“u   ç‚­é»‘u	   æ°”å‡�èƒ¶u	   è„±ç¡«å‰‚u   çººç»‡åŠ©å‰‚u   çº¤ç»´ç´ çº¤ç»´u   ç´«å¤–çº¿å�¸æ”¶å‰‚u	   ç”µè§£è´¨u	   æ�€è�Œå‰‚u	   æ�€è™«å‰‚u	   é™¤è�‰å‰‚u	   åˆ¶å†·å‰‚u	   å‡�æ°´å‰‚u   ä¹™ç‚”u   å�Œé…šu   èŽ±èµ›å°”çº¤ç»´u   è„‚è‚ªu   ç‚”u   è…ˆu   é…�u   é†›u   é…šu   æ°¢èƒ½u   ç»¿æ°¢u   æ°¢æ°”u   ç”µè§£æ°´åˆ¶æ°¢u   ç”µè§£åˆ¶æ°¢u   æ°´ç”µè§£åˆ¶æ°¢u   åˆ¶æ°¢u   æ°ŸåŒ–çŸ³å¢¨u   å…¨æ°Ÿè�šé†šu   æ°ŸåŒ–æ”¹æ€§u   é«˜çº¯æ°Ÿæ°”u	   è½¯åŒ…è£…u	   å¤�å�ˆè†œu   æ¤�ç‰©ä¿�æŠ¤u   ç§�å­�å¤„ç�†å‰‚u   å†œè�¯åˆ¶å‰‚u   å†œè�¯ä¸­é—´ä½“u   æ¤�ç‰©è›‹ç™½u   ç”Ÿç‰©å†œè�¯u   å†œè�¯åŽŸè�¯Ú	logisticsõ   ç‰©æµ�)rV   u   ç‰©æµ�ä¸­å¿ƒu	   ç‰©æµ�å›­u   ä»“å‚¨ç‰©æµ�u   ä¿�ç¨Žç‰©æµ�u   å†·é“¾ç‰©æµ�u   å¿«é€’åˆ†æ‹¨Úmanufacturingu   å·¥ä¸šåˆ¶é€ )?u   å»ºç­‘ç”¨ç ‚u   åˆ¶é€ u   è®¾å¤‡u   æœºæ¢°u	   é›¶éƒ¨ä»¶u   ç”µå­�u   æ±½è½¦u	   å�Šå¯¼ä½“u   ç”µæ± u   å®¶ç”µu   ä»ªå™¨u   é…�ä»¶u   æ³µu	   åŽ‹ç¼©æœºu   é˜€é—¨u   è½´æ‰¿u	   ä¼ æ„Ÿå™¨u	   æ˜¾ç¤ºå±�u   å�°åˆ·ç”µè·¯æ�¿u   å�°åˆ·çº¿è·¯æ�¿u	   è¿žæŽ¥å™¨u	   å�˜åŽ‹å™¨u	   æ— äººæœºu   æ¨¡å…·u   æ™¶åœ†u   æ•°æŽ§æœºåºŠu   é€ èˆ¹u	   èµ·é‡�æœºõ   ç©ºè°ƒu	   è§¦æ‘¸å±�u   èŠ¯ç‰‡u	   æœºå™¨äººu   é›·è¾¾u   é›†æˆ�ç”µè·¯u	   å…‰åˆ»èƒ¶u   ç”µæœºu   é”…ç‚‰u	   è¿‡æ»¤å™¨u   èˆ¹åŽ‚u   æœºåºŠu	   ç´§å›ºä»¶u   é£Žæœºu   é£žæœºu   æ•°æ�®ä¸­å¿ƒu   å®¶å…·u   åŒ…è£…u   ç”µç¼†u   ç”µçº¿ç”µç¼†u   ç‰¹ç§�ç”µç¼†u   é�¢æ–™u   æŸ“æ•´u   ç»‡é€ u   é’ˆç»‡u   æ¢­ç»‡u   åˆ¶éž‹u   éž‹u   æ ‡ç­¾u	   ä¸�å¹²èƒ¶u   äº”é‡‘u   äº”é‡‘åˆ¶å“�õ   åˆ¶å“�u   ç”µå­�å…ƒä»¶u   å…‰å­¦)r+   r,   Úkwc              #   ój   K  — | ]+  \  }}}|D ]   }t        |«      ||j                  «       f–— Œ" Œ- y ­w©N)Úlenr   )Ú.0Úind_idr,   ÚkwsrZ   s        r	   ú	<genexpr>ra   v   s7   è ø€ ÒZÑ'9 v¨u°cÐVYÒZÐPR„cˆ"ƒgˆv�r—x‘x“zÔ"ÐZÐ"ÑZùs   ‚13c                 ó   — | d    S ©Nr   © ©Úxs    r	   ú<lambda>rg   w   s   € �1�Q‘4�%€ r   ©Úkey)u   åŒ»ä¿�u   è�¯åº—u   åŒ»è�¯æœºæž„u   å®šç‚¹é›¶å”®u   é›¶å”®è�¯åº—u   åŒ»ä¿�æœ�åŠ¡å��è®®u   åŒ»ä¿�å®šç‚¹u   é›†é‡‡è�¯å“�é”€å”®u   è�¯å“�ç»�è�¥u   è�¯å“�ä»·æ ¼u   é—¨è¯Šæ…¢æ€§ç—…u   åŒ»ç–—ä¿�éšœu   åŒ»ä¿�ç›®å½•u   è�¯å¸ˆu   æ‰§ä¸šè�¯å¸ˆc           
      ó¸  ‡— | sy| j                  «       Št        D ]  }|j                  «       ‰v sŒ y d‰v sd‰v r"‰j                  dd«      j                  dd«      Šd‰v rZt        D ����cg c]0  \  }}}|D ]%  }|j	                  d«      sŒt        |«      dk\  sŒ$|‘Œ' Œ2 }}}}}t        ˆfd„|D «       «      syt        D ]  \  }}}|‰v sŒ|c S  yc c}}}}w )	u¶   ä»…ç”¨æ ‡é¢˜å�šä¸€çº§è¡Œä¸šåˆ†ç±»ï¼Œè¿”å›žè¡Œä¸š idã€‚æœ€é•¿å…³é”®è¯�ä¼˜å…ˆï¼ˆç”¨æˆ·ä½“ç³»ï¼‰ã€‚
    å°�å†™åŒ¹é…�ï¼šè‹±æ–‡å…³é”®è¯�å¤§å°�å†™ä¸�æ•�æ„Ÿï¼ˆBESS/bess/Bess å�‡å‘½ä¸­ï¼‰ã€‚Úotheru   é“œæ¢�u   é“œä»�õ   Â·rY   é   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr\   rd   )r^   rZ   Úts     €r	   ra   z$classify_industry.<locals>.<genexpr>�   s   øè ø€ Ò4˜r�2˜”7Ñ4ùó   ƒrW   )r   ÚADMIN_EXCLUDEÚreplaceÚINDUSTRY_RULESÚendswithr]   ÚanyÚCLASSIFY_PAIRS)ÚtitlerZ   r_   r,   r`   Úexisting_goodsÚ_lenro   s          @r	   Úclassify_industryrz   �   sí   ø€ ñ ˜Ø�‰‹€Aäò ˆØ�8‰8‹:˜Š?Ùðð �1�}˜ A™Ø�I‰I�h Ó%×-Ñ-¨h¸Ó=ˆà�1�}Ü7E×~Ñ~Ñ!3 ¨°ÐPSÒ~È"ÐWY×WbÑWbÐckÕWlÔqtÐuwÓqxÐ|}Óq}š"Ð~˜"Ð~ˆÓ~ÜÓ4 ^Ô4Ô4Ø"Ü*ò Ñˆˆf�bØ�Š7ØŠMðð ùõ s   Á-C
ÂC
ÂC
c                  ó¼   — 	 t        j                  t        d¬«      } | j                  d«       | j	                  «        | j                  «        y# t        $ r Y yw xY w)u(   å�¯åŠ¨æ—¶ç¡®ä¿� gov_raw æœ‰ industry åˆ—é
   ©Útimeoutz<ALTER TABLE gov_raw ADD COLUMN industry TEXT DEFAULT 'other'N)Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcommitÚcloseÚ	Exception©Úconns    r	   Úensure_industry_columnrˆ   —   sH   € ðÜ�‰œw°Ô3ˆØ�‰ÐSÔTØ�‰ŒØ�
‰
�øÜò Ùðús   ‚AA Á	AÁAõ   èµ„æº�ç½‘ç«™)r+   r,   c                 óž   — | €yt        | «      j                  dd«      j                  dd«      j                  dd«      j                  dd	«      S )
Nr   ú&z&amp;ú<z&lt;ú>z&gt;ú"ú&quot;)Ústrrr   ©Úss    r	   Úescr“   «   sG   € à€y˜äˆq‹6�>‰>˜#˜gÓ&×.Ñ.¨s°6Ó:×BÑBÀ3ÀvÓN×VÑVÐWZÐ[cÓdÐdr   c                 óf   — | syt        j                  dd| «      } t        j                  | dg¬«      S )zNRender Markdown, ensuring blank lines before tables for proper table detectionr   z)(?<!\n\n)(\n)([^\n]* \| [^\n]*\n)(--- \|)z\n\n\2\3Úextra)Ú
extensions)r   ÚsubÚmarkdownr   s    r	   Ú	render_mdr™   ±   s/   € á˜ä�6‰6Ð>ÀÈTÓR€DÜ×Ñ˜T¨w¨iÔ8Ð8r   uJ  *{margin:0;padding:0;box-sizing:border-box}

body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei",sans-serif;background:#fff;color:#202124;min-height:100vh}

a{color:#1a0dab;text-decoration:none}

a:visited{color:#609}

a:hover{text-decoration:underline}

.container{max-width:1000px;margin:0 auto;padding:14px 20px 56px}

.date-chip{display:inline-block;padding:3px 12px;border:1px solid #dadce0;border-radius:14px;font-size:13px;color:#1a73e8;text-decoration:none;cursor:pointer;background:#fff}
.date-chip:hover{background:#e8f0fe;border-color:#1a73e8;text-decoration:none}
.date-chip.act{background:#1a73e8;color:#fff;border-color:#1a73e8;font-weight:500}

.home-wrap{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:75vh;text-align:center}

.home-logo{font-size:48px;font-weight:700;color:#1a73e8;letter-spacing:-1px;margin-bottom:4px}

.home-sub{font-size:14px;color:#5f6368;margin-bottom:28px}

.home-search{width:100%;max-width:584px;margin:0 auto 24px}

.home-search .search-box input{border-radius:28px;padding:14px 20px;font-size:16px;box-shadow:0 1px 6px rgba(32,33,36,.08)}

.home-search .search-box input:focus{box-shadow:0 1px 8px rgba(32,33,36,.16)}

.home-btns{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;margin-bottom:20px}

.home-btns a{display:inline-flex;align-items:center;gap:6px;padding:8px 20px;background:#f8f9fa;border:1px solid #dadce0;border-radius:24px;font-size:14px;color:#3c4043;transition:all .15s}

.home-btns a:hover{background:#e8f0fe;border-color:#1a73e8;color:#1a73e8;text-decoration:none}

.home-count{font-size:13px;color:#70757a;margin-top:4px}

.nav{display:flex;align-items:center;gap:16px;padding:12px 0;border-bottom:1px solid #ebebeb;margin-bottom:16px}

.nav-logo{font-size:18px;font-weight:700;color:#1a73e8;white-space:nowrap;flex-shrink:0}

.nav-links{display:flex;gap:4px;flex-wrap:wrap}

.nav-links a{font-size:13px;color:#5f6368;padding:4px 10px;border-radius:16px;transition:background .15s}

.nav-links a:hover{background:#f0f0f0;text-decoration:none;color:#1a73e8}

.nav-links a.act{background:#e8f0fe;color:#1a73e8;font-weight:500}

/* .nav-right å¯¼èˆªç°‡æ ·å¼�ç”± nav_right_html() è‡ªå¸¦ï¼ˆè‡ªåŒ…å�« <style>ï¼‰ï¼Œæ­¤å¤„ä¸�å†�é‡�å¤�å®šä¹‰ */

.topbar{display:flex;align-items:center;padding:12px 0 0}

.search-section{margin-bottom:12px}

.search-box{display:flex;gap:0}

.search-box input{flex:1;padding:12px 20px;border:1px solid #dfe1e5;border-radius:24px 0 0 24px;font-size:16px;outline:none;box-shadow:0 1px 6px rgba(32,33,36,.08)}

.search-box input:focus,.search-box input:hover{border-color:#1a73e8;box-shadow:0 1px 8px rgba(32,33,36,.16)}

.search-box button{padding:12px 24px;background:#1a73e8;color:#fff;border:none;border-radius:0 24px 24px 0;font-size:15px;cursor:pointer}

.search-box button:hover{background:#1557b0}

.toolbar{margin-bottom:10px}

.controls{display:flex;justify-content:space-between;align-items:center}

.total-count{font-size:14px;color:#70757a}

.db-tabs{display:flex;gap:6px;margin-bottom:12px;flex-wrap:wrap}

.db-tabs a{font-size:13px;color:#5f6368;padding:5px 14px;border:1px solid #dadce0;border-radius:16px;transition:all .15s}

.db-tabs a:hover{background:#e8f0fe;text-decoration:none;border-color:#1a73e8;color:#1a73e8}

.db-tabs a.act{background:#1a73e8;color:#fff;border-color:#1a73e8}

.results{max-width:100%;margin:0 auto}.result-item{display:flex;gap:10px;padding:12px 0;border-bottom:1px solid #f0f0f0;transition:background .1s}

.result-item:hover{background:#f8f9fa;margin:0 -10px;padding:12px 10px;border-radius:4px}

.result-item .num{font-size:13px;color:#70757a;min-width:26px;text-align:right;flex-shrink:0;padding-top:2px}

.result-item h3{font-size:16px;font-weight:400;line-height:1.3;margin-bottom:2px}

.result-item h3 a{color:#1a0dab}

.meta{font-size:12px;color:#70757a;display:flex;gap:8px;flex-wrap:wrap;align-items:center}

.bdg{display:inline-block;padding:1px 6px;border-radius:3px;font-size:11px;font-weight:500}

.bdg-crawler{background:#e8f5e9;color:#2e7d32}

.bdg-zc{background:#fef3e2;color:#e65100}

.bdg-other{background:#f3e8fd;color:#7b1fa2}

.orig-id{display:inline-block;padding:1px 6px;border-radius:3px;font-size:11px;font-weight:600;background:#fff3e0;color:#e65100;cursor:help}
.orig-id.comp{background:#f3e8fd;color:#7b1fa2;font-weight:500}

.summary{font-size:14px;color:#4d5156;line-height:1.58;margin-top:2px}

.no-results{text-align:center;padding:60px 0;color:#70757a;font-size:14px}

.time-select{padding:5px 12px;font-size:13px;color:#3c4043;border:1px solid #dadce0;border-radius:16px;cursor:pointer;outline:none;background:#fff}

.time-select:hover{border-color:#bdc1c6}

.page-btn{display:inline-flex;align-items:center;justify-content:center;min-width:36px;height:36px;padding:0 12px;border-radius:4px;font-size:13px;color:#1a73e8;text-decoration:none}

.page-btn:hover{background:#f0f0f0;text-decoration:none}

.page-btn.act{background:#1a73e8;color:#fff}

.page-elp{color:#70757a;padding:0 4px;font-size:13px}

.page-jump{display:inline-flex;align-items:center;gap:4px;margin-left:6px;font-size:13px;color:#5f6368}

.page-jump input{width:48px;padding:6px 8px;border:1px solid #dadce0;border-radius:4px;font-size:13px;text-align:center;outline:none}

.page-jump input:focus{border-color:#1a73e8}

.detail-wrap{max-width:900px;margin:0 auto;padding:20px}

.detail-card{background:#fff;border-radius:12px;padding:24px;margin-bottom:16px;box-shadow:0 1px 3px rgba(0,0,0,.08)}

.detail-card h2{font-size:20px;margin-bottom:12px;color:#1a1a2e}

.detail-content{font-size:14px;line-height:1.8;color:#444;overflow-wrap:break-word;overflow-x:auto}

.detail-content p{margin:10px 0}

.detail-content table{border-collapse:collapse;width:100%;margin:12px 0;font-size:14px}

.detail-content td,.detail-content th{border:1px solid #ddd;padding:8px 12px}

.detail-content a{color:#1a73e8}

.detail-content img{max-width:100%;height:auto;border-radius:8px}

/* â”€â”€ 2026-09-11 ç§»åŠ¨ç«¯æ–­ç‚¹ï¼ˆé¦–é¡µ + æ�œç´¢ç»“æžœé¡µæ˜¯æœ¬ç«™å”¯ä¸€æ²¡æœ‰æ–­ç‚¹çš„é¡µé�¢ï¼‰â”€â”€
   ä¿®å¤�å®žæµ‹ç¼ºé™·ï¼š375px ä¸‹ .nav-rightï¼ˆ247px å®½ï¼‰é€ æˆ�æ¨ªå�‘æº¢å‡º 6pxã€�
   .nav-links a è¢«æŒ¤åˆ°é«˜ 80~98pxï¼ˆå¯¼èˆªæ–‡å­—é€�å­—æ�¢è¡Œï¼‰ã€‚ */
@media(max-width:760px){
.container{padding:10px 12px 40px}
.nav{flex-wrap:wrap;gap:8px;padding:8px 0;margin-bottom:12px}
.nav-logo{font-size:17px}
.nav-links{gap:2px;width:100%}
.nav-links a{font-size:12.5px;padding:5px 9px;white-space:nowrap;flex:0 0 auto}
.topbar{padding:8px 0 0}
h1{font-size:20px}
.home-logo{font-size:34px}
.home-sub{margin-bottom:20px}
.home-wrap{min-height:60vh}
.search-box input{font-size:16px;padding:12px 15px}
.search-box button{padding:12px 16px;font-size:14px}
.controls{flex-direction:column;align-items:flex-start;gap:8px}
.total-count{font-size:13px;line-height:1.6}
.date-bar{flex-wrap:wrap;gap:4px}
.date-chip{font-size:12px;padding:4px 9px}
.result-item{padding:10px 0}
.result-item .num{min-width:20px}
.result-item h3{font-size:15px}
.meta{font-size:11.5px;gap:6px}
.pagination{padding:12px 10px;gap:4px;margin:20px 0 44px}
.page-btn{min-width:34px;height:34px;padding:0 9px;font-size:12.5px}
.page-jump{margin-left:0}
.pager-bar{padding:10px 12px}
}

c           	      óÂ   ‡— t        j                  d| «      }g }|D ]@  Št        ‰«      dk(  rŒ|j                  ˆfd„t	        t        ‰«      dz
  «      D «       «       ŒB |S )uÓ   æ��å�– token çš„ä¸­æ–‡è¿žç»­æ®µçš„ 2-gram åˆ—è¡¨ï¼ˆæ ‡ç‚¹/æ•°å­—/å­—æ¯�ä½œä¸ºåˆ†éš”ç¬¦è·³è¿‡ï¼‰ã€‚
    è¿”å›žç©ºåˆ—è¡¨ = è¯¥ token æ— æœ‰æ•ˆä¸­æ–‡ gramï¼ˆå¦‚çº¯è‹±æ–‡/å�•å­—ä¸­æ–‡ï¼‰ï¼Œæ— æ³•ç”¨ bigram ç´¢å¼•ã€‚z[\u4e00-\u9fff]+é   c              3   ó.   •K  — | ]  }‰||d z    –— Œ y­w©é   Nrd   )r^   ÚiÚsegs     €r	   ra   ztoken_grams.<locals>.<genexpr>p  s   øè ø€ Ò? a�S˜˜1˜q™5”\Ñ?ùó   ƒ)r   Úfindallr]   ÚextendÚrange)ro   ÚsegsÚgramsr    s      @r	   Útoken_gramsr§   h  s`   ø€ ô �:‰:Ð)¨1Ó-€DØ€EØò @ˆÜˆs‹8�qŠ=ØØ�‰Ó?¬5´°S³¸A±Ó+>Ô?Õ?ð@ð €Lr   c                 ó  — | sg g fS t        | «      } | j                  «       j                  «       }g g }}|D ]G  }|j                  d«      r#t	        |«      dkD  r|j                  |dd «       Œ7|j                  |«       ŒI ||fS )uÒ   è§£æž� Google è¯­æ³•æŸ¥è¯¢ï¼š-keyword æŽ’é™¤ï¼ˆä»…å½“ - å‰�æœ‰ç©ºæ ¼/ç‹¬ç«‹æˆ�è¯�ï¼‰ï¼Œå…¶ä½™ä¸ºåŒ…å�«ã€‚
    æ ‡ç‚¹ï¼ˆ- : () ç­‰ï¼‰å‰�é�¢æ— ç©ºæ ¼æ—¶è§†ä¸ºå…³é”®è¯�çš„ä¸€éƒ¨åˆ†ï¼Œä¸�è§¦å�‘é«˜çº§æ�œç´¢è¯­æ³•ã€‚r&   r›   N)Únormalize_queryr   r   Ú
startswithr]   r   )Úqr!   ÚincÚexcr    s        r	   Úparse_google_queryr®   t  s‚   € ñ Ø�2ˆvˆÜ˜Ó€AØ�G‰G‹I�O‰OÓ€EØ�2ˆ€CØò ˆØ�<‰<˜Ô¤ Q£¨!¢Ø�J‰J�q˜˜�uÕà�J‰J�q�Mð	ð
 �ˆ8€Or   c                 óF  ‡— | s| S t        t        j                  j                  dd«      j                  dd«      j                  dd«      j                  dd«      dz   «      Šdj	                  ˆfd„| D «       «      }t        j                  dd	|«      j                  «       }|S )
u¸   Replace punctuation (Chinese + English) with spaces.
    ä¿�ç•™ - : ( ) ï¼ˆ ï¼‰ ä½œä¸ºå…³é”®è¯�ä¸€éƒ¨åˆ†ï¼ˆå‰�é�¢æ— ç©ºæ ¼æ—¶è§†ä¸ºæ™®é€šå­—ç¬¦ï¼Œé�¿å…� FTS é«˜çº§è¯­æ³•è¯¯è§¦å�‘ï¼‰ã€‚r&   r   ú:ú(ú)uG   ï¼Œã€‚ã€�ï¼›ï¼Ÿï¼�â€¦â€”Â·ï½žã€Œã€�ã€Žã€�ã€–ã€—ã€�ã€‘ã€”ã€•ã€ˆã€‰ã€Šã€‹c              3   ó.   •K  — | ]  }|‰v rd n|–— Œ y­w)ú Nrd   )r^   ÚcÚ	punct_sets     €r	   ra   z"normalize_query.<locals>.<genexpr>�  s   øè ø€ Ò=°a˜A ™N‘S°Ó1Ñ=ùr¡   ú\s+r´   )ÚsetÚstringÚpunctuationrr   r   r   r—   r   )r«   Úresultr¶   s     @r	   r©   r©   †  s•   ø€ ñ ØˆÜ”F×&Ñ&×.Ñ.¨s°BÓ7×?Ñ?ÀÀRÓH×PÑPÐQTÐVXÓY×aÑaÐbeÐgiÓjØ_ñ`ó a€Ià�W‰WÓ=¸1Ô=Ó=€FÜ�V‰V�F˜C Ó(×.Ñ.Ó0€FØ€Mr   c                 óœ   — | s| S t        | «      } t        j                  dd| «      } t        j                  dd| «      j                  «       } | S )u¹   Remove FTS5 special chars and replace punctuation with spaces.
    FTS5 ç‰¹æ®Šå­—ç¬¦: ( ) * ^ " [ ] . / - : éƒ½æ›¿æ�¢ä¸ºç©ºæ ¼ï¼Œé�¿å…�è¯­æ³•é”™è¯¯ï¼ˆno such column / syntax errorï¼‰ã€‚u   [()ï¼ˆï¼‰*^"\[\]./:\-]r´   r·   )r©   r   r—   r   )r«   s    r	   Úsanitize_fts_queryr½   ’  sI   € ñ ØˆÜ˜Ó€AÜ
�‰Ð(¨#¨qÓ1€AÜ
�‰ˆv�s˜AÓ×$Ñ$Ó&€AØ€Hr   c                  óª   — t        j                  t        d¬«      } t         j                  | _        | j                  d«       | j                  d«       | S )Nr|   r}   zPRAGMA busy_timeout=5000úPRAGMA journal_mode=WAL)r   r€   r�   ÚRowÚrow_factoryr‚   r†   s    r	   Úget_dbrÂ   ž  s=   € ä�?‰?œ7¨BÔ/€Dä—{‘{€DÔØ‡L�LÐ+Ô,à‡L�LÐ*Ô+à€Kr   ú/root/originals.dbg        c                 óÔ   — | sy| j                  «       } d| v r"| j                  d«      d   j                  «       } t        j                  dd| «      } t        j                  dd| «      } | S )uB   æ¸…æ´— originals æ ‡é¢˜: åŽ» tab å‰�ç¼€ / æ•°å­—å‰�ç¼€ / å°¾æ ‡ç‚¹r   ú	éÿÿÿÿz^\d{6,10}\s+õ   [ï¼Œã€‚ã€�ï¼›ï¼š\s]+$)r   r   r   r—   ©ro   s    r	   Ú_clean_otitlerÉ   ³  s_   € áØØ	�‰‹	€AØˆq�yØ�G‰G�D‹M˜"Ñ×#Ñ#Ó%ˆÜ
�‰ˆ  AÓ&€AÜ
�‰Ð'¨¨QÓ/€AØ€Hr   uJ   (é¡¹ç›®|å·¥ç¨‹|è£…ç½®|å¹´äº§|ä¸‡å�¨|æ‰©å»º|æŠ€æ”¹|æ–°å»º|ç”Ÿäº§çº¿|è½¦é—´)c                  ó¢  — 	 t         j                  j                  t        «      } t
        �| t        k(  rt
        S g g }}t        «       t        «       }}t         j                  j                  t        «      rþ	 t        j                  t        d¬«      }|j                  d«      j                  «       }|j                  «        |D ]­  \  }}t        |«      }	t        |	«      dk  rŒ t        |	«      dk\  r?t         j#                  |	«      r*|	|vsŒH|j%                  |	«       |j'                  |	|f«       Œmdt        |	«      cxk  rdk  sŒ‚n Œ…|	|vsŒŠ|j%                  |	«       |j'                  |	|f«       Œ¯ 	 |j+                  d„ d¬	«       |j+                  d
„ d¬	«       ||fa| at
        S # t        $ r t
        xs g g fcY S w xY w# t(        $ r Y ŒZw xY w)u]   æ‡’åŠ è½½ originals.db æ ‡é¢˜ç´¢å¼•, mtime å�˜åŒ–æ—¶é‡�å»º. è¿”å›ž (proj_titles, comp_titles)é   r}   z#SELECT id_code, title FROM tsk_dataé   é   é   c                 ó   — t        | d   «      S rc   ©r]   re   s    r	   rg   z'_load_originals_index.<locals>.<lambda>á  ó   € œC  !¡›I€ r   T©ri   Úreversec                 ó   — t        | d   «      S rc   rÐ   re   s    r	   rg   z'_load_originals_index.<locals>.<lambda>â  rÑ   r   )ÚosÚpathÚgetmtimeÚ_ORIGINALS_DBÚOSErrorÚ_ORIGINALS_IDXÚ_ORIGINALS_IDX_MTr¸   Úexistsr   r€   r‚   Úfetchallr„   rÉ   r]   Ú
_OPROJ_KEYr   Úaddr   r…   Úsort)
ÚmtÚprojÚcompÚseen_pÚseen_cr‡   ÚrowsÚcodero   Úcts
             r	   Ú_load_originals_indexré   Â  s“  € ð*Ü�W‰W×ÑœmÓ,ˆô Ð! bÔ,=Ò&=ÜÐØ�Rˆ$€DÜ“UœC›EˆF€FÜ	‡w�w‡~�~”mÔ$ð	Ü—?‘?¤=¸!Ô<ˆDØ—<‘<Ð EÓF×OÑOÓQˆDØ�J‰JŒLØò 0‘��aÜ" 1Ó%�Ü�r“7˜Q’;ØÜ�r“7˜b’=¤Z×%6Ñ%6°rÔ%:Ø Ò'ØŸ
™
 2œØŸ™ R¨ JÕ/Øœ#˜b›'Ô' RÖ'Ø Ò'ØŸ
™
 2œØŸ™ R¨ JÕ/ñ0ð 	‡I�IÑ%¨t€IÔ4Ø‡I�IÑ%¨t€IÔ4Ø˜D�\€NØÐÜÐøô= ò *ÜÒ) " b Ò)ð*ûô. ò 	Ùð	ús6   ‚#F' Á6BG Ä
9G ÅG Å&G Æ'F?Æ>F?Ç	GÇGc                 ón  — | sy| j                  «       }t        j                  dd|«      }t        j                  dd|«      }t        |«      dk  ryt	        «       \  }}|D ]'  \  }}t        |«      t        |«      kD  rŒ||v sŒ#|dfc S  |D ]'  \  }}t        |«      t        |«      kD  rŒ||v sŒ#|dfc S  y)uP   æŒ‰æ ‡é¢˜åŒ¹é…� originals é¡¹ç›® â†’ (id_code, level), level: 'proj'|'comp'|None©NNuW   (çŽ¯å¢ƒå½±å“�æŠ¥å‘Šä¹¦|çŽ¯è¯„|çŽ¯å¢ƒå½±å“�è¯„ä»·|å…¬ç¤º|å�—ç�†|å®¡æ‰¹|æ‰¹å¤�|å†³å®š).*$r   rÇ   r|   râ   rã   )r   r   r—   r]   ré   )rw   Ústrâ   rã   Úoctitlerç   s         r	   Úfind_originals_idrî   è  sÊ   € áØØ	�‰‹€BÜ	�‰ÐjÐlnÐprÓ	s€BÜ	�‰Ð(¨"¨bÓ	1€BÜ
ˆ2ƒw�‚|ØÜ&Ó(�J€Dˆ$Øò  ‰ˆ�Üˆw‹<œ#˜b›'Ò!ØØ�bŠ=Ø˜�<Òð	 ð
 ò  ‰ˆ�Üˆw‹<œ#˜b›'Ò!ØØ�bŠ=Ø˜�<Òð	 ð
 r   c                 ó~   — | �t        | «      nd}t        j                  d|«      ryt        j                  d|«      ryy)u+   9ä½�=Project ID, 7ä½�=Plant ID, å…¶ä½™=Noner   z\d{9})u   é¡¹ç›®IDrâ   z\d{7})u   ä¼�ä¸šIDÚplantrë   )r�   r   Ú	fullmatch)Úid_coder’   s     r	   Ú_orig_id_labelró   ÿ  s7   € àÐ+ŒˆGŒ°€AÜ	‡|�|�H˜aÔ Ø!Ü	‡|�|�H˜aÔ Ø"Ør   r›   Úallc           
      óä  ‡E— t        t        | «      j                  «       j                  dd«      «      dk  rg ddfS t	        j
                  t        d¬«      }t        j                  |_        |j                  d«       |j                  «       }	g }
g }d}| rd	}|
j                  | «       |r2t        |   d
   }|sd	}|
j                  |«       n| d|z   dz   z  } | |
d<   |r"|j                  d«       |
j                  |«       |r'|dk7  r"|j                  d«       |
j                  |«       |r#|dk7  rddddœ|   }|j                  d|› d�«       |dk(  rdn|dk(  rdnd}|dz   }|dz
  |z  }d}|�r|
d   }t        |«      }||
d<   t        |«      \  }}|�s[t        |«      dk(  �rLd|j                  «       v�r9|d   }d}t        |«      rt        |«      dk\  rd|f}n2t!        j"                  dd|«      }dt        |«      cxk  rdk  rn nd |f}|rà|rd!d!j%                  |«      z   nd}	 |	j                  d"|› �|d   |d   ft'        |
dd «      z   «       |	j)                  «       d   }|dkD  r‚|	j                  d#|› d$�|d   |d   ft'        |
dd «      z   ||fz   «       |	j+                  «       D �cg c]  }t-        |«      ‘Œ }}t        |«      |kD  }|r|d| }|j/                  «        |||fS 	 t        |«      dk(  �r t        |«      �sô|�sñ|d   }t!        j2                  d%|«      �rÕd&|z   d'z   }d(|z   d'z   }d} |rd!d!j%                  |«      z   } 	 |	j                  d)|› d*|› d+| › �t'        |
dd «      «       |	j)                  «       d   }|dkD  �rW|	j                  d,|› d*|› d+| › �t'        |
dd «      «       |	j+                  «       D �cg c]  }|d   ‘Œ	 }!}|!s|j/                  «        g ddfS d-j%                  d.t        |!«      z  «      }"|	j                  d/|"› d�|!«       |	j+                  «       }#|#j5                  d0„ d	¬1«       |#|||z    D �$�%cg c]  \  }$}%|$‘Œ	 }&}$}%t        |&«      |kD  }|r|&d| }&|&sg }nYd-j%                  d.t        |&«      z  «      }'|	j                  d2|'› d�|&«       |	j+                  «       D �cg c]  }t-        |«      ‘Œ }}|j/                  «        |||fS |j/                  «        g ddfS t        |«      s+|s)t        |«      dkD  st        |«      dk(  �r¿t        |«      �s³t        |«      �rBt9        d3„ ||z   D «       «      �r,	 |rt;        dj%                  |«      «      nd}(d4g})|(g}*|r%|)j=                  |«       |*j=                  |
dd «       |D ].  }+|)j                  d5«       |*j=                  d'|+z   d'z   gdz  «       Œ0 d!j%                  |)«      },|	j                  d6|,› �|*«       |	j)                  «       d   }|dkD  rn|	j                  d7|,› d8|› d9�|*||gz   «       |	j+                  «       D �cg c]  }t-        |«      ‘Œ }}t        |«      |kD  }|r|d| }|j/                  «        |||fS 	 g }-g }.|D ]9  }/|-j                  d:«       |.j=                  d'|/z   d'z   d'|/z   d'z   d'|/z   d'z   g«       Œ; |D ]9  }/|-j                  d5«       |.j=                  d'|/z   d'z   d'|/z   d'z   d'|/z   d'z   g«       Œ; |-sg }d}d}|j/                  «        |||fS |�rÀt9        d;„ |D «       «      �r­	 g }0|D ]t  }/t?        |/«      }1d}2|1D ]C  }3|	j                  d<|3f«       tA        d=„ |	j+                  «       D «       «      }4|2€|4}2n|2|4z  }2|2rŒC n |0j                  |2xs
 tA        «       «       Œv |0rtA        jB                  |0Ž n	tA        «       }!|!s|j/                  «        g ddfS |!�røtE        |!«      }5|D ]O  }/t?        |/«      }6|6sŒ|6D ]:  }3|	j                  d<|3f«       tA        d>„ |	j+                  «       D «       «      }7|!|7z
  }!Œ< ŒQ tE        |!«      }5|5s|j/                  «        g ddfS |rd!d!j%                  |«      z   nd}8|rž|D �/cg c]  }/t        t?        |/«      «      ‘Œ c}/ŠEd!j%                  ˆEfd?„tG        t        |«      «      D «       «      }9g }:|D ]  }/|:j=                  t?        |/«      «       Œ d@|9› |8› �};|	j                  |;|:«       |	j)                  «       d   }nt        |5«      }|dk(  r|j/                  «        g ddfS |D �/cg c]  }/t        t?        |/«      «      ‘Œ c}/ŠEd!j%                  ˆEfdA„tG        t        |«      «      D «       «      }9g }:|D ]  }/|:j=                  t?        |/«      «       Œ |r|8}<nd}<|rY|5rWdB|9› |<› dC�}=|	j                  |=|:|dz  |gz   «       |	j+                  «       D �cg c]  }|d   ‘Œ	 }&}|&D �>cg c]	  }>|>|!v sŒ|>‘Œ }&}>n?dB|9› |<› dC�}=|	j                  |=|:||gz   «       |	j+                  «       D �cg c]  }|d   ‘Œ	 }&}t        |&«      |kD  }|r|&d| }&|&rZd-j%                  d.t        |&«      z  «      }'|	j                  d2|'› d�|&«       |	j+                  «       D �cg c]  }t-        |«      ‘Œ }}ng }|j/                  «        |||fS 	 g }?|D ]  }/|?j                  dD«       Œ |D ]  }/|?j                  dE«       Œ d!j%                  |?«      }@tE        |.«      |
dd z   }A|rd!j%                  |«      }B@d!|Bz   z  }@|	j                  d6@› �A«       |	j)                  «       d   }|	j                  dF|@› dC�|A||gz   «       |	j+                  «       D �cg c]  }t-        |«      ‘Œ }}|t        |«      z   |k  }|r|d| }|j/                  «        |||fS d} |rd!d!j%                  |«      z   } 	 |	j                  dG| › �t;        |«      ft'        |
dd «      z   «       |	j)                  «       d   }|	j                  dH| › d8|› d9�t;        |«      ft'        |
dd «      z   ||fz   «       n^|rdKd!j%                  |«      z   nd}D|	j                  dL|D› �|
«       |	j)                  «       d   }|	j                  dM|D› d8|› d9�|
||gz   «       |	j+                  «       D �cg c]  }t-        |«      ‘Œ }}t        |«      |kD  }|r|d| }|j/                  «        |||fS c c}w # t        j0                  $ r Y �
ŒSw xY wc c}w c c}%}$w c c}w # t6        $ r Y �Œdw xY wc c}w # t        j0                  $ r Y �Œÿw xY wc c}/w c c}/w c c}w c c}>w c c}w c c}w # t6        $ r Y �ŒÍw xY wc c}w # t        j0                  $ r� d'|z   d'z   }C|	j                  dI|rd!d!j%                  |«      z   nd› �C|Cft'        |
dd «      z   «       |	j)                  «       d   }|	j                  dJ|rd!d!j%                  |«      z   nd› dC�C|Cft'        |
dd «      z   ||fz   «       Y �Œ�w xY wc c}w )Nu   è¿”å›ž (rows, total, has_more)r´   r   rž   r   Fr|   r}   r¿   Tr-   ú AND (r²   zr.category = ?rô   úr.industry = ?r›   é   rÎ   ©Ú1dÚ7dÚ30dúl(r.publish_date GLOB '20[0-9][0-9]-[0-9][0-9]-[0-9][0-9]*' AND SUBSTR(r.publish_date,1,10) >= date('now', '-ú days'))Ú	relevanceÚrankÚ	date_desczr.publish_date DESCzr.publish_date ASCNrm   Úcompanyú\Dé   Úphoneú AND zeSELECT COUNT(*) FROM gov_entity e JOIN gov_raw r ON r.id = e.doc_id WHERE e.etype = ? AND e.value = ?zlSELECT r.*, "" AS rank FROM gov_entity e JOIN gov_raw r ON r.id = e.doc_id WHERE e.etype = ? AND e.value = ?ú9 ORDER BY r.publish_date DESC, r.id DESC LIMIT ? OFFSET ?z[A-Za-z0-9._\-]+zhttp://%ú%z	https://%z7SELECT COUNT(*) FROM gov_raw r WHERE (r.page_url LIKE 'z' OR r.page_url LIKE 'z')z6SELECT r.rowid FROM gov_raw r WHERE (r.page_url LIKE 'ú,ú?z6SELECT id, publish_date FROM gov_raw r WHERE r.id IN (c                 ó   — | d   xs dS )Nr›   r   rd   re   s    r	   rg   zsearch.<locals>.<lambda>i  s   € °A°a±D²J¸B€ r   rÒ   z'SELECT * FROM gov_raw r WHERE r.id IN (c              3   ó8   K  — | ]  }t        |«      d k\  –— Œ y­w©rm   NrÐ   ©r^   ro   s     r	   ra   zsearch.<locals>.<genexpr>�  s   è ø€ Ò*V¸1¬3¨q«6°Q­;Ñ*Vùó   ‚zgov_search MATCH ?zI(r.title NOT LIKE ? AND r.site_name NOT LIKE ? AND r.page_url NOT LIKE ?)zGSELECT COUNT(*) FROM gov_search s JOIN gov_raw r ON s.rowid=r.id WHERE zHSELECT r.*, rank FROM gov_search s JOIN gov_raw r ON s.rowid=r.id WHERE ú
 ORDER BY z LIMIT ? OFFSET ?ú;(r.title LIKE ? OR r.site_name LIKE ? OR r.page_url LIKE ?)c              3   ól   K  — | ],  }t        |«      d k\  xr t        |«      xr t        |«      –— Œ. y­wr�   ©r]   r
   r§   r  s     r	   ra   zsearch.<locals>.<genexpr>¨  s1   è ø€ ÒfÐWXœC ›F a™KÒRÔ,<¸QÓ,?ÒRÄKÐPQÃNÓRÑfùó   ‚24ú+SELECT rowid FROM gov_bigram WHERE gram = ?c              3   ó&   K  — | ]	  }|d    –— Œ y­w©r   Nrd   ©r^   Úrs     r	   ra   zsearch.<locals>.<genexpr>²  s   è ø€ Ò#?¨Q A a¥DÑ#?ùó   ‚c              3   ó&   K  — | ]	  }|d    –— Œ y­wr  rd   r  s     r	   ra   zsearch.<locals>.<genexpr>Ê  s   è ø€ Ò+G°Q¨A¨a­DÑ+Gùr  c              3   ól   •‡K  — | ]*  Šd j                  ˆfd„t        ‰‰   «      D «       «      –— Œ, y­w)r  c              3   óH   •K  — | ]  }d ‰› d|› d‰› d|› d‰› d|› d�–— Œ y­w©z"EXISTS (SELECT 1 FROM gov_bigram bÚ_z WHERE bz.rowid=r.id AND bú.gram=?)Nrd   ©r^   ÚjrŸ   s     €r	   ra   z#search.<locals>.<genexpr>.<genexpr>×  s\   øè ø€ ò -MØ12ð 0RÐRSÐQTÐTUÐVWÐUXÐX`ÐabÐ`cÐcdÐefÐdgÐgxÐyzÐx{Ð{|Ð}~Ð|ð  @Hô  .Iñ -Mùó   ƒ"N©r   r¤   ©r^   rŸ   Úgram_countss    @€r	   ra   zsearch.<locals>.<genexpr>Ö  s?   ùè ø€ ò 4@ð %&ð !(§¡ó -MÜ6;¸KÈ¹NÓ6Kô-M÷ !Mñ4@ùó   „04ú%SELECT COUNT(*) FROM gov_raw r WHERE c              3   ól   •‡K  — | ]*  Šd j                  ˆfd„t        ‰‰   «      D «       «      –— Œ, y­w)r  c              3   óH   •K  — | ]  }d ‰› d|› d‰› d|› d‰› d|› d�–— Œ y­wr  rd   r!  s     €r	   ra   z#search.<locals>.<genexpr>.<genexpr>ê  sZ   øè ø€ ò )IØ-.ð ,NÈaÈSÐPQÐRSÐQTÐT\Ð]^Ð\_Ð_`ÐabÐ`cÐctÐuvÐtwÐwxÐyzÐx{ð  |Dô  *Eñ )Iùr#  Nr$  r%  s    @€r	   ra   zsearch.<locals>.<genexpr>é  s=   ùè ø€ ò 0<ð !"ð $ŸL™Ló )IÜ27¸ÀA¹Ó2Gô)I÷ Iñ0<ùr'  ú!SELECT r.id FROM gov_raw r WHERE z. ORDER BY r.publish_date DESC LIMIT ? OFFSET ?z;(s.title LIKE ? OR s.site_name LIKE ? OR r.page_url LIKE ?)zI(s.title NOT LIKE ? AND s.site_name NOT LIKE ? AND r.page_url NOT LIKE ?)zNSELECT r.*, "" as rank FROM gov_search s JOIN gov_raw r ON s.rowid=r.id WHERE úYSELECT COUNT(*) FROM gov_search s JOIN gov_raw r ON s.rowid=r.id WHERE gov_search MATCH ?zZSELECT r.*, rank FROM gov_search s JOIN gov_raw r ON s.rowid=r.id WHERE gov_search MATCH ?zCSELECT COUNT(*) FROM gov_raw WHERE (title LIKE ? OR summary LIKE ?)zLSELECT r.*, "" as rank FROM gov_raw r WHERE (title LIKE ? OR summary LIKE ?)úWHERE zSELECT COUNT(*) FROM gov_raw r zSELECT r.* FROM gov_raw r )$r]   r�   r   rr   r   r€   r�   rÀ   rÁ   r‚   Úcursorr   Ú	PHASE_MAPr©   r®   r
   r   r—   r   ÚtupleÚfetchonerÝ   Údictr„   ÚOperationalErrorrñ   rà   r…   rô   r½   r£   r§   r¸   ÚintersectionÚlistr¤   )FÚqueryÚpageÚ	page_sizerà   ÚphaseÚcategoryÚ	daterangeÚindustryr‡   rµ   ÚparamsÚwhere_partsÚuse_ftsrZ   ÚdaysÚ	order_sqlÚ
fetch_sizeÚoffsetÚtotalr«   Ú	inc_termsÚ	exc_termsÚ_termÚ_entÚ_digÚ_ewÚ_etr  ræ   Úhas_moreÚurl_patÚurl_pat2Úfts_where_sqlÚidsÚph_idsÚid_datesÚridr  Úpage_idsÚph2Ú_fts_qÚ_w_listÚ_fparamsÚ_tÚ_w_allÚ
like_condsÚlike_paramsro   Úid_setsr¦   Úterm_idsÚgr’   Úid_listÚ	exc_gramsÚexc_sÚ
extra_joinÚex_condsÚ	ex_paramsÚ	count_sqlÚwhere_sql_joinÚ	limit_sqlÚpidÚ	fts_condsÚ	fts_whereÚ
fts_paramsÚ	raw_whereÚlike_qÚwherer&  sF                                                                        @r	   r   r   
  sc  ø€ ä
Œ3ˆu‹:×ÑÓ×%Ñ% c¨2Ó.Ó/°1Ò4Ø�1�eˆ|ÐÜ�?‰?œ7¨BÔ/€DÜ—{‘{€DÔØ‡L�LÐ*Ô+Ø�‰‹€AØ€F˜r�Ø€GÙØˆØ�‰�eÔÙÜ�uÑ˜jÑ)ˆÙØˆGØ�M‰M˜"Õà�X ‘] SÑ(Ñ(ˆEØˆF�1‰IÙØ×ÑÐ+Ô,¨f¯m©m¸HÔ.EÙ�H Ò%Ø×ÑÐ+Ô,¨f¯m©m¸HÔ.EÙ�Y %Ò'Ø˜A BÑ'¨	Ñ2ˆà×Ñð  Jð  KOð  JPð  PXð  Yô  	ZØ +Ò-‘ÈDÐT_ÒL_Ñ3HÐey€IØ˜Q‘€JØ�1‰f�iÑ€FØ€EÚØ�1‰Iˆä˜AÓˆØˆˆq‰	ä1°!Ó4Ñˆ	�9âœS ›^¨qÓ0°SÀÇÁÃ	Ò5IØ˜a‘LˆEØˆDÜ Ô&¬3¨u«:¸ª?Ø! 5Ð)‘ä—v‘v˜e R¨Ó/�Øœ˜D›	Ô' RÕ'Ø# T˜?�DÙÙ=H�g §¡¨[Ó 9Ò9Èb�ðØ—I‘Ið  !Fð  GJð  FKð  Lð  OSð  TUñ  OVð  X\ð  ]^ñ  X_ð  N`ô  chð  ioð  pqð  prð  isó  ctñ  Ntô  uØŸ*™*›, q™/�CØ˜Q’wØŸ	™	ð  %Qð  RUð  QVð  VOð  #Pð  SWð  XYñ  SZð  \`ð  abñ  \cð  Rdô  glð  msð  tuð  tvð  mwó  gxñ  Rxð  |Fð  HNð  {Oñ  ROô  PØ12·±³Ö>¨A¤ Q¥Ð>˜Ð>Ü#& t£9¨yÑ#8˜Ù#¨D°°)Ð,< TØŸ
™
œØ# S¨(Ð2Ð2ð ô ˆy‹>˜QÓÔ'7¸Õ':Â9Ø˜1‘ˆBô �|‰|Ð/°Õ4Ø$ r™/¨CÑ/�Ø&¨Ñ+¨cÑ1�Ø "�ÙØ$+¨g¯l©l¸;Ó.GÑ$G�Mð%Ø—I‘IÐ WÐX_ÐW`Ð`vÐwð  wAð  ACð  DQð  CRð  SÜ# F¨1¨2 JÓ/ô1àŸJ™J›L¨™O�EØ˜q“yð
 Ÿ	™	Ð$ZÐ[bÐZcÐcyð  {Cð  zDð  DFð  GTð  FUð  #VÜ"'¨¨q¨r¨
Ó"3ô5à-.¯Z©Z«\Ö:¨˜q ›tÐ:˜Ð:Ù"Ø ŸJ™JœLØ#% q¨% <Ð/Ø!$§¡¨#´°C³©.Ó!9˜ØŸ	™	Ð$ZÐ[aÐZbÐbcÐ"dÐfiÔjØ#$§:¡:£<˜à Ÿ™Ñ*>È˜ÔMØ6>¸vÀfÈzÑFYÐ6Z×#[©F¨C°¢CÐ#[˜Ñ#[Ü#& x£=°9Ñ#<˜Ù#°¸¸)Ð0D XÙ'Ø#%™Dà"%§(¡(¨3´°X³Ñ+>Ó"?˜CØŸI™IÐ(OÐPSÈuÐTUÐ&VÐX`ÔaØ56·Z±Z³\Ö#B°¤D¨¥GÐ#B˜DÐ#BØŸ
™
œØ# U¨HÐ4Ð4ð Ÿ
™
œØ! 1 e˜|Ð+ô
 ˜AÔ¡)¬s°9«~ÀÒ/AÄcÈ)ÃnÐXYÓFYÔbrÐstÕbuô   Õ"¤sÑ*VÀ	ÈIÑ@UÔ*VÕ'VðÙHQÔ/°·±¸Ó0CÔDÐWY�FØ3Ð4�GØ &˜x�HÙ"ØŸ™ {Ô3Ø Ÿ™¨¨q¨r¨
Ô3Ø'ò >˜ØŸ™Ð'rÔsØ Ÿ™¨¨r©°C©Ð(8¸1Ñ(<Õ=ð>ð %Ÿ\™\¨'Ó2�FØ—I‘IÐ gÐhnÐgoÐpÐrzÔ{ØŸJ™J›L¨™O�EØ˜q’yØŸ	™	Ð$lÐmsÐltÐt~ð  @Ið  Jð  J[ð  #\ð  ^fð  jtð  v|ð  i}ñ  ^}ô  ~Ø12·±³Ö>¨A¤ Q¥Ð>˜Ð>Ü#& t£9¨yÑ#8˜Ù#¨D°°)Ð,< TØŸ
™
œØ# U¨HÐ4Ð4ð !ð ˆJØˆKØò R�Ø×!Ñ!Ð"_Ô`Ø×"Ñ" C¨!¡G¨c¡M°3¸±7¸S±=À#ÈÁ'ÈCÁ-Ð#PÕQðRð ò R�Ø×!Ñ!Ð"mÔnØ×"Ñ" C¨!¡G¨c¡M°3¸±7¸S±=À#ÈÁ'ÈCÁ-Ð#PÕQðRñ Ø� 1˜5° hØ—
‘
”Ø˜U HÐ,Ð,ò ÜÑfÐ\eÔfÕfð`ð !�GØ&ò :˜Ü +¨A£˜Ø#'˜Ø!&ò &˜AØŸI™IÐ&SÐVWÐUYÔZÜ #Ñ#?°!·*±*³,Ô#?Ó ?˜AØ'Ð/Ø+,¡à (¨A¡ Ú#+Ù %ð&ð  Ÿ™ xÒ'8´3³5Õ9ð:ñ 9@œ#×*Ñ*¨GÑ4ÄSÃU�CÙàŸ
™
œØ! 1 e˜|Ð+ÚÜ"& s£)˜ð "+ò 2˜AÜ(3°A«˜IÙ#,Ø (Ø%.ò 2 Ø !§	¡	Ð*WÐZ[ÐY]Ô ^Ü(+Ñ+G¸!¿*¹*»,Ô+GÓ(G Ø&)¨E¡k¡ñ2ð	2ô #' s£)˜Ù&Ø ŸJ™JœLØ#% q¨% <Ð/áLW W¨w¯|©|¸KÓ/HÒ%HÐ]_˜
Ù&ð IRÖ*RÀ1¬3¬{¸1«~Õ+>Ò*R˜KØ'.§|¡|ó 4@ô */¬s°9«~Ó)>ô4@ó (@˜Hð )+˜IØ%.ò A Ø )× 0Ñ 0´¸Q³Õ @ðAà*OÐPXÈzÐZdÐYeÐ(f˜IØŸI™I i°Ô;Ø$%§J¡J£L°¡O™Eä$'¨£L˜EØ  Aš:Ø ŸJ™JœLØ#% q¨% <Ð/ð ENÖ&N¸q¤s¬;°q«>Õ':Ò&N˜Ø#*§<¡<ó 0<ô &+¬3¨y«>Ó%:ô0<ó $<˜ð %'˜	Ø!*ò =˜AØ%×,Ñ,¬[¸«^Õ<ð=á&Ø-7™Nà-/˜Ná$©Ø*KÈHÈ:ÐVdÐUeð  fTð  )U˜IØŸI™I i°¸jÈ1¹nÈfÐ=UÑ1UÔVØ67·j±j³lÖ'C°¨¨!«Ð'C˜HÐ'CØ7?Ö'N°À3È#Â:ªÐ'N˜HÑ'Nà*KÈHÈ:ÐVdÐUeð  fTð  )U˜IØŸI™I i°¸jÈ&Ð=QÑ1QÔRØ67·j±j³lÖ'C°¨¨!«Ð'C˜HÐ'CÜ#& x£=°9Ñ#<˜Ù#°¸¸)Ð0D XÙ#Ø"%§(¡(¨3´°X³Ñ+>Ó"?˜CØŸI™IÐ(OÐPSÈuÐTUÐ&VÐX`ÔaØ56·Z±Z³\Ö#B°¤D¨¥GÐ#B˜DÑ#Bà#%˜DØŸ
™
œØ# U¨HÐ4Ð4ðQ ðX ˆIØò `�Ø× Ñ Ð!^Õ_ð`àò n�Ø× Ñ Ð!lÕmðnàŸ™ YÓ/ˆIÜ˜kÓ*¨V°A°B¨ZÑ7ˆJÙØ#ŸL™L¨Ó5�	Ø˜W yÑ0Ñ0�	Ø�I‰IÐ_Ð`iÐ_jÐkÐmwÔxØ—J‘J“L ‘OˆEØ�I‰IÐfÐgpÐfqð  r`ð  að  cmð  q{ð  }Cð  pDñ  cDô  EØ%&§Z¡Z£\Ö2 ”D˜•GÐ2ˆDÐ2Ø¤ T£Ñ*¨eÑ3ˆHÙØ˜J˜YÐ'�Ø�J‰JŒLØ˜ Ð(Ð(àˆMÙØ '¨'¯,©,°{Ó*CÑ C�ðTØ—	‘	Ðuð  wDð  vEð  Fô  I[ð  \]ó  I^ð  H`ô  chð  ioð  pqð  prð  isó  ctñ  Htô  uØŸ
™
› Q™�Ø—	‘	Ðvð  xEð  wFð  FPð  QZð  P[ð  [lð  mô  pBð  CDó  pEð  oGô  JOð  PVð  WXð  WYð  PZó  J[ñ  o[ð  _ið  kqð  ^rñ  orõ  sñ 9D�˜7Ÿ<™<¨Ó4Ò4ÈˆØ	�	‰	Ð3°E°7Ð;¸VÔDØ—
‘
“˜Q‘ˆØ	�	‰	Ð.¨u¨g°ZÀ	¸{ÐJ[Ð\Ð^dÐhrÐtzÐg{Ñ^{Ô|ØŸZ™Z›\Ö*˜ŒD��GÐ*€DÐ*Ü�4‹y˜9Ñ$€HÙØ�J�YÐˆØ‡J�J„LØ�˜Ð Ð ùòe  ?øô
 ×/Ñ/ò Úðüò2 ;ùó $\ùò $Cøô !ò Úðüò.  ?øô
 ×/Ñ/ò Úðüò~ +Sùò& 'Oùò  (DùÚ'Nùò (Dùò $Cøô
 !ò Úðüò  3øô ×+Ñ+ò TØ˜q™ 3™�Ø—	‘	Ð_ñ  JUÐahÐkr×kwÑkwð  yDó  lEò  bEð  []ð  `^ð  _ð  bhð  jpð  aqô  tyð  z@ð  ABð  ACð  zDó  tEñ  aEô  FØŸ
™
› Q™�Ø—	‘	Ðhñ  S^ÐjqÐt{÷  uAñ  uAð  BMó  uNò  kNð  dfð  igð  gUð  Vð  Y_ð  agð  Xhô  kpð  qwð  xyð  xzð  q{ó  k|ñ  X|ð  @Jð  LRð  Sñ  XS÷  Tð	Tüò +s9  È*Bt. Ê2t)Ë+t. ÍA9u ÏuÏu Ï2A"u ÑuÑ A"u ÓuÓu Ó+u ÕC,u- Ùu(Ù+u- Ü8Av% ÞAv% ß(Bv% á,v% â
vâ%B#v% å	v% åvå(Bv% ç9vèv% è	vèvè4v% évéAv% ê7v ë	v% î(v5ðA8v: ó+y-ô)t. ô.uõuõu õ	u%õ$u%õ(u- õ-vövöv% ö%	v2ö1v2ö:B,y*ù)y*c                 óº   — t        «       }|j                  «       }|j                  d| f«       |j                  «       }|j	                  «        |rt        |«      S d S )Nú SELECT * FROM gov_raw WHERE id=?)rÂ   r.  r‚   r1  r„   r2  )Ú	record_idr‡   rµ   r  s       r	   Ú
get_detailrs  7  sI   € ä‹8€D˜Ÿ™›�Qà‡I�IÐ0°9°,Ô?à	�
‰
‹€Aà‡J�J„LáŒ4�‹7Ð!˜TÐ!r   é   c                 ó  — t         j                  j                  t        «      sdg fS t	        j
                  t        «      }t        j                  |_        g g }}| rtt        | «      \  }}	|D ].  }
|j                  d«       |j                  d|
z   dz   gdz  «       Œ0 |	D ].  }
|j                  d«       |j                  d|
z   dz   gdz  «       Œ0 |rx|dk7  rs|t        v rkt        |   d   d d }|rZd	j                  d
gt        |«      z  «      }|j                  d|z   dz   «       |j                  |D �cg c]
  }d|z   dz   ‘Œ c}«       |r#|dk7  rddddœ|   }|j                  d|› d�«       |rddj                  |«      z   nd}|j                  d|z   |«      j                  «       d   }|j                  d|z   dz   |||dz
  |z  gz   «      D �cg c]  }t!        |«      ‘Œ }}|j#                  «        ||fS c c}w c c}w )Nr   úw(project_id LIKE ? OR project_name LIKE ? OR owner_company LIKE ? OR industry LIKE ? OR province LIKE ? OR city LIKE ?)r  é   ú”(project_id NOT LIKE ? AND project_name NOT LIKE ? AND owner_company NOT LIKE ? AND industry NOT LIKE ? AND province NOT LIKE ? AND city NOT LIKE ?)rô   rZ   é   ú OR úindustry LIKE ?r±   r²   r›   rø   rÎ   rù   úh(publish_date GLOB '20[0-9][0-9]-[0-9][0-9]-[0-9][0-9]*' AND SUBSTR(publish_date,1,10) >= date('now', '-rþ   r-  r  r   z$SELECT COUNT(*) FROM cceup_projects zSELECT * FROM cceup_projects ú8 ORDER BY publish_date DESC, project_id LIMIT ? OFFSET ?)rÕ   rÖ   rÜ   ÚCONTACT_DB_PATHr   r€   rÀ   rÁ   r®   r   r£   ÚINDUSTRY_MAPr   r]   r‚   r1  r2  r„   ©r«   r7  Úperr;  r<  ÚdbÚcondsr=  r¬   r­   ro   r`   Ú	sub_condsÚkr@  ÚwhrD  r  ræ   s                      r	   Úcceup_searchr‡  G  s_  € ä�7‰7�>‰>œ/Ô*°1°b°5¨Lä	�‰œÓ	)€B¼G¿K¹K¨2¬>à˜ˆ6€Eáä% aÓ(‰ˆˆSàò 	)ˆAà�L‰Lð  Sô  Tà�M‰M˜3˜q™5 ™9˜+ a™-Õ(ð		)ð ò 	)ˆAà�L‰Lð  pô  qà�M‰M˜3˜q™5 ™9˜+ a™-Õ(ð		)ñ �H Ò%¨(´lÑ*Bä˜8Ñ$ TÑ*¨2¨AÐ.ˆáàŸ™Ð%6Ð$7¼#¸c»(Ñ$BÓCˆIà�L‰L˜˜y™¨3Ñ.Ô/à�M‰M¨cÖ2¨˜3˜q™5 ›9Ò2Ô3á�Y %Ò'à˜A BÑ'¨	Ñ2ˆà�‰Ðð  AEð  @Fð  FNð  Oô  	Pá).ˆ�'—,‘,˜uÓ%Ò	%°B€Bà�J‰JÐ=¸bÑ@À&ÓI×RÑRÓTÐUVÑW€EàŸZ™ZÐ(GÈÑ(Jð  LFñ  )Fð  HNð  PSð  UYð  Z[ñ  U[ð  ]`ñ  T`ð  Oañ  Haó  bö  c˜ŒD��Gð  c€Dð  cà‡H�H„Jà�$ˆ;Ðùò! 3ùò có   Ä4G:ÇG?c                 óè   — t         j                  j                  t        «      syt	        j
                  t        «      }|j                  d| f«      j                  «       d   }|j                  «        |S )Nr   z6SELECT COUNT(*) FROM cceup_contacts WHERE project_id=?)	rÕ   rÖ   rÜ   r~  r   r€   r‚   r1  r„   )ri  r‚  rD  s      r	   Úcceup_contacts_countrŠ  }  sT   € ä�7‰7�>‰>œ/Ô*°1ä	�‰œÓ	)€Bà�J‰JÐOÐRUÐQWÓX×aÑaÓcÐdeÑf€Eà‡H�H„Jà€Lr   c                 ó  — t         j                  j                  t        «      sdg fS t	        j
                  t        «      }t        j                  |_        g g }}| rtt        | «      \  }}	|D ].  }
|j                  d«       |j                  d|
z   dz   gdz  «       Œ0 |	D ].  }
|j                  d«       |j                  d|
z   dz   gdz  «       Œ0 |rx|dk7  rs|t        v rkt        |   d   d d }|rZd	j                  d
gt        |«      z  «      }|j                  d|z   dz   «       |j                  |D �cg c]
  }d|z   dz   ‘Œ c}«       |r#|dk7  rddddœ|   }|j                  d|› d�«       |rddj                  |«      z   nd}|j                  d|z   |«      j                  «       d   }|j                  d|z   dz   |||dz
  |z  gz   «      D �cg c]  }t!        |«      ‘Œ }}|j#                  «        ||fS c c}w c c}w )Nr   rv  r  rw  rx  rô   rZ   ry  rz  r{  r±   r²   r›   rø   rÎ   rù   r|  rþ   r-  r  r   z#SELECT COUNT(*) FROM znlh_projects zSELECT * FROM znlh_projects r}  )rÕ   rÖ   rÜ   ÚZNLH_DB_PATHr   r€   rÀ   rÁ   r®   r   r£   r  r   r]   r‚   r1  r2  r„   r€  s                      r	   Úznlh_searchr�  �  s_  € ä�7‰7�>‰>œ,Ô'°°2°¨ä	�‰œÓ	&€B¼¿¹¨¬à˜ˆ6€Eáä% aÓ(‰ˆˆSàò 	)ˆAà�L‰Lð  Sô  Tà�M‰M˜3˜q™5 ™9˜+ a™-Õ(ð		)ð ò 	)ˆAà�L‰Lð  pô  qà�M‰M˜3˜q™5 ™9˜+ a™-Õ(ð		)ñ �H Ò%¨(´lÑ*Bä˜8Ñ$ TÑ*¨2¨AÐ.ˆáàŸ™Ð%6Ð$7¼#¸c»(Ñ$BÓCˆIà�L‰L˜˜y™¨3Ñ.Ô/à�M‰M¨cÖ2¨˜3˜q™5 ›9Ò2Ô3á�Y %Ò'à˜A BÑ'¨	Ñ2ˆà�‰Ðð  AEð  @Fð  FNð  Oô  	Pá).ˆ�'—,‘,˜uÓ%Ò	%°B€Bà�J‰JÐ<¸RÑ?ÀÓH×QÑQÓSÐTUÑV€EàŸZ™ZÐ(FÀrÑ(Ið  KEñ  )Eð  GMð  ORð  TXð  YZñ  TZð  \_ñ  S_ð  N`ñ  G`ó  aö  b˜ŒD��Gð  b€Dð  bà‡H�H„Jà�$ˆ;Ðùò! 3ùò brˆ  c                 ó¬  — t         j                  j                  t        «      sy t	        j
                  t        «      }t        j                  |_        |j                  d| f«      j                  «       }|s|j                  «        y t        |«      }|j                  d| f«      D �cg c]  }t        |«      ‘Œ c}|d<   |j                  «        |S c c}w )Nz.SELECT * FROM znlh_projects WHERE project_id=?z:SELECT * FROM znlh_contacts WHERE project_id=? ORDER BY idÚcontacts)rÕ   rÖ   rÜ   rŒ  r   r€   rÀ   rÁ   r‚   r1  r„   r2  ©ri  r‚  r  r    s       r	   Úznlh_detailr‘  Ã  s™   € ä�7‰7�>‰>œ,Ô'°ä	�‰œÓ	&€B¼¿¹¨¬à
�
‰
ÐCÀSÀFÓK×TÑTÓV€Aáˆb�h‰hŒj äˆQ‹€Aà&(§j¡jÐ1mÐorÐntÓ&uÖv ”T˜!•WÒv€A€j�Mà‡H�H„J�q�ùò wó   Â'Cc                 ó  — t         j                  j                  t        «      sdg fS t	        j
                  t        «      }t        j                  |_        g g }}| rtt        | «      \  }}	|D ].  }
|j                  d«       |j                  d|
z   dz   gdz  «       Œ0 |	D ].  }
|j                  d«       |j                  d|
z   dz   gdz  «       Œ0 |rx|dk7  rs|t        v rkt        |   d   d d }|rZd	j                  d
gt        |«      z  «      }|j                  d|z   dz   «       |j                  |D �cg c]
  }d|z   dz   ‘Œ c}«       |r#|dk7  rddddœ|   }|j                  d|› d�«       |rddj                  |«      z   nd}|j                  d|z   |«      j                  «       d   }|j                  d|z   dz   |||dz
  |z  gz   «      D �cg c]  }t!        |«      ‘Œ }}|j#                  «        ||fS c c}w c c}w )Nr   z_(project_id LIKE ? OR project_name LIKE ? OR industry LIKE ? OR province LIKE ? OR city LIKE ?)r  rË   zw(project_id NOT LIKE ? AND project_name NOT LIKE ? AND industry NOT LIKE ? AND province NOT LIKE ? AND city NOT LIKE ?)rô   rZ   ry  rz  r{  r±   r²   r›   rø   rÎ   rù   r|  rþ   r-  r  r   z!SELECT COUNT(*) FROM zc_projects zSELECT * FROM zc_projects r}  )rÕ   rÖ   rÜ   Ú
ZC_DB_PATHr   r€   rÀ   rÁ   r®   r   r£   r  r   r]   r‚   r1  r2  r„   r€  s                      r	   Ú	zc_searchr•  ×  sY  € ä�7‰7�>‰>œ*Ô%¨a°¨e |ä	�‰œÓ	$€B´w·{±{ b¤nà˜ˆ6€Eáä% aÓ(‰ˆˆSàò 	)ˆAà�L‰LÐzÔ{à�M‰M˜3˜q™5 ™9˜+ a™-Õ(ð		)ð ò 	)ˆAà�L‰Lð  Sô  Tà�M‰M˜3˜q™5 ™9˜+ a™-Õ(ð		)ñ �H Ò%¨(´lÑ*Bä˜8Ñ$ TÑ*¨2¨AÐ.ˆáàŸ™Ð%6Ð$7¼#¸c»(Ñ$BÓCˆIà�L‰L˜˜y™¨3Ñ.Ô/à�M‰M¨cÖ2¨˜3˜q™5 ›9Ò2Ô3á�Y %Ò'à˜A BÑ'¨	Ñ2ˆà�‰Ðð  AEð  @Fð  FNð  Oô  	Pá).ˆ�'—,‘,˜uÓ%Ò	%°B€Bà�J‰JÐ:¸2Ñ=¸vÓF×OÑOÓQÐRSÑT€EàŸZ™ZÐ(DÀRÑ(Gð  ICñ  )Cð  EKð  MPð  RVð  WXñ  RXð  Z]ñ  Q]ð  L^ñ  E^ó  _ö  `˜ŒD��Gð  `€Dð  `à‡H�H„Jà�$ˆ;Ðùò! 3ùò `rˆ  c                 ó¬  — t         j                  j                  t        «      sy t	        j
                  t        «      }t        j                  |_        |j                  d| f«      j                  «       }|s|j                  «        y t        |«      }|j                  d| f«      D �cg c]  }t        |«      ‘Œ c}|d<   |j                  «        |S c c}w )Nz,SELECT * FROM zc_projects WHERE project_id=?z8SELECT * FROM zc_contacts WHERE project_id=? ORDER BY idr�  )rÕ   rÖ   rÜ   r”  r   r€   rÀ   rÁ   r‚   r1  r„   r2  r�  s       r	   Ú	zc_detailr—    s™   € ä�7‰7�>‰>œ*Ô%¨dä	�‰œÓ	$€B´w·{±{ b¤nà
�
‰
ÐAÀ3À&ÓI×RÑRÓT€Aáˆb�h‰hŒj äˆQ‹€Aà&(§j¡jÐ1kÐmpÐlrÓ&sÖt ”T˜!•WÒt€A€j�Mà‡H�H„J�q�ùò ur’  c                 óü  — t         j                  j                  t        «      sy t	        j
                  t        «      }t        j                  |_        	 |j                  d| f«      j                  «       }|s	 |j                  «        y t        |«      }|j                  d«      xs |j                  d«      xs d|d<   |j                  d«      xs d|d<   ||j                  «        S # |j                  «        w xY w)Nrq  Úpage_urlÚ
source_urlr   ÚurlÚ	site_nameÚdomain)rÕ   rÖ   rÜ   r�   r   r€   rÀ   rÁ   r‚   r1  r„   r2  r   )ri  r‚  r  Úds       r	   Úcrawler_detailrŸ  +  s¼   € ä�7‰7�>‰>œ'Ô"¨4ä	�‰œÓ	!€B´G·K±K 2¤>ðà�J‰JÐ9¸3¸&ÓA×JÑJÓLˆá˜ð 	�‰�
ô �‹Gˆà—5‘5˜Ó$ÒA¨¯©¨lÓ(;ÒA¸rˆˆ%‰à—e‘e˜KÓ(Ò.¨Bˆˆ(‰àð 	�‰�
øˆ�‰�
ús   Á#C) Â	AC) Ã)C;c                 óö   — |r|sy t        j                  t        «      }	 |j                  d| t	        |«      |f«       |j                  «        |j                  «        y #  Y ŒxY w# |j                  «        w xY w)NzNINSERT INTO project_visits (project_type, project_id, username) VALUES (?,?,?))r   r€   Ú
SESSION_DBr‚   r�   rƒ   r„   )Úptyperi  Úusernamer‚  s       r	   Ú_track_project_visitr¤  I  se   € á™3 ä	�‰œÓ	$€Bðà
�
‰
Ðcàœ3˜s›8 XÐ.ô	0ð 	�	‰	Œð 	�‰�
øðáûð 	�‰�
ús    .A ÁA#Á!A& Á&A8rm   c                 ó  — |sdg fS t        j                  t        «      }t         j                  |_        	 |j                  d| t        |«      f«      j                  «       d   }|j                  d| t        |«      |f«      D �cg c]  }t        |«      ‘Œ }}|j                  d| t        |«      f«      j                  «       d   }||f|j                  «        S c c}w #  dg fcY |j                  «        S xY w# |j                  «        w xY w)Nr   úISELECT COUNT(*) FROM project_visits WHERE project_type=? AND project_id=?zSELECT DISTINCT username, visited_at FROM project_visits WHERE project_type=? AND project_id=? ORDER BY visited_at DESC LIMIT ?zYSELECT COUNT(DISTINCT username) FROM project_visits WHERE project_type=? AND project_id=?)
r   r€   r¡  rÀ   rÁ   r‚   r�   r1  r2  r„   )r¢  ri  Úlimitr‚  rD  r  ÚrecentÚunique_counts           r	   Ú_get_project_visitorsrª  a  sþ   € á�q˜"�u�ä	�‰œÓ	$€Bä—[‘[€B„Nðà—
‘
Ðfà!¤3 s£8Ð,ó.ç.6©h«j¸ñ<ˆð $&§:¡:ð Nà”C˜“H˜eÐ$ó	$&ö '˜a”$�q•'ð 'ˆð 'ð —z‘zÐ"}à$)¬3¨s«8Ð#4ó6ç6>±h³jÀñDˆð ˜VÐ#ð 	�‰�
ùò%'øðà�"ˆu‰ð 	�‰�
ûˆ�‰�
ús0   ¶AC ÂCÂ3C ÃC ÃC7Ã%C: Ã7C: Ã:D>   ÚadminÚbjiirÚlzhongÚsteveouÚschengboÚ	wjianninga}  <style>.nav-right{display:flex;align-items:center;gap:10px;margin-left:auto;font-size:13px;color:#5f6368}.nav-right.fixed{position:fixed;top:12px;right:20px;z-index:900;margin-left:0}@media(min-width:1760px){.nav-right{position:fixed;top:12px;right:20px;z-index:900;margin-left:0}}.nav-right a.nav-admin,.nav-right a.nav-tm{display:inline-flex;align-items:center;padding:6px 14px;border-radius:999px;font-size:13px;font-weight:600;cursor:pointer;text-decoration:none;line-height:1.2;transition:background .15s,border-color .15s,color .15s}.nav-right a.nav-admin{background:#1a73e8;color:#fff;border:1px solid #1a73e8;box-shadow:0 1px 4px rgba(26,115,232,.3)}.nav-right a.nav-admin:hover{background:#1557b0;border-color:#1557b0;color:#fff;text-decoration:none}.nav-right a.nav-tm{background:#fff;color:#1a73e8;border:1px solid #c3d7fb}.nav-right a.nav-tm:hover{background:#e8f0fe;border-color:#1a73e8;text-decoration:none}.nav-right .nav-user{font-size:12px;color:#5f6368}.nav-right a.nav-logout{display:inline-flex;align-items:center;padding:6px 12px;border-radius:999px;font-size:13px;color:#d93025;background:#fff;border:1px solid #f0c4bf;text-decoration:none;transition:background .15s}.nav-right a.nav-logout:hover{background:#fdecea;text-decoration:none}@media(max-width:760px){.nav-right{position:static !important;margin-left:0;width:100%;flex-wrap:wrap;gap:8px;justify-content:flex-start}}</style>aÆ  <style>.pagination{display:flex;align-items:center;justify-content:center;gap:6px;flex-wrap:wrap;margin:26px 0 60px;padding:14px 18px;background:#fff;border:1px solid #eceff3;border-radius:12px;box-shadow:0 1px 3px rgba(0,0,0,.06)}.pagination .page-btn{display:inline-flex;align-items:center;justify-content:center;min-width:38px;height:38px;padding:0 12px;border:1px solid #dadce0;border-radius:8px;background:#fff;color:#1a73e8;font-size:13px;line-height:1;text-decoration:none;transition:background .15s,border-color .15s,color .15s}.pagination .page-btn:hover{background:#e8f0fe;border-color:#1a73e8;color:#1a73e8;text-decoration:none}.pagination .page-btn.active{background:#1a73e8;color:#fff;border-color:#1a73e8;font-weight:600}.pagination .page-ellipsis{color:#9aa0a6;padding:0 4px;font-size:13px}.pagination .page-info{font-size:13px;color:#5f6368;margin-right:10px}.pagination .page-info b{color:#1a73e8}.pagination .page-jump{display:inline-flex;align-items:center;gap:4px;font-size:13px;color:#5f6368}.pagination .page-jump input{width:54px;padding:7px 8px;border:1px solid #dadce0;border-radius:8px;font-size:13px;text-align:center;outline:none}.pagination .page-jump input:focus{border-color:#1a73e8}</style>Fc                 ó*  — | xs d}g }|r'|dk7  r"|j                  d«       |j                  d«       |j                  d«       |j                  d|z   dz   «       |j                  d«       |rd	nd
}t        dz   |z   dz   dj                  |«      z   dz   S )u§  å�³ä¸Šè§’å¯¼èˆªç°‡ï¼ˆ2026-09-10 ç”¨æˆ·éœ€æ±‚ï¼›æ ·å¼�è‡ªåŒ…å�«ï¼Œä¸�ä¾�èµ–é¡µé�¢ CSSï¼‰ã€‚

    - ã€Œç™»å½•ç”¨æˆ·ã€�ä»Žä¸»é¡µé�¢å±…ä¸­ä½�ç½®ç§»åˆ°å�³ä¸Šè§’ï¼Œå¹¶æ–°å¢žã€Œé€€å‡ºã€�æŒ‰é’®ï¼ˆä¸»é¡µé�¢æ­¤å‰�æ— é€€å‡ºï¼‰
    - ã€ŒTM Script Centerã€�â†’ /tmï¼ˆå��ä»£ 127.0.0.1:8010ï¼‰ï¼›ã€ŒAdminã€�â†’ /crawler/admin
    - Admin å�¯è§�æ€§ï¼š**é™¤ bjiir å¤–æ‰€æœ‰ç™»å½•ç”¨æˆ·å�¯è§�**ï¼ˆbjiir çœ‹ä¸�åˆ°ï¼›ç”¨æˆ· 2026-09-10 ç¡®è®¤ï¼‰
    - å·¥å…·å¸‚åœºå�¯è§�æ€§ï¼š**å�Œæ ·å¯¹ bjiir éš�è—�**ï¼ˆ2026-09-11 ç”¨æˆ·éœ€æ±‚ï¼›ä¸Ž Admin å�Œä¸€å�£å¾„ = å…¥å�£çº§éš�è—�ï¼Œ
      è·¯ç”±ä¸�å�šè§’è‰²æ ¡éªŒï¼Œä¸Ž Admin çŽ°çŠ¶ä¸€è‡´ï¼‰
    - é¡ºä½�ï¼šAdmin Â· å·¥å…·å¸‚åœº Â· TM Script Center Â· ç™»å½•ç”¨æˆ· Â· é€€å‡ºï¼ˆAdmin åœ¨ TM å…¥å�£å·¦ä¾§ï¼‰
    - fixed=True â†’ å¸¸é©»æµ�è§ˆå™¨çª—å�£å�³ä¸Šè§’ï¼ˆä¸»é¡µé�¢ç”¨ï¼‰ï¼›å�¦åˆ™åœ¨æµ�å†…å�³å¯¹é½�ï¼Œ
      ä¸”ä»…åœ¨è§†å�£ â‰¥1760px æ—¶è„±ç¦»æ–‡æ¡£æµ�è´´çª—å�£å�³ä¸Šè§’ï¼ˆé�¿å…�ä¸Žé¡µå†… tab è¡Œé‡�å� ï¼‰
    r   r¬  z4<a class="nav-admin" href="/crawler/admin">Admin</a>u0   <a class="nav-tm" href="/tools">å·¥å…·å¸‚åœº</a>z2<a class="nav-tm" href="/tm/">TM Script Center</a>z<span class="nav-user">ú</span>u/   <a class="nav-logout" href="/logout">é€€å‡º</a>znav-right fixedz	nav-rightz<div class="ú">ú</div>)r   ÚNAV_CLUSTER_CSSr   )r£  ÚfixedÚur!   Úclss        r	   Únav_right_htmlr¹  ¼  s—   € ð 	Š�B€AØ€EÙˆQ�'Š\Ø�‰ÐKÔLØ�‰ÐGÔHØ	‡L�LÐEÔFØ	‡L�LÐ*¨QÑ.°Ñ:Ô;Ø	‡L�LÐBÔCÙ$Ñ
¨+€CÜ˜^Ñ+¨cÑ1°DÑ8¸2¿7¹7À5»>ÑIÈHÑTÐTr   z/root/session.dbc                  óþ   — t        j                  t        «      } | j                  d«       | j                  d«       | j                  d«       | j                  d«       | j	                  «        | j                  «        y )NzãCREATE TABLE IF NOT EXISTS sessions (

        token TEXT PRIMARY KEY, username TEXT NOT NULL,

        created_at TEXT DEFAULT (datetime('now','localtime')),

        last_seen TEXT DEFAULT (datetime('now','localtime'))

    )a  CREATE TABLE IF NOT EXISTS usage_log (

        id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL,

        action TEXT NOT NULL, page TEXT DEFAULT '', query TEXT DEFAULT '',

        ip TEXT DEFAULT '', created_at TEXT DEFAULT (datetime('now','localtime'))

    )a	  CREATE TABLE IF NOT EXISTS project_visits (

        id INTEGER PRIMARY KEY AUTOINCREMENT,

        project_type TEXT NOT NULL,

        project_id TEXT NOT NULL,

        username TEXT NOT NULL,

        visited_at TEXT DEFAULT (datetime('now','localtime'))

    )zoCREATE INDEX IF NOT EXISTS idx_pv_lookup 

        ON project_visits(project_type, project_id, visited_at DESC))r   r€   r¡  r‚   rƒ   r„   )r‚  s    r	   Úinit_session_dbr»  ×  so   € ä	�‰œÓ	$€Bà‡J�Jð 	ô 
ð ‡J�Jð 	ô 
ð ‡J�Jð 	ô 
ð ‡J�Jð Hô Ið ‡I�I„K�—‘•r   z'</?[a-zA-Z][a-zA-Z0-9]*(?:\s[^<>]*)?/?>z4<(script|style|noscript|template)\b[^>]*>.*?</\1\s*>z/<(?:script|style|noscript|template)\b[^>]*>.*\Zz
<!--.*?-->z<link\b[^>]*>zK(?:<!--\s*)?(?:<\$\[[^\]]*\]>|ZJEG_RSS\.[\w.]*)\s*(?:begin|end)?\s*(?:-->)?c                 ó  — | xs d} d}|| k7  r| }t         j                  d| «      } || k7  rŒt        j                  d| «      } t        j                  d| «      } t        j                  d| «      } t
        j                  d| «      } | S )u  å‰¥æŽ‰æ­£æ–‡é‡Œçš„ <script>/<style>/<noscript>/<template> å�—ï¼ˆè¿žå†…å®¹ï¼‰ã€�HTML æ³¨é‡Šã€�
    <link>ã€�ä»¥å�Š ZJEG/TRS ç³»çš„ CMS æ¨¡æ�¿æ ‡è®°ã€‚

    ä¸�å‰¥ä¼šæŠŠå†…è�” CSS å½“æ­£æ–‡æ˜¾ç¤ºï¼ˆåˆ—è¡¨æ‘˜è¦�å�˜ CSSï¼‰ï¼Œå¹¶æŠŠ <style> æ³¨å…¥è¯¦æƒ…é¡µæ±¡æŸ“å…¨é¡µæ ·å¼�ã€‚
    r   Nr´   )Ú_NOISE_BLOCK_REr—   Ú_NOISE_OPEN_REÚ_NOISE_COMMENT_REÚ_NOISE_LINK_REÚ_CMS_MARKER_RE)r’   Úprevs     r	   Ústrip_body_noiserÃ  1  sˆ   € ð 	
ŠˆR€AØ€DØ
�!Š)ØˆÜ×Ñ  QÓ'ˆð �!‹)ô 	×Ñ˜3 Ó"€AÜ×Ñ˜c 1Ó%€AÜ×Ñ˜3 Ó"€AÜ×Ñ˜3 Ó"€AØ€Hr   u¶   (?:å�‘å¸ƒæ—¶é—´|å�‘å¸ƒæ—¥æœŸ|æ›´æ–°æ—¶é—´|ä¿¡æ�¯æ�¥æº�|æ�¥æº�|ç‚¹å‡»æ•°|æµ�è§ˆé‡�|æµ�è§ˆæ¬¡æ•°|ç´¯è®¡æ¬¡æ•°|è®¿é—®æ¬¡æ•°|è®¿é—®é‡�|å­—å�·|å­—ä½“å¤§å°�|å­—ä½“|åˆ†äº«åˆ°|åˆ†äº«|æ‰“å�°)ú^u   \s*[ï¼š:]\s*uÝ   ^(?:å¾®å�š|QQç©ºé—´|QQå¥½å�‹|å¾®ä¿¡|æ–°æµªå¾®å�š|äººäººç½‘|è±†ç“£|è§†åŠ›ä¿�æŠ¤è‰²|å…³é—­|æ‰“å�°æœ¬é¡µ|[\[]\s*[å°�ä¸­å¤§]\s*[å°�ä¸­å¤§]\s*[å°�ä¸­å¤§]\s*[\]]|ã€�\s*[å°�ä¸­å¤§]\s*[å°�ä¸­å¤§]\s*[å°�ä¸­å¤§]\s*ã€‘)\s*[ï¼š:]?\s*uk   ^(?:å¯¼èˆªè�œå�•|ç½‘ç«™å¯¼èˆª|å½“å‰�ä½�ç½®|æ‚¨çš„ä½�ç½®|é�¢åŒ…å±‘|é¦–é¡µ(?=\s*[>ã€‹Â»]))\s*[>ã€‹Â»:ï¼š]?\s*uD   ^\S{0,10}(?:é—¨æˆ·ç½‘ç«™|æ”¿åºœç½‘ç«™|å®˜ç½‘)\s*[ï¼š:]\s*\S{0,60}\s*uI   [^\sï¼Œã€‚ï¼›ã€�ï¼šï¼�ï¼Ÿã€Šã€‹ã€ˆã€‰ï¼ˆï¼‰()ã€”ã€•ã€�ã€‘â€œâ€�"\']{1,15}z^\d{1,2}:\d{2}(?::\d{2})?\s*u&   ^(?:[A-Za-z]\s*[|ï½œ]\s*)+[A-Za-z]?\s*z^\s+u   ^[|ï½œÂ·]\s*u/   \d{4}\s*[-/å¹´.]\s*\d{1,2}\s*[-/æœˆ.]\s*\d{1,2}zf^(?:[0-9a-fA-F]{16,}(?:\.[A-Za-z0-9]{1,5})?|\S+\.(?:jpg|jpeg|png|gif|bmp|webp|pdf|docx?|xlsx?|zip))\s*c                 ó  — | dk(  xs~ t        t        j                  | «      «      xs^ t        t        j                  | «      «      xs> t        t        j                  | «      «      xs t        t
        j                  | «      «      S )u8  å€¼çš„ä¸‹ä¸€ä¸ª token å¿…é¡»æ˜¯å�¦ä¸€ä¸ªæ ‡ç­¾ / æ—¶é—´ / å­—å�·æ�¡ / ç«–çº¿ï¼Œæˆ–ä¸²å°¾ã€‚

    âš ï¸� å�¦åˆ™è¿™ä¸ªã€Œå€¼ã€�å…¶å®žæ­£æ–‡ï¼šå®žæµ‹ `åˆ†äº«ï¼š å‘¨ä½³ã€�é²�ä½³è��å› ä¿�ç®¡ä¸�å–„â€¦`ï¼Œ
    ä¸�åŠ è¿™é�“é—¸å°±ä¼šæŠŠçœŸäººå��ã€Œå‘¨ä½³ã€�å½“å…ƒæ•°æ�®å€¼å�ƒæŽ‰ï¼ˆå�Žé�¢è·Ÿç�€ã€Œã€�ã€�= æ­£æ–‡ï¼‰ã€‚
    r   )r   Ú_EXC_LABEL_REÚmatchÚ_EXC_TIME_REÚ_EXC_GLYPH_REÚ_EXC_BAR_REr‘   s    r	   Ú_exc_follow_okrË  \  ss   € ð �‰Gò J”tœM×/Ñ/°Ó2Ó3ò J´t¼L×<NÑ<NÈqÓ<QÓ7Rò JÜ”M×'Ñ'¨Ó*Ó+òJÜ/3´K×4EÑ4EÀaÓ4HÓ/IðKr   c                 ó   — dx}}|t        | «      k  �r„|dk  �r~| |d }t        j                  |«      }|r³|dz  }||j                  «       z  }| |d }t        j                  |«      rŒdt        j                  |«      }|r||j                  «       z  }Œ�t
        j                  |«      }|r=t        ||j                  «       d j                  «       «      r||j                  «       z  }Œät        t        t        t        t        fD ]-  }|j                  | |d «      }|sŒ||j                  «       z  } nP t        j                  | |d «      xs t        j                  | |d «      }|r|dz  }||j                  «       z  }�Œ}n|t        | «      k  r|dk  r�Œ~|dk(  s|dk  rt        j                  | d| «      s| S | |d j                  d«      S )uÈ  å�ƒæŽ‰æ‘˜è¦�å¼€å¤´çš„ã€Œæ ‡ç­¾ï¼šçŸ­å€¼ã€�åº�åˆ—ï¼Œåˆ¤å®šä¿�å®ˆ â€”â€” å®�å�¯ä¸�å‰¥ä¹Ÿä¸�å�žæ­£æ–‡ã€‚

    è§„åˆ™ï¼šâ‘  å€¼å¿…é¡» â‰¤15 å­—ã€�ä¸�å�«å�¥å­�æ ‡ç‚¹ï¼Œä¸”**å�Žé�¢å¿…é¡»è·Ÿæ ‡ç­¾/æ—¶é—´/ä¸²å°¾**æ‰�è®¤ï¼ˆ_exc_follow_okï¼‰ï¼›
          â‘¡ æ•´ä¸ªå‰�ç¼€å¿…é¡»å�«**æ—¥æœŸ**æˆ–**â‰¥2 ä¸ªæ ‡ç­¾**æ‰�æ��äº¤ â€”â€”
             å�•çº¯ä¸€ä¸ªã€Œæ�¥æº�ï¼šã€�ä¸�åŠ¨ï¼Œé�¿å…�æŠŠã€Œæ�¥æº�ï¼šæœ¬å…¬å�¸æ‹ŸæŠ•èµ„â€¦ã€�è¿™ç±»æ­£æ–‡å�¥å­�å½“å…ƒæ•°æ�®å�ƒæŽ‰ã€‚
    r   éP   Nr›   rž   u    |ï½œÂ·)r]   rÆ  rÇ  ÚendrÉ  Ú_EXC_VAL_RErË  ÚlstriprÈ  Ú
_EXC_WS_RErÊ  Ú_EXC_JUNK_REÚ_EXC_BARE_REÚ_EXC_SITE_REÚ_EXC_DATE_REr   )	ro   ÚposÚnlabÚrestr(   Úrest2ÚgmÚvmÚ_res	            r	   Ú_strip_excerpt_boilerrÝ  f  s¹  € ð €N€Cˆ$Ø
”�A“‹,˜3 "›9Ø��ˆwˆÜ×Ñ Ó%ˆÙØ�A‰IˆDØ�1—5‘5“7‰NˆCØ�c�d�GˆEä×"Ñ" 5Ô)Øä×$Ñ$ UÓ+ˆBÙØ�r—v‘v“x‘�ØÜ×"Ñ" 5Ó)ˆBÙ”n U¨2¯6©6«8¨9Ð%5×%<Ñ%<Ó%>Ô?Ø�r—v‘v“x‘�ØÜ ¤*¬m¼[Ì,ÐWò 	ˆCØ—	‘	˜!˜C˜D˜'Ó"ˆAÚØ�q—u‘u“w‘�Ùð		ô ×"Ñ" 1 S T 7Ó+ÒJ¬|×/AÑ/AÀ!ÀCÀDÀ'Ó/JˆAÙØ˜‘	�Ø�q—u‘u“w‘�ÙØð? ”�A“Š,˜3 "œ9ð@ ˆq‚y�T˜A’X¤l×&9Ñ&9¸!¸D¸S¸'Ô&BØˆØˆSˆTˆ7�>‰>˜)Ó$Ð$r   c                 óF   — t        t        j                  | xs d«      «      S )ug   True = å�«çœŸå®ž HTML æ ‡ç­¾ï¼ˆæŒ‰ HTML æ¸²æŸ“ï¼‰ï¼›False = çº¯æ–‡æœ¬ï¼ˆç”¨ .ctï¼Œä¿�ç•™ \n\n åˆ†æ®µï¼‰r   )r   Ú_BODY_TAG_REr   r‘   s    r	   Úbody_is_htmlrà  “  s   € ä”×#Ñ# A¢G¨Ó,Ó-Ð-r   z(?:\s*\n\s*){2,}>   úcrawl_xlt.pyúcrawl_0735.pyúcrawl_xceda.pyúcrawl_fuquan.pyúcrawl_wuxuan.pyúcrawl_ms_hpgs.pyúcrawl_kdl_sthj.pyúcrawl_luzhouqu.pyúcrawl_tongliao.pyúcrawl_jd_common.pyúcrawl_ybty_xxgs.pyúcrawl_ynfn_sthj.pyúcrawl_hunan_spjd.pyúcrawl_kmfgw_pzjg.pyúcrawl_xiangcheng.pyúcrawl_yunan_tzgg.pyúcrawl_huoqiu_tzgg.pyúcrawl_yuanan_tzgg.pyúcrawl_hanshou_tzgg.pyúcrawl_yangxin_tzgg.pyúcrawl_yueyang_szbm.pyúcrawl_yunmeng_gggs.pyúcrawl_xuanzhou_tzgg.pyúcrawl_dachaidan_gsgg.pyúcrawl_qingshuihe_bmwj.pyúcrawl_sthjj_xjbt_tzgg.pyúcrawl_enh_chinacoal_env.pyz¡(?<![\s\u3002\uff01\uff1f\u2026!?])\n(?=[0-9A-Za-z\u3400-\u9fff\uf900-\ufaff\u3001\u3002\uff0c\uff1b\uff1a\uff01\uff1f\u2026,;:?!.)\]}\uff09\u3011\u300b\u201d"])z.(?<=[\s\u3002\uff01\uff1f\u2026!?])\n|\n(?=\s)ú c                 ó$  — | rd| vr| S |t         vr| S t        j                  t        | «      }|j	                  d«      }|s| S t        t        j                  |«      «      dz  |kD  r| S t        j                  d|«      j                  t        d«      S )u—  æŠŠçº¯æ–‡æœ¬æ­£æ–‡é‡Œè¢« `get_text("\n")` æ‹†ç¢Žçš„è¡Œå†…èŠ‚ç‚¹å�ˆå›žï¼ˆåˆ¤æ�®è§�ä¸Šæ–¹æ³¨é‡Šï¼‰ã€‚

    âš ï¸� å�ªåœ¨**çº¯æ–‡æœ¬**ä¸Šç”¨ï¼ˆè°ƒç”¨æ–¹å·²ç”¨ body_is_html åˆ¤è¿‡ï¼‰ï¼›HTML æ­£æ–‡çš„ \n ä¸�å½’è¿™é‡Œç®¡ã€‚
    âš ï¸� `\n\n` çœŸåˆ†æ®µå…ˆæ�¢å“¨å…µå†�è¿˜åŽŸ â€”â€” ç»�ä¸�å�ƒæŽ‰åˆ†æ®µã€‚
    âš ï¸� script ä¸�åœ¨ç™½å��å�•ï¼ˆå�«å�–ä¸�åˆ°è„šæœ¬å��çš„è€�æ•°æ�®ï¼‰â†’ åŽŸæ ·è¿”å›žï¼Œå®�å�¯ä¸�ä¿®ã€‚
    ú
r|   r   ú

)
Ú_INLINE_SPLIT_SCRIPTSÚ_PARA_KEEP_REr—   Ú_BODY_SENTINELÚcountr]   Ú_SUSPECT_BREAK_REr¢   Ú_SOFT_JOIN_RErr   )r’   Úscriptro   rD  s       r	   Úreflow_plain_bodyr  Ó  sŠ   € ñ �˜A‘ØˆØÔ*Ñ*ØˆÜ×Ñœ.¨!Ó,€AØ�G‰G�D‹M€EÙØˆÜ
Ô×$Ñ$ QÓ'Ó(¨2Ñ-°Ò5ØˆÜ×Ñ˜R Ó#×+Ñ+¬N¸FÓCÐCr   c                 ór   — t        | xs d«      }|j                  «       rt        |«      r|S t        ||«      S )u/  æ­£æ–‡é¢„å¤„ç�†ï¼šâ‘  å‰¥å™ªå£°å�— â‘¡ çº¯æ–‡æœ¬æŒ‰è„šæœ¬ç™½å��å�•å�ˆå›žè¡Œå†…æ‹†ç¢Žã€‚

    âš ï¸� HTML æ­£æ–‡**ä¸�å�šä»»ä½•é‡�æŽ’** â€”â€” è§�ä¸Šæ–¹ã€Œå·²åºŸå¼ƒæ–¹æ¡ˆç•™æ¡£ã€�ï¼šæŠŠ <p> ç¢Žç‰‡å�ˆå›žä¼šæŠŠ
       çœŸè¡Œï¼ˆè¡¨æ ¼å�•å…ƒæ ¼/è�½æ¬¾/é™„ä»¶å��/æ—¥æœŸï¼‰ç²˜æˆ�ä¸€å�¨ï¼Œå®žæµ‹ä¸�å�¯è¡Œã€‚
    r   )rÃ  r   rà  r  )r’   r  r#   s      r	   Úprepare_bodyr	  ö  s3   € ô 	˜š˜bÓ!€AØ�7‰7Œ9œ QœØˆÜ˜Q Ó'Ð'r   u¿   (?:é¡¹ç›®)?(?:ä¼°ç®—)?(?:æ€»)?(?:æŠ•èµ„è§„æ¨¡|æŠ•èµ„æ€»é¢�|æ€»æŠ•èµ„é¢�|æŠ•èµ„é¢�|æŠ•èµ„ä¼°ç®—|å»ºè®¾æŠ•èµ„|å·¥ç¨‹æŠ•èµ„|æŠ•èµ„)[^0-9<>\n]{0,8}([0-9][0-9,ï¼Œ]*(?:\.[0-9]+)?)\s*(äº¿å…ƒ|ä¸‡å…ƒ)u0   æ€»æŠ•èµ„|æŠ•èµ„æ€»é¢�|æ€»æŠ•èµ„é¢�|æŠ•èµ„è§„æ¨¡c                 ó,  — t        j                  dd| xs d«      }t        t        j	                  |«      «      }|syt        d„ |D «       |d   «      }|j                  d«      j                  dd«      j                  dd«      |j                  d	«      z   S )
uh   æ­£æ–‡ â†’ '1010ä¸‡å…ƒ' / '87.2äº¿å…ƒ'ï¼›æŠ½ä¸�åˆ°è¿”å›ž ''ï¼ˆè°ƒç”¨æ–¹æ�®æ­¤å†³å®šæ˜¯å�¦æ˜¾ç¤ºè¯¥é¡¹ï¼‰z<[^>]{0,300}>r´   r   c              3   ój   K  — | ]+  }t         j                  |j                  d «      «      sŒ(|–— Œ- y­wr  )Ú_INVEST_PREFER_REr   r'   ©r^   rf   s     r	   ra   z%extract_investment.<locals>.<genexpr>  s&   è ø€ ÒD�AÔ0×7Ñ7¸¿¹À»
ÕCŒaÑDùs   ‚)3¬3r   r›   r	  u   ï¼Œrž   )r   r—   r5  Ú
_INVEST_REÚfinditerÚnextr'   rr   )Úcontentro   Úmsr(   s       r	   r)   r)     s   € ä
�‰Ð  g¢m°Ó4€AÜ	Œj×!Ñ! !Ó$Ó	%€BÙØÜÑD˜ÔDÀbÈÁeÓL€AØ�7‰7�1‹:×Ñ˜c 2Ó&×.Ñ.¨u°bÓ9¸A¿G¹GÀA»JÑFÐFr   af
  .dh{background:#fff;border-radius:8px;padding:24px;margin-bottom:16px;box-shadow:0 1px 3px rgba(0,0,0,.08)}.dh h1{font-size:28px;margin:0;color:#1a1a2e}.dht{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding-bottom:12px;margin-bottom:14px;border-bottom:1px solid #eef1f5}.dht h1{flex:1 1 auto;min-width:0}.dht-v{flex:0 0 auto;font-size:12.5px;color:#9096a0;line-height:1.7;white-space:nowrap}.dg{display:grid;grid-template-columns:1fr 1fr;gap:8px 32px;font-size:14px}.lb{color:#888;min-width:90px;flex-shrink:0}.ds{background:#fff;border-radius:8px;padding:20px 24px;margin-bottom:16px;box-shadow:0 1px 3px rgba(0,0,0,.08)}.ds h3{font-size:16px;margin-bottom:10px;padding-bottom:6px;border-bottom:2px solid #4361ee}.d-meta{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 18px;margin-top:12px;padding-top:12px;border-top:1px solid #eef1f5;font-size:13.5px;color:#5f6368}.d-meta .mi{display:inline-flex;align-items:baseline;gap:2px;max-width:100%;overflow-wrap:break-word}.d-meta .lb{min-width:0;color:#888}.d-meta .lnk{color:#1a73e8;text-decoration:none;font-weight:600}.d-meta .lnk:hover{text-decoration:underline}.d-meta .inv{color:#1a1a2e;font-weight:600}.d-meta .vis{color:#9096a0;font-size:12.5px}.d-visits{margin-top:10px;padding-top:10px;border-top:1px solid #eef1f5;color:#9096a0;font-size:12.5px}.ct{font-size:14px;line-height:1.8;color:#444;max-width:100%;overflow-wrap:break-word;word-break:break-word;overflow-x:auto;white-space:pre-line}.ct table{border-collapse:collapse;width:100%;margin:14px 0;font-size:14px}.ct td,.ct th{border:1px solid #ddd;padding:8px 12px;text-align:left;vertical-align:top}.ct tr:nth-child(even){background:#f9f9f9}.ct p{margin:12px 0;line-height:1.8}.ct-html{font-size:14px;line-height:1.8;color:#444;max-width:100%;overflow-wrap:break-word;word-break:break-word;overflow-x:auto}.ct-html p{margin:6px 0;line-height:1.8}.ct-html table{border-collapse:collapse;width:100%;margin:14px 0;font-size:14px}.ct-html td,.ct-html th{border:1px solid #ddd;padding:8px 12px;text-align:left;vertical-align:top}.ct-html tr:nth-child(even){background:#f9f9f9}.ct-html a{color:#1a73e8;text-decoration:none}.ct-html img{max-width:100%;height:auto;display:block;margin:8px 0;border-radius:8px}.ct a{color:#1a73e8;text-decoration:none}.ct img{max-width:100%;height:auto;display:block;margin:8px 0;border-radius:8px}.ds{overflow:hidden}.cc{border:1px solid #e8e8e8;border-radius:8px;padding:16px;margin-bottom:12px;background:#fafafa}.cc .cm{font-size:15px;font-weight:600;margin-bottom:4px}.cc .fd{display:grid;grid-template-columns:auto 1fr;gap:4px 12px;font-size:14px;margin-top:8px}.cl{color:#888}aÐ  body{font-family:-apple-system,"Microsoft YaHei",sans-serif;background:#f1f3f5;color:#333;margin:0}.wrap{max-width:1000px;margin:0 auto;padding:20px 20px 56px}.bk-bar{background:#fff;border:1px solid #e9ecef;border-radius:12px;padding:10px 16px;margin-bottom:16px;box-shadow:0 1px 3px rgba(0,0,0,.05);display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}a{color:#4361ee}.bk{display:inline-block;font-size:14px;text-decoration:none}r   c                 ó@  — d}t        |j                  d|j                  d|j                  dd«      «      «      «      }|d|z   dz   z  }|dz  }| dk(  rOd	D ]I  \  }}|j                  |d«      }|sŒ|d
vsŒ |dk(  rt        |«      }|d|z   dz   t        |«      z   dz   z  }ŒK nS| dk7  rNdD ]I  \  }}|j                  |d«      }|sŒ|d
vsŒ |dk(  rt        |«      }|d|z   dz   t        |«      z   dz   z  }ŒK |dz  }| dk(  �r�g }	|j                  d«      rT|d   xs dj                  «       j	                  «       dk7  r,|	j                  dt        t        |d   «      «      z   dz   «       |j                  d«      r#|	j                  dt        |d   «      z   dz   «       |j                  d«      r#|	j                  dt        |d   «      z   dz   «       |j                  d«      r#|	j                  dt        |d   «      z   dz   «       t        |j                  d«      «      }
|
r |	j                  dt        |
«      z   dz   «       |dkD  r |	j                  dt        |«      z   d z   «       |	r4|d!dj                  |	«      z   dz   z  }n|dkD  r|d"t        |«      z   d#z   z  }|dz  }| dk(  rüd$D ]4  \  }}|j                  |d«      }|sŒ|d%|z   d&z   t        |«      z   d'z   z  }Œ6 d(D ]4  \  }}|j                  |d«      }|sŒ|d%|z   d&z   t        |«      z   d'z   z  }Œ6 d)D ]4  \  }}|j                  |d«      }|sŒ|d%|z   d&z   t        |«      z   d'z   z  }Œ6 |j                  d*«      r|d+t        |d*   «      z   d'z   z  }|j                  d,«      r�|d-t        |d,   «      z   d'z   z  }nx|j                  d.«      r|d/t        |d.   «      z   d'z   z  }|j                  d0«      r|d1t        |d0   «      z   d'z   z  }|j                  d2«      r|d3t        |d2   «      z   d'z   z  }| dk(  r]|j                  d«      rLt        |d   |j                  d4«      «      }|j                  «       r|d5t        |«      rd6nd7z   d8z   |z   d'z   z  }| d9k(  r×|j                  d:«      r|d;t        |d:   «      z   d'z   z  }|j                  d<«      r|d=t        |d<   «      z   d'z   z  }|j                  d«      r)|d>t        |d   «      z   d?z   t        |d   «      z   d@z   z  }|j                  d«      r<t        |d   «      }|j                  «       r|d5t        |«      rd6nd7z   d8z   |z   d'z   z  }|j                  dAg «      }|�r3|dBz  }|D �]#  }|dCt        |j                  dDd«      «      z   dEz   z  }|j                  dF«      r|dGt        |dF   «      z   dHz   z  }|j                  dI«      r|dJt        |dI   «      z   dHz   z  }|j                  dK«      r|dLt        |dK   «      z   dHz   z  }|j                  dM«      r|dNt        |dM   «      z   dHz   z  }|j                  dO«      r|dPt        |dO   «      z   dHz   z  }|j                  dQ«      r|dQ   dRvr|dSt        |dQ   «      z   dHz   z  }|d'z  }�Œ& |dz  }|S )TuÆ   æ¸²æŸ“é¡¹ç›®æ­£æ–‡å�¡ç‰‡ï¼ˆè¯¦æƒ…é¡µä¸Žåˆ—è¡¨é¡µå�³ä¾§æŠ½å±‰å…±ç”¨ï¼Œ2026-09-10 æŠ½å‡ºï¼‰ã€‚

    ä¸�å�« <html>/<style>/é¡µå£³ â€”â€” è¯¦æƒ…é¡µ ?frag=1 æˆ– /api/item æ‹¿åˆ°çš„å°±æ˜¯æœ¬ç‰‡æ®µã€‚
    r   Úproject_namerw   Úowner_companyú%<div class="dh"><div class="dht"><h1>ú</h1></div>ú<div class="dg">Úznlh)©u   é¡¹ç›®ç¼–å�·Ú
project_id)u   å½“å‰�é˜¶æ®µr9  )u   æŠ•èµ„Úbudget©u   è¡Œä¸šr<  )u   åŒºåŸŸÚregion©u   çœ�ä»½Úprovince©u   åŸŽå¸‚Úcity©õ   å·¥ç¨‹ç±»åž‹Únature)õ   å� åœ°é�¢ç§¯Úarea)u   é‡‡è´­æƒ…å†µÚpurchase_status)u   ç«£å·¥æ—¥æœŸÚcompletion_date)u   æ�ƒé‡�Úweight)u   ä¸šä¸»ç±»åž‹Ú
owner_type©u   å�‘å¸ƒæ—¥æœŸÚpublish_date)õ   èµ„é‡‘æƒ…å†µÚfunding_status©õ   ä¸€ä¸€õ   â€”â€”r<  ú<div><span class="lb">õ   ï¼š</span><span>ú</span></div>Úcrawler)r  )u   ç‰ˆæœ¬ç±»åž‹Úversion_type)u   å�‘å¸ƒæ—¶é—´r-  ©u   é¡¹ç›®é˜¶æ®µr9  )u   å»ºè®¾å‘¨æœŸÚconstruction_period)õ	   æ€»æŠ•èµ„Útotal_investment)r$  Úproject_type)u   ç”²æ–¹æ€§è´¨Úowner_naturer  )u   è§„æ¨¡Úscaler  r!  )õ   è¯¦ç»†åœ°å�€Údetail_address©u   å»ºç­‘é�¢ç§¯Úbuilding_area©r&  Ú	land_area©u   è£…ä¿®Ú
decoration)u   ç”µæ¢¯Úelevator)rX   Úair_conditioningr´  rk   u8   <span class="mi"><span class="lb">è¡Œä¸šï¼š</span><span>z</span></span>r�  u8   <span class="mi"><span class="lb">æ�¥æº�ï¼š</span><span>r-  u>   <span class="mi"><span class="lb">å�‘å¸ƒæ—¶é—´ï¼š</span><span>r›  z<a class="mi lnk" href="u1   " target="_blank" rel="noopener">åŽŸæ–‡é“¾æŽ¥</a>r  uG   <span class="mi"><span class="lb">æŠ•èµ„é¢�ï¼š</span><span class="inv">r   z<span class="mi vis">u    æ¬¡è®¿é—®</span>z<div class="d-meta">z<div class="d-visits">u    æ¬¡è®¿é—®</div>))u   ä¼�ä¸šå��ç§°r  )u   æ³¨å†Œåœ°å�€Úregistered_address)u   æ³¨å†Œèµ„é‡‘Úregistered_capital)u   ä¼�ä¸šè´Ÿè´£äººÚcompany_contact)u   ä¸»è�¥ä¸šåŠ¡Úbusiness_scopeú<div class="ds"><h3>ú</h3><div class="ct">ú</div></div>))u   å»ºè®¾èƒŒæ™¯Ú
background)u   å»ºè®¾å†…å®¹Úconstruction_content)u   å·¥è‰ºè·¯çº¿Úprocess_route)u   å»ºè®¾åœ°ç‚¹Úconstruction_location)u   ç¤¾ä¼šæ•ˆç›ŠÚsocial_benefits))u   å·¥è‰ºè®¾å¤‡Úequipment_list)u   é…�å¥—è®¾æ–½è®¾å¤‡Úsupporting_equipment)u   å®¢æˆ·æ‰€éœ€è®¾å¤‡Úclient_needed_equipmentÚproject_progressu5   <div class="ds"><h3>é¡¹ç›®è¿›å±•</h3><div class="ct">Údetailu5   <div class="ds"><h3>ç‰¹æ®Šè¯´æ˜Ž</h3><div class="ct">rQ  u5   <div class="ds"><h3>å»ºè®¾å†…å®¹</h3><div class="ct">rU  uA   <div class="ds"><h3>é¡¹ç›®ä¸»è¦�é‡‡è´­è®¾å¤‡</h3><div class="ct">Úschedule_overviewu5   <div class="ds"><h3>å·¥æœŸæ¦‚è¿°</h3><div class="ct">Úscript_nameu1   <div class="ds"><h3>æ­£æ–‡å†…å®¹</h3><div class="zct-htmlrè   r³  r*   Úpub_dateu5   <div class="ds"><h3>å�‘å¸ƒæ—¥æœŸ</h3><div class="ct">rœ  u5   <div class="ds"><h3>æ�¥æº�ç«™ç‚¹</h3><div class="ct">u>   <div class="ds"><h3>åŽŸæ–‡é“¾æŽ¥</h3><div class="ct"><a href="z" target="_blank">z</a></div></div>r�  u(   <div class="ds"><h3>é¡¹ç›®è�”ç³»äºº</h3>ú <div class="cc"><div class="cm">r  ú</div><div class="fd">Úcontact_nameu'   <span class="cl">å§“å��ï¼š</span><span>r²  Ú
departmentu'   <span class="cl">éƒ¨é—¨ï¼š</span><span>Úpositionu'   <span class="cl">è�ŒåŠ¡ï¼š</span><span>r  u'   <span class="cl">æ‰‹æœºï¼š</span><span>Úaddressu'   <span class="cl">åœ°å�€ï¼š</span><span>Úremarks)r1  r2  r   u'   <span class="cl">å¤‡æ³¨ï¼š</span><span>)r“   r   Úind_cnr   r   r   r)   r�   r   r	  rà  )Údb_typer    Úpv_totalr£  ÚhÚ	proj_nameÚlblri   r#   Ú_bitsÚ_invÚ_bodyr�  rµ   s                 r	   Úrender_project_detail_bodyrm  $  s^  € ð
 	€Aô �A—E‘E˜.¨!¯%©%°¸¿¹¸ÐPRÓ9SÓ*TÓUÓV€Ið Ð	0°9Ñ	<¸}Ñ	LÑL€AØÐ	Ñ€Að �&Òð bò 	\‰GˆC�à—‘�c˜"“ˆAâ�QÐ1Ò1Ø˜*Ò$Ü˜q›	�AØÐ-¨cÑ1Ð2DÑDÄSÈÃVÑKÈOÑ[Ñ[‘ñ	\ð 
�IÒ	ð
 Uò 	\‰GˆC�à—‘�c˜"“ˆAâ�QÐ1Ò1Ø˜*Ò$Ü˜q›	�AØÐ-¨cÑ1Ð2DÑDÄSÈÃVÑKÈOÑ[Ñ[‘ð	\ð ˆ�M€Að �)Óàˆà�5‰5�Ô ! J¡-Ò"5°2×!<Ñ!<Ó!>×!DÑ!DÓ!FÈ'Ò!QØ�L‰LÐSÜœv a¨
¡mÓ4Ó5ñ6Ø8HñIô Jà�5‰5�Œ?Ø�L‰LÐSÜ˜q ™{Ó+ñ,Ø.>ñ?ô @à�5‰5�Ô Ø�L‰LÐYÜ˜q Ñ0Ó1ñ2Ø4DñEô Fà�5‰5�Œ<Ø�L‰LÐ3´c¸!¸E¹(³mÑCØNñOô Pä! !§%¡%¨	Ó"2Ó3ˆÙØ�L‰Lð .Ü03°D³	ñ:Ø<LñMô Nà�aŠ<Ø�L‰LÐ0´3°x³=Ñ@ÐCVÑVÔWÙØÐ'¨"¯'©'°%«.Ñ8¸8ÑCÑC‰Aà	�AŠà	Ð%¬¨H«Ñ5Ð8JÑJÑJˆàˆ�M€Að �&Òð Nò 	`‰GˆC�à—‘�c˜"“ˆAâ�!Ð-¨cÑ1Ð2IÑIÌ#ÈaË&ÑPÐQ_Ñ_Ñ_‘!ð		`ð Lò 	`‰GˆC�à—‘�c˜"“ˆAâ�!Ð-¨cÑ1Ð2IÑIÌ#ÈaË&ÑPÐQ_Ñ_Ñ_‘!ð		`ð Zò 	`‰GˆC�à—‘�c˜"“ˆAâ�!Ð-¨cÑ1Ð2IÑIÌ#ÈaË&ÑPÐQ_Ñ_Ñ_‘!ð		`ð �5‰5Ð#Ô$ aÐ+bÔcfÐghÐi{Ñg|Óc}Ñ+}ð  Mñ  ,Mñ  'M aà�5‰5�Œ?˜AÐ!XÔY\Ð]^Ð_gÑ]hÓYiÑ!iÐjxÑ!xÑx™Að �5‰5Ð'Ô(¨!Ð/fÔgjÐklð  nDñ  lEó  hFñ  0Fð  GUñ  0Uñ  +U¨!à�5‰5Ð!Ô" AÐ)lÔmpÐqrð  tDñ  rEó  nFñ  *Fð  GUñ  *Uñ  %U Aà�5‰5Ð$Ô% qÐ,cÔdgÐhiÐj}Ñh~ÓdÑ,ð  AOñ  -Oñ  (O qð �)Ò §¡ iÔ 0Ü˜Q˜y™\¨1¯5©5°Ó+?Ó@ˆØ�;‰;Œ=ØÐEÜ".¨uÔ"5‘Y¸4ñAàñà ñ!à#1ñ2ñ 3ˆAð �%Òà�5‰5�ÔàÐHÌ3ÈqÐQ[É}ÓK]Ñ]Ð`nÑnÑnˆAà�5‰5�ÔàÐHÌ3ÈqÐQ\É~ÓK^Ñ^ÐaoÑoÑoˆAà�5‰5�Œ<àÐQÔTWÐXYÐZ_ÑX`ÓTaÑaÐdxÑxÔ{~ð  @Að  BGñ  @Hó  |Iñ  Ið  L^ñ  ^ñ  ^ˆAà�5‰5�Ôä   9¡Ó.ˆEØ�{‰{Œ}ØÐIÜ&2°5Ô&9™¸tñEàñà$ñ%à'5ñ6ñ 7�ð �u‰u�Z Ó#€Hâà	Ð7Ñ7ˆàó 	 ˆAàÐ3´C¸¿¹¸iÈÓ8KÓ4LÑLÐMeÑeÑeˆAà�u‰u�^Ô$ aÐ+TÔUXÐYZÐ[iÑYjÓUkÑ+kÐluÑ+uÑ&u aà�u‰u�\Ô" AÐ)RÔSVÐWXÐYeÑWfÓSgÑ)gÐhqÑ)qÑ$q Aà�u‰u�ZÔ  !Ð'PÔQTÐUVÐWaÑUbÓQcÑ'cÐdmÑ'mÑ"m !à�u‰u�WŒ~˜qÐ$MÌcÐRSÐT[ÑR\ËoÑ$]Ð^gÑ$gÑg˜qà�u‰u�YÔ Ð&OÔPSÐTUÐV_ÑT`ÓPaÑ&aÐbkÑ&kÑ!k à�u‰u�YÔ A i¡LÐ8NÑ$NÐPQÐU~ô  @Cð  DEð  FOñ  DPó  @Qñ  VQð  R[ñ  V[ñ  Q[ÐPQà�ÑŠAð!	 ð$ 	
ˆX‰ˆØ€Hr   rø   rÎ   éZ   im  )rú   Ú3drû   rü   Ú90dÚ1yc                 ó¶   — 	 t        j                  | xs d›d|›�j                  d«      «      j                  «       j	                  d«      S # t
        $ r Y yw xY w)Nr   ú|úutf-8ú=©Úbase64Úurlsafe_b64encodeÚencodeÚdecodeÚrstripr…   ©ÚpubrS  s     r	   Ú_enc_cursorr~  ô  sU   € ðÜ×'Ñ'°C²I¸2±I¹sÐ)C×(KÑ(KÈGÓ(TÓU×\Ñ\Ó^×eÑeÐfiÓjÐjøÜò Ùðúó   ‚A	A Á	AÁAc                 óø   — | sy	 t        j                  | dt        | «       dz  z  z   j                  «       «      j	                  dd«      }|j                  dd«      \  }}|t        |«      fS # t        $ r Y yw xY w©Nrë   ru  ry  rt  Úignorers  r›   )rw  Úurlsafe_b64decoder]   ry  rz  ÚrsplitÚintr…   ©Úcurr’   r}  rS  s       r	   Ú_dec_cursorrˆ  û  s}   € ÙØðÜ×$Ñ$ c¨C´C¸³H°9¸q±=Ñ,AÑ&A×%IÑ%IÓ%KÓL×SÑSÐT[Ð]eÓfˆØ—8‘8˜C Ó#‰ˆˆSØ”C˜“Hˆ}ÐøÜò Ùðús   …A'A- Á-	A9Á8A9)u   æœ‰é™�å…¬å�¸u   æœ‰é™�è´£ä»»å…¬å�¸u   è‚¡ä»½æœ‰é™�å…¬å�¸u   é›†å›¢u   å…¬å�¸u	   ç ”ç©¶é™¢r   u   å¤§å­¦u   åŒ»é™¢u   é“¶è¡Œu	   äº‹ä¸šéƒ¨u   æ€»å±€é   i N  i   c                 óÐ   — t        | «      }d}|�B	 t        |j                  d|t        dz   f«      j	                  «       «      }|t        kD  rd}||fS ||fS # t
        $ r Y ||fS w xY w)uq  æŒ‰å‘½ä¸­è§„æ¨¡é€‰ FTS è°“è¯�å½¢æ€� â†’ (SQL ç‰‡æ®µ, å�‚æ•°)ã€‚

    2026-09-10 å®žæµ‹ï¼šä¸¤ç§�å½¢æ€�**äº’è¡¥**ï¼Œä¸�å­˜åœ¨é€šå�ƒçš„å†™æ³•â€”â€”
      Â· ç¨ å¯†ï¼ˆ>4000 å‘½ä¸­ï¼‰ï¼šç›¸å…³ EXISTS `EXISTS(SELECT 1 FROM gov_search g WHERE g.rowid=r.id
        AND gov_search MATCH ?)` æ²¿æ—¥æœŸç´¢å¼•æ‰«ã€�**å‡‘æ»¡ 31 è¡Œå�³å�œ** â†’ "å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·"
        (11.1 ä¸‡å‘½ä¸­) 0.286sï¼›æ­¤å½¢æ€�åœ¨ç¨€ç–�è¯�ä¸Šä¼šé€€åŒ–æˆ�å…¨è¡¨æ‰«ï¼ˆå�Œå½¢æŸ¥è¯¢ 271s / 35s / 27sï¼‰ã€‚
      Â· ç¨€ç–�ï¼ˆâ‰¤4000 å‘½ä¸­ï¼‰ï¼š`r.id IN (SELECT rowid FROM gov_search WHERE gov_search MATCH ?)`
        ç‰©åŒ–å°�é›†å�ˆ â†’ "çŽ¯å¢ƒå½±å“�æŠ¥å‘Šä¹¦å…¨æ–‡å…¬ç¤º"(70) 0.013s / å…¨ç§°(793) 0.138sï¼›
        æ­¤å½¢æ€�åœ¨ç¨ å¯†è¯�ä¸Šè¦�ç‰©åŒ– 11 ä¸‡ rowid â†’ 12.4sã€‚
    æŽ¢æµ‹ç”¨ `LIMIT _FTS_DENSE_PROBE+1`ï¼šç¨ å¯†è¯�æ��å‰�å�œæ­¢ï¼ˆä¾¿å®œï¼‰ï¼Œç¨€ç–�è¯�é��åŽ†å°� doclistï¼ˆä¹Ÿä¾¿å®œï¼‰ã€‚
    z?r.id IN (SELECT rowid FROM gov_search WHERE gov_search MATCH ?)z=SELECT rowid FROM gov_search WHERE gov_search MATCH ? LIMIT ?r›   zMEXISTS (SELECT 1 FROM gov_search g WHERE g.rowid=r.id AND gov_search MATCH ?))r½   r]   r‚   Ú_FTS_DENSE_PROBErÝ   r…   )Útermr‡  ÚsqÚfragÚns        r	   Ú	_fts_predr�    sŒ   € ô 
˜DÓ	!€Bð M€DØ
€ð	Ü�C—K‘KÐ _Ø!#Ô%5¸Ñ%9Ð :ó<ß<D¹H»JóHˆAàÔ#Ò#Øf�ð �ˆ8€Oˆ4�ˆ8€Oøô ò 	ØØ�ˆ8€Oð	ús   ‘=A Á	A%Á$A%c           	      óº  ‡— g g }}| xs dj                  «       Š‰s||fS t        ‰«      rt        ‰«      ng }t        ‰«      dk\  xr t	        ˆfd„t
        D «       «      }|r:t        ‰|«      \  }}|j                  d|z  «       |j                  ‰|g«       ||fS |rÜt        |«      t        k  rÊd}|D ]F  }	|€d} n@	 t        |j                  d|	t        dz   f«      j                  «       «      t        k  rd} nŒH |r1|j                  d	d
j                  dgt        |«      z  «      z  «       n5dj                  dgt        |«      z  «      }
|j                  d|
z   dz   «       |j                  |«       ||fS t        t        j                   dd‰«      «      dk\  r:t        ‰|«      \  }}|j                  d|z  «       |j                  ‰|g«       ||fS t        ‰«      dk\  r5t        ‰|«      \  }}|j                  |«       |j                  |«       ||fS |j                  d«       |j                  d‰z   dz   gdz  «       ||fS # t        $ r d}Y  �Œ\w xY w)u»  å�•ä¸ªå…³é”®è¯� â†’ (SQL ç‰‡æ®µåˆ—è¡¨, å�‚æ•°åˆ—è¡¨)ï¼›ç‰‡æ®µä¹‹é—´ ANDã€‚

    è·¯å¾„ï¼ˆ2026-09-10 é€�ä¸ªå®žæµ‹é€‰å®šï¼Œæ”¹ä¹‹å‰�å…ˆè·‘ scripts/keyset_bench.pyï¼‰ï¼š
      1) **å®Œæ•´å®žä½“å…¨ç§°**ï¼ˆlenâ‰¥6 ä¸”å�« æœ‰é™�å…¬å�¸/é›†å›¢/ç ”ç©¶é™¢â€¦ï¼‰â†’ gov_entity ç²¾ç¡®ç´¢å¼•
         `r.id IN (SELECT doc_id FROM gov_entity WHERE etype='company' AND value=?)` âˆª FTSã€‚
         ç²¾ç¡®è¯­ä¹‰ï¼ˆç”¨æˆ·åŽŸåˆ™ï¼šå®žä½“ç²¾ç¡®ç´¢å¼• > bigramï¼‰ï¼Œå®žæµ‹ 0.09~0.20s
      2) å…¶ä»–ä¸­æ–‡è¯�ï¼ˆ2-gram æ•° â‰¤16ï¼‰â†’ gov_bigram **å…¨ gram äº¤é›†**ï¼šé«˜é¢‘é•¿è¯� 0.001~0.021sã€�
         ç¨€ç–�é•¿è¯� 0.43~0.67sã€�0 å‘½ä¸­ 0.36sï¼ˆæ—§å†™æ³•å�Œè¯� 271sï¼‰
      3) é•¿æ•°å­—ä¸²ï¼ˆâ‰¥7 ä½�ï¼Œç–‘ä¼¼ç”µè¯�ï¼‰â†’ gov_entity(etype='phone') OR FTS
      4) å…¶ä»–ï¼ˆè‹±æ–‡/è¶…é•¿è¯�ï¼‰â†’ FTSï¼Œç¨ å¯†/ç¨€ç–�ç”± _fts_pred è‡ªåŠ¨é€‰å½¢æ€�
      5) æ— ä¸­æ–‡çŸ­è¯�ï¼ˆ<3 å­—ï¼‰â†’ LIKE

    âš ï¸� ä¸‰æ�¡å®žæµ‹é“�å¾‹ï¼ˆè¿�å��ä»»ä¸€æ�¡éƒ½æ˜¯ 10~270 å€�çº§é€€åŒ–ï¼‰ï¼š
      Â· gov_search **ä¸¥ç¦�**æ— æ�¡ä»¶ç”¨ç›¸å…³å­�æŸ¥è¯¢ EXISTS(... MATCH ?)ï¼šç¨ å¯†è¯�å¿«ï¼ˆ0.29sï¼‰ä½†
        ç¨€ç–�è¯� 271sï¼›å��ä¹‹ IN ç‰©åŒ–ç¨€ç–�å¿«ï¼ˆ0.013sï¼‰è€Œç¨ å¯† 12.4s â†’ å¿…é¡»æŽ¢æµ‹å�ŽäºŒé€‰ä¸€ã€‚
      Â· gov_entity **ä¸€å¾‹ç”¨ IN(...) ç‰©åŒ–**ï¼Œå‹¿ç”¨ç›¸å…³ EXISTSï¼ˆå®žä½“ 0 å‘½ä¸­æ—¶è®¡åˆ’å´©å��ï¼Œ
        6.5s â†’ IN 0.006sï¼‰ï¼›ä¸”**å¿…é¡»å¸¦ etype**ï¼ˆä¸�å¸¦ 0.362s / å¸¦ 0.090sï¼‰ã€‚
      Â· **ä¸¥ç¦�** OR `r.title LIKE '%<è¯�>%'`ï¼ˆå®žæµ‹ 83s / 80sï¼Œå…¨è¡¨é€�è¡Œ LIKEï¼‰ã€‚
    r   rw  c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr\   rd   )r^   r’   ro   s     €r	   ra   z#_list_term_preds.<locals>.<genexpr>H  s   øè ø€ Ò$F° Q¨!¤VÑ$Fùrp   zQ(r.id IN (SELECT doc_id FROM gov_entity WHERE etype='company' AND value=?) OR %s)FTz1SELECT rowid FROM gov_bigram WHERE gram=? LIMIT ?r›   z(r.id IN (%s))z INTERSECT z)SELECT rowid FROM gov_bigram WHERE gram=?r  zCEXISTS (SELECT 1 FROM gov_bigram b WHERE b.rowid=r.id AND b.gram=?)r±   r²   r  rø   zO(r.id IN (SELECT doc_id FROM gov_entity WHERE etype='phone' AND value=?) OR %s)rm   r  r  )r   r
   r§   r]   ru   Ú_ENTITY_SUFFIXESr�  r   r£   Ú_LIST_GRAM_CAPr‚   Ú_LIST_GRAM_IN_MAXrÝ   r…   r   r   r—   )rŒ  r‡  Úfragsr=  r¦   Ú
ent_suffixÚfr�  Ú_sparseÚ_gÚbro   s              @r	   Ú_list_term_predsrœ  /  s‹  ø€ ð( ˜ˆ6€EØ	Š�×ÑÓ€AÙØ�fˆ}ÐÜ.¨qÔ1ŒK˜ŒN°r€EÜ�Q“˜1‘ÒF¤Ó$FÔ5EÔ$FÓ!F€JÙô ˜!˜SÓ!‰ˆˆ2Ø�‰ÐhÐklÑlÔmØ�‰�q˜"�gÔðd �&ˆ=Ðñc 
”3�u“:¤Ò/ð  ˆØò 	ˆBØˆ{Ø�ÙðÜ�s—{‘{Ð#VØ$&Ô(9¸AÑ(=Ð#>ó@ß@HÁÃ
óLÜO`òaà"�GÙðað	ñ à�L‰LÐ)¨M×,>Ñ,>Ø<Ð=ÄÀEÃ
ÑJó-Lñ Lõ Mð —‘ÐcÐdÔgjÐkpÓgqÑqÓrˆAØ�L‰L˜˜q™ 3™Ô'Ø�‰�eÔð �&ˆ=Ðô 
ŒR�V‰V�E˜2˜qÓ!Ó	" aÒ	'Ü˜!˜SÓ!‰ˆˆ2Ø�‰ÐfÐijÑjÔkØ�‰�q˜"�gÔð �&ˆ=Ðô 
ˆQ‹�1ŠÜ˜!˜SÓ!‰ˆˆ2Ø�‰�QŒØ�‰�bÔð �&ˆ=Ðð 	�‰ÐRÔSØ�‰�s˜Q‘w ‘}�o¨Ñ)Ô*Ø�&ˆ=Ðøô/ ò Ø�Ûðús   Â>;I
É
IÉIc                 ó  — 	 t        dt        t        |xs d«      d«      «      }t	        «       }t
        j                  |_        |j                  «       }	g g }}
t        j                  |«      }|r|
j                  d|z  «       t        d|«      \  }}|r"|
j                  |«       |j                  |«       |xs dj                  «       rnt        j                   d|j                  «       «      D �cg c]  }|sŒ|‘Œ	 c}dd	 D ]3  }t#        ||	«      \  }}|
j                  |«       |j                  |«       Œ5 t%        t        j                   d|xs dj                  «       «      D �cg c]  }|sŒ|‘Œ	 c}dd
 d«      \  }}|r"|
j                  |«       |j                  |«       t'        t)        t+        «       «      d«      \  }}|r"|
j                  |«       |j                  |«       d\  }}| rt-        | «      \  }}d}d}|�S|dk(  r'|
j                  d«       |j                  ||g«       d}nÙ|
j                  d«       |j                  ||g«       d}n²d}|r®t/        |xs dj                  «       «      }	 |xs dj                  «       s||s=|	j1                  d|
rddj3                  |
«      z   ndz   |«      j5                  «       d   }n=|	j1                  ddj3                  |
«      z   dz   |«      j5                  «       d   }|dk\  }d|
rddj3                  |
«      z   ndz   dz   |z   dz   }	 |	j1                  |||dz   gz   «       |	j7                  «       D �cg c]  }t9        |«      ‘Œ }}|j;                  «        t=        |«      |kD  }|r|d| }|dk(  r|j?                  «        d„ } |D �!cg c�]À  }!tA        |!d   «      |!j                  d«      xs dj                  «       |!j                  d «      xs dj                  «       |!j                  d!«      xs ddd" |!j                  d#«      xs dj                  «       d$vr0tC        |!j                  d#«      xs dj                  «       «      d%d&œgng |!j                  d'«      xs dj                  «       r'|!j                  d'«      xs dj                  «       dd&œgng z   |!j                  d(«      snd)d*d&œgng z   |!j                  d'«      xs dj                  «       |!j                  d#«      xs dj                  «       |!j                  d+«      xs |!j                  d,«      xs dj                  «       |!j                  d(«      xs d | |!«      d-œ
‘�ŒÃ }"}!|"rtE        |"d.   d/   |"d.   d   «      nd}#|"rtE        |"d   d/   |"d   d   «      nd}$|"|r|#nd|$|||t=        |"«      d0œS # t        $ r d}Y �Œ®w xY wc c}w c c}w # t        $ r d}Y �Œæw xY wc c}w # t        $ r g }Y �Œ™w xY wc c}!w )1uÛ   çŽ¯è¯„å…¬ç¤ºåˆ—è¡¨æ•°æ�®ï¼ˆkeyset æ¸¸æ ‡åˆ†é¡µï¼Œæ— é™�æ»šåŠ¨ä¸“ç”¨ï¼‰ã€‚

    è¿”å›ž {items, next_cursor, prev_cursor, has_more, total}
    items å…ƒç´ ï¼š{id, title, site, date, cat, ind, url, excerpt, has_table}
    r›   rÎ   é<   zrr.publish_date >= date('now','localtime','-%d days') AND r.publish_date GLOB '20[0-9][0-9]-[0-9][0-9]-[0-9][0-9]*'ú
r.industryr   ú[,\s]+Nry  rÌ   úr.rë   FrÂ  z(r.publish_date, r.id) > (?, ?)zr.publish_date ASC, r.id ASCz(r.publish_date, r.id) < (?, ?)zr.publish_date DESC, r.id DESCzSELECT COUNT(*) FROM gov_raw rú WHERE r  r   z7SELECT COUNT(*) FROM (SELECT r.id FROM gov_raw r WHERE z4 ORDER BY r.publish_date DESC, r.id DESC LIMIT 5001)i‰  zçSELECT r.id, r.title, r.site_name, r.publish_date, r.page_url, r.source_url, r.category, r.industry, r.has_table, SUBSTR(COALESCE(r.summary,""),1,300) AS _s, SUBSTR(COALESCE(r.content,""),1,1200) AS _c, r.script_name FROM gov_raw rr  ú LIMIT ?c                 óÔ  — t        | j                  d«      xs | j                  d«      xs d| j                  d«      «      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  d	d|«      }t        j                  d
d|«      j	                  «       }t        d«      D ]!  }t        j                  d|«      }||k(  r n|}Œ# t        |«      }| j                  d«      xs dj	                  «       }t        |«      dk\  r7|j                  |«      r&t        |t        |«      d  j                  d«      «      }|d d S )NÚ_cÚ_sr   r[  z<[^>]+>r´   z<[^>]*$ú&&nbsp;|&amp;|&lt;|&gt;|&#\d+;|&[a-z]+;z[<>"=]r·   rm   rw   rÌ   u    Â·â€”-_|ã€�é´   )r	  r   r   r—   r   r¤   Ú_EXC_LEAD_RErÝ  r]   rª   rÐ  )r  r   Útxtr  Ú_nxtrY  s         r	   Ú_excerptzbrowse_items.<locals>._excerptð  s3  € Ü˜1Ÿ5™5 ›;Ò;¨!¯%©%°«+Ò;¸¸Q¿U¹UÀ=Ó=QÓRˆÜ�f‰f�Z  cÓ*ˆÜ�f‰f�Z  cÓ*ˆÜ�f‰fÐ>ÀÀSÓIˆÜ�f‰f�Y  SÓ)ˆÜ�f‰f�V˜S #Ó&×,Ñ,Ó.ˆÜ�q“ò 	ˆAÜ×#Ñ# B¨Ó,ˆDØ�sŠ{ÙØ‰Cð		ô
 $ CÓ(ˆð
 �e‰e�G‹nÒ" ×)Ñ)Ó+ˆÜˆr‹7�aŠ<˜CŸN™N¨2Ô.ä'¨¬C°«G¨H¨×(<Ñ(<¸^Ó(LÓMˆCØ�4�CˆyÐr   r+   rw   rœ  r-  r|   r<  )r   rk   Úind©r#   rµ   r:  Ú	has_tableu   è¡¨æ ¼Útbr™  rš  )
r+   rw   ÚsiteÚdateÚtagsÚcatr­  r›  r¯  ÚexcerptrÆ   r²  ©ÚitemsÚnext_cursorÚprev_cursorrL  rD  Útotal_truncatedr  )#ÚmaxÚminr…  r…   rÂ   r   rÀ   rÁ   r.  Ú	LIST_DAYSr   r   Ú_ind_in_clauser£   r   r   r   rœ  Ú_whitelist_like_predÚ_block_like_predÚ	_split_kwÚadmin_block_kwrˆ  r   r‚   r   r1  rÝ   r2  r„   r]   rÓ   r�   rd  r~  )%r.  r§  Ú	directionr;  r<  rZ   r«   Ú
with_totalr‡   rµ   ro  r=  r@  Ú	_ind_fragÚ_ind_paramsrf   ro   r˜  r    Ú_kw_fragÚ
_kw_paramsÚ_bk_fragÚ
_bk_paramsÚcdÚcirD  rº  ÚorderÚ_kw_onÚsqlræ   rL  r¬  r  r·  ÚnxtÚprvs%                                        r	   Úbrowse_itemsrÒ  „  sý  € ðÜ�A”sœ3˜uš{¨Ó+¨RÓ0Ó1ˆô ‹8€DÜ—{‘{€DÔØ�‰‹€AØ˜ˆ6€Eä�=‰=˜Ó#€DÙà�‰ð UØW[ñ\ô 	]ä+¨L¸(ÓCÑ€Iˆ{ÙØ�‰�YÔØ�‰�kÔ"ð 	
ŠˆR‡�ÔÜŸX™X i°·±³Ó;ÖA˜ºq’!ÒAÀ"À1ÐEò 	ˆAÜ# A qÓ)‰DˆAˆqØ�L‰L˜ŒOØ�M‰M˜!Õð	ô 0Ü—H‘H˜Y¨ª¨r×(8Ñ(8Ó(:Ó;ÖAˆqºqŠÒAÀ"À1ÐEÀtóMÑ€HˆjáØ�‰�XÔØ�‰�jÔ!ô ,¬I´nÓ6FÓ,GÈÓNÑ€HˆjÙØ�‰�XÔØ�‰�jÔ!ð �F€BˆÙÜ˜VÓ$‰ˆˆBØ€EØ€OØ	€~Ø˜ÒØ�L‰LÐ:Ô;Ø�M‰M˜2˜r˜(Ô#Ø2‰Eà�L‰LÐ:Ô;Ø�M‰M˜2˜r˜(Ô#Ø4‰Eà0ˆÙÜ˜2š8 ×*Ñ*Ó,Ó-ˆFðØš˜R—‘Ô(Ù!à !§	¡	Ð*JÙPU¨Y¸¿¹ÀeÓ9LÒ-LÐ[]ñ+_à*0ó!2ç2:±(³*¸Qñ!@™ð !"§	¡	ØUØ%Ÿl™l¨5Ó1ñ2àTñUð #ó	!$÷ %-¡H£J¨qñ	!2˜ð
 +0°4©-˜ð
Wñ 27ˆi˜'Ÿ,™, uÓ-Ò-¸Bñ@ð ñð "ñ"ð %/ñ/€CðØ	�	‰	�#�v ¨¡ Ñ+Ô,Ø!"§¡£Ö.˜A”�Q•Ð.ˆÐ.ð 	‡J�J„Lä�4‹y˜5Ñ €HÙØ�F�Uˆ|ˆØ�FÒØ�‰ŒòðP ÷#ð" ô! �!�D‘'‹lØ—%‘%˜“.Ò& B×-Ñ-Ó/Ø—‘�{Ó#Ò) r×0Ñ0Ó2Ø—%‘%˜Ó'Ò-¨2¨s°Ð3ð —U‘U˜:Ó&Ò,¨"×3Ñ3Ó5¸]ÑJô  §¡ jÓ 1Ò 7°R×>Ñ>Ó@ÓAÈÑNÑOØPRà—u‘u˜ZÓ(Ò.¨B×5Ñ5Ô7ð Ÿ5™5 Ó,Ò2°×9Ñ9Ó;À"ÑEÑFØ=?ñAð 56·E±E¸+Ô4FÈ!˜(¨Ñ.Ñ/ÐRTñ	Vð
 —‘�jÓ!Ò' R×.Ñ.Ó0Ø—‘�jÓ!Ò' R×.Ñ.Ó0Ø—‘�jÓ!Ò> Q§U¡U¨<Ó%8Ò>¸B×EÑEÓGØ—U‘U˜;Ó'Ò,¨1Ù˜A“;ô!ð €Eð ñ$ >CŒ+�e˜B‘i Ñ'¨¨r©°4©Ô
9È€CÙ;@Œ+�e˜A‘h˜vÑ&¨¨a©°©Ô
7Àb€CØ±(©3ÀÐSVØ ¨5À_Ü˜“Zñ!ð !øô] ò Ø‹ðüò& Bùò 	Bøôb ò Ø“ðüò /øÜò Ø‹ðüòBsg   ‚#W Ã0WÃ8WÅ'WÅ/WÉ9BW! Ì.+W8 ÍW3Í+W8 Î.GX
×W×W×!W0×/W0×3W8 ×8XØXc           	      ó¨  ‡‡‡— | xs dj                  «       } t        | «      dk  rg ddœS 	 t        dt        t	        ‰xs d«      d«      «      Šg Š	 t        j                  t        d¬	«      }t        j                  |_
        |j                  «       Š	 g g }}t        j                  d
| «      D �cg c]  }|sŒ|‘Œ	 c}dd D ]3  }t        |‰«      \  }}|j                  |«       |j                  |«       Œ5 ˆˆˆfd„}	 |	||«       ‰ssg g }}
t        j                  d
| «      D �cg c]  }|sŒ|‘Œ	 c}dd D ]9  }t!        |‰«      \  }}|
j#                  d|z   dz   «       |j#                  |«       Œ;  |	|
|«       |j%                  «        	 ‰ddœS # t
        $ r dŠY �ŒQw xY wc c}w c c}w # |j%                  «        w xY w# t
        $ r g ŠY ŒCw xY w)uL  âŒ˜K å¿«é€Ÿæ�œç´¢ï¼ˆcrawlerï¼‰ã€‚è¿”å›žç²¾ç®€å­—æ®µï¼Œ**ä¸�å�šç²¾ç¡®è®¡æ•°**ã€‚

    2026-09-11 æ€§èƒ½é‡�å†™ï¼ˆå®žæµ‹ 28~48s â†’ 0.01~0.7sï¼‰ï¼š
    åŽŸå®žçŽ°ç›´æŽ¥è°ƒ search()ï¼Œä¸­æ–‡å¤§è¯�ï¼ˆã€ŒçŽ¯å¢ƒå½±å“�è¯„ä»·ã€�å‘½ä¸­ 12.8 ä¸‡è¡Œï¼‰ä¼š
      â‘  å…ˆè·‘ä¸€æ¬¡ JOIN gov_raw çš„å…¨é‡� COUNTï¼ˆå�ªä¸ºæ˜¾ç¤ºæ€»æ•°ï¼Œ12 ä¸‡æ¬¡å›žè¡¨ï¼‰ï¼Œ
      â‘¡ å†� ORDER BY r.publish_date DESC å¯¹**å…¨éƒ¨å‘½ä¸­**å›žè¡¨æŽ’åº�ï¼›
    æœºå™¨ä¸Šæœ‰çˆ¬è™«å¹¶å�‘å†™ search.db æ—¶å®žæµ‹ 28~48s â†’ âŒ˜K å¼¹å±‚å�¡æ­»ï¼ˆ48s æ‰�å‡ºç»“æžœï¼‰ã€‚
    çŽ°æ”¹ç”¨åˆ—è¡¨é¡µ v2 å·²éªŒè¯�çš„ _list_term_predsï¼ˆentity/bigram ç´¢å¼•ï¼›FTS æŒ‰å‘½ä¸­è§„æ¨¡
    è‡ªåŠ¨äºŒé€‰ IN ç‰©åŒ– / ç›¸å…³ EXISTSï¼‰+ publish_date ç´¢å¼•æµ�å¼�æ‰«æ��ï¼Œ**å‡‘æ»¡ N æ�¡å�³å�œ**ã€‚

    è¯­ä¹‰å·®å¼‚ï¼ˆåˆ»æ„�ï¼‰ï¼štotal æ�’ä¸º 0 â€”â€” ä¸�å†�ä¸ºå¼¹å±‚æ•° 12.8 ä¸‡æ�¡ï¼›å‰�ç«¯å�ªåœ¨ total ä¸ºçœŸæ—¶
    æ¸²æŸ“ã€Œå…± N æ�¡åŒ¹é…�ï¼Œå‰� N æ�¡ã€�ï¼Œå› æ­¤æœ¬è·¯ç”±é€€åŒ–ä¸ºä¸�æ˜¾ç¤ºè¯¥è®¡æ•°æ��ç¤ºï¼ˆå…¶ä½™è·¯ç”±ç…§æ—§ï¼‰ã€‚
    å�¦ï¼šä¸�å¥—ç®¡ç�†é¡µç™½å��å�• â€”â€” ä¸Žæ”¹åŠ¨å‰�ä¸€è‡´ï¼ˆåŽŸå®žçŽ°ä¹Ÿæ²¡å¥—ï¼‰ï¼ŒâŒ˜K æ˜¯å¯¼èˆªå…¥å�£ä¸�æ˜¯åˆ—è¡¨é¡µã€‚
    r   rž   r   ©r·  rD  r›   rÍ   rÎ   r|   r}   r   Nry  c           	      óD  •— | sy ‰j                  ddj                  | «      z   dz   |‰gz   «       ‰j                  «       D ]^  }‰j                  t	        |d   «      |d   xs dj                  «       d d |d   xs dj                  «       d d	 |d
   xs dd d dœ«       Œ` y )NzGSELECT r.id, r.title, r.site_name, r.publish_date FROM gov_raw r WHERE r  z% ORDER BY r.publish_date DESC LIMIT ?r+   rw   r   éx   rœ  é(   r-  r|   ©r+   rw   r±  r²  )r‚   r   rÝ   r   r�   r   )Ú
where_listÚplistr  rµ   r§  r"   s      €€€r	   Ú_fetchz list_quicksearch.<locals>._fetchA  s½   ø€ Ù!ØØ—	‘	ð $Ø&-§l¡l°:Ó&>ñ?àCñDàEJÈeÈWÁ_ôVð Ÿ™›ò �AØ—J‘Jä! ! D¡'›lØ"# G¡*Ò"2°×!9Ñ!9Ó!;¸D¸SÐ!AØ!" ;¡Ò!5°2× <Ñ <Ó >¸sÀÐ CØ!" >Ñ!2Ò!8°b¸#¸2Ð >ñ õ ñr   r±   r²   )r   r]   r»  r¼  r…  r…   r   r€   r�   rÀ   rÁ   r.  r   r   rœ  r£   r�  r   r„   )r«   r§  r‡   ro  r=  rf   ro   r˜  r    rÛ  Ú_fwÚ_fpÚ_fÚ_prµ   r"   s    `            @@r	   Úlist_quicksearchrà     sÀ  ú€ ð 
Šˆb�‰Ó€AÜ
ˆ1ƒv�‚zØ aÑ(Ð(ðÜ�A”sœ3˜uš{¨Ó+¨RÓ0Ó1ˆð €Cð'Ü�‰œw°Ô3ˆÜ"Ÿ;™;ˆÔØ�K‰K‹Mˆð!	Ø �6ˆEÜ!#§¡¨)°QÓ!7Ö=˜Aº1’aÒ=¸b¸qÐAò !�Ü'¨¨1Ó-‘��1Ø—‘˜Q”Ø—‘˜aÕ ð!öñ �5˜&Ô!Ùð ˜r�S�Ü%'§X¡X¨i¸Ó%;ÖA ºqš!ÒAÀ"À1ÐEò #�AÜ& q¨!›_‘F�B˜Ø—J‘J˜s R™x¨#™~Ô.Ø—J‘J˜r•Nð#ñ �s˜CÔ à�J‰J�Lð  1Ñ%Ð%øôW ò Ø‹ðüò >ùò2 Bøð �J‰J�LûÜò ØŠðúsh   ¬#F ÁA G ÂF. Â/F$Â7F$Â;A*F. Ä%F)Ä-F)Ä1AF. Å<G ÆF!Æ F!Æ$
F. Æ.G Ç G ÇGÇGuì!  <style>
*{box-sizing:border-box}
body{margin:0;background:#f1f3f5;color:#202124;font-family:-apple-system,BlinkMacSystemFont,"Microsoft YaHei","PingFang SC",sans-serif;overflow:hidden}
.lp-head{height:58px;display:flex;align-items:center;gap:14px;padding:0 18px;background:#fff;border-bottom:1px solid #e6e9ed;position:fixed;top:0;left:0;right:0;z-index:60}
.lp-logo{font-weight:700;color:#1a73e8;font-size:17px;text-decoration:none;letter-spacing:-.4px}
.lp-search{flex:1;max-width:520px;position:relative}
.lp-search input{width:100%;padding:9px 74px 9px 14px;border:1px solid #dfe3e8;border-radius:10px;font-size:13.5px;outline:none;background:#f8f9fb}
.lp-search input:focus{border-color:#1a73e8;background:#fff;box-shadow:0 0 0 3px rgba(26,115,232,.12)}
.lp-search .lp-kbd{position:absolute;right:9px;top:6px;font-size:11px;color:#8a9099;border:1px solid #e0e4e9;border-radius:6px;padding:2px 7px;background:#fff}
.lp-chips{display:flex;gap:5px;align-items:center;flex-wrap:nowrap}
.lp-chip{padding:5px 11px;border:1px solid #dfe3e8;border-radius:999px;background:#fff;font-size:12.5px;color:#3c4043;text-decoration:none;cursor:pointer;white-space:nowrap}
.lp-chip:hover{background:#eef4ff;border-color:#1a73e8;color:#1a73e8}
.lp-chip.act{background:#1a73e8;border-color:#1a73e8;color:#fff;font-weight:600}
.lp-ind{padding:6px 9px;border:1px solid #dfe3e8;border-radius:9px;font-size:12.5px;background:#fff;outline:none;max-width:150px}
/* â”€â”€ è¡Œä¸šå¤šé€‰ï¼ˆæŒ‰é’® + å¼¹å±‚å¤�é€‰æ¡†ï¼‰â”€â”€ */
.lp-indwrap{position:relative}
.lp-indbtn{width:100%;padding:7px 10px;border:1px solid #dfe3e8;border-radius:9px;font-size:12.5px;background:#fff;cursor:pointer;color:#3c4043;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-family:inherit}
.lp-indbtn:hover{background:#eef4ff;border-color:#1a73e8;color:#1a73e8}
.lp-indbtn.on{border-color:#1a73e8;color:#1a73e8;font-weight:600;background:#eef4ff}
.lp-indpop{position:absolute;top:calc(100% + 6px);right:0;width:280px;max-height:58vh;overflow-y:auto;background:#fff;border:1px solid #e3e7ec;border-radius:12px;box-shadow:0 12px 34px rgba(20,30,50,.18);padding:8px;z-index:150}
.lp-indpop-hd{display:flex;justify-content:space-between;align-items:center;font-size:12px;color:#7a8089;padding:4px 6px 8px;border-bottom:1px solid #f0f2f5;margin-bottom:6px}
.lp-indpop-hd a{color:#1a73e8;text-decoration:none}
.lp-indit{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:8px;font-size:13px;cursor:pointer;-webkit-user-select:none;user-select:none}
.lp-indit:hover{background:#f2f7ff}
.lp-indpop label.lp-indit input[type=checkbox]{-webkit-appearance:none;appearance:none;width:16px;height:16px;min-width:16px;margin:0;padding:0;flex:0 0 auto;border:1.5px solid #c3c9d2;border-radius:4px;background:#fff;box-shadow:none;cursor:pointer;position:relative;transition:border-color .12s,background .12s}
.lp-indpop label.lp-indit input[type=checkbox]:hover{border-color:#1a73e8}
.lp-indpop label.lp-indit input[type=checkbox]:checked{background:#1a73e8;border-color:#1a73e8}
.lp-indpop label.lp-indit input[type=checkbox]:checked:after{content:"";position:absolute;left:4.5px;top:1.5px;width:4px;height:8px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}
.lp-indpop label.lp-indit input[type=checkbox]:focus{box-shadow:0 0 0 3px rgba(26,115,232,.18)}
.lp-right{margin-left:auto}
.lp-main{position:fixed;top:58px;left:0;right:0;bottom:0;display:flex}
.lp-list{flex:1;min-width:0;overflow-y:auto;padding:14px 16px 80px;scroll-behavior:auto}
.lp-list-inner{max-width:880px;margin:0 auto}
.lp-meta-bar{max-width:880px;margin:0 auto 10px;font-size:12.5px;color:#7a8089;display:flex;align-items:center;gap:10px}
.lp-item{background:#fff;border:1px solid #e9ecf1;border-left:3px solid transparent;border-radius:11px;padding:11px 14px;margin-bottom:8px;cursor:pointer;transition:box-shadow .12s,border-color .12s,background .12s}
.lp-item:hover{border-color:#cfd8e3;box-shadow:0 2px 10px rgba(20,30,50,.07)}
.lp-item.sel{border-left-color:#1a73e8;background:#f7faff;border-color:#c9dcfb;box-shadow:0 2px 10px rgba(26,115,232,.10)}
.lp-item .t{font-size:14.5px;font-weight:600;color:#1a1a2e;line-height:1.42;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.lp-item .m{font-size:12px;color:#7a8089;margin-top:5px;display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.lp-item .e{font-size:12.5px;color:#5f6368;margin-top:5px;line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.lp-tag{padding:1px 7px;border-radius:6px;background:#eef2f7;color:#4a5568;font-size:11px}
.lp-tag.ind{background:#eaf7ee;color:#1e7d45}
.lp-tag.tb{background:#fff3e0;color:#b26a00}
.lp-skel{height:74px;border-radius:11px;background:linear-gradient(90deg,#f2f4f7 25%,#e9edf2 37%,#f2f4f7 63%);background-size:400% 100%;animation:lpsk 1.2s ease infinite;margin-bottom:8px}
@keyframes lpsk{0%{background-position:100% 50%}100%{background-position:0 50%}}
.lp-drawer{width:46%;max-width:820px;min-width:420px;background:#f1f3f5;border-left:1px solid #e3e7ec;overflow-y:auto;padding:16px 18px 80px;display:none}
.lp-drawer.open{display:block}
.lp-drawer .d-close{position:sticky;top:0;float:right;z-index:5;border:1px solid #dfe3e8;background:#fff;border-radius:8px;padding:4px 10px;font-size:12px;cursor:pointer;color:#5f6368}.lp-drawer .d-acts{position:sticky;top:0;z-index:6;display:flex;gap:6px;justify-content:flex-end;height:0;pointer-events:none}.lp-drawer .d-acts button{pointer-events:auto}.lp-drawer .d-acts button{border:1px solid #dfe3e8;background:#fff;border-radius:8px;padding:4px 10px;font-size:12px;cursor:pointer;color:#5f6368}.lp-drawer .d-acts button:hover{background:#f2f5fa;color:#1a1a2e;border-color:#c9d3e0}.lp-drawer .d-copy{color:#1a73e8;border-color:#cfe0f8}
/* 2026-09-11: æŠ½å±‰é¡¶éƒ¨ä¸�å†�æ¸²æŸ“æ ‡é¢˜ï¼ˆrenderDrawer å·²åŽ»æŽ‰ .d-titleï¼‰â€”â€”
   æ­£æ–‡å�¡ç‰‡ç¬¬ä¸€è¡Œå°±æ˜¯å�Œä¸€ä¸ªæ ‡é¢˜ï¼Œä¸¤ä»½å� ç�€æ˜¾ç¤ºæ˜¯é‡�å¤�ã€‚
   è¿™é‡ŒæŠŠæ­£æ–‡æ ‡é¢˜ä»Ž 28px æ”¶åˆ° 20pxï¼ˆâ‰ˆäºŒçº§æ ‡é¢˜ï¼‰ï¼Œä¸Žæ­£æ–‡ 14px çš„è�½å·®ä¸�å†�çª�å…€ã€‚
   ä»…ä½œç”¨äºŽåˆ—è¡¨é¡µæŠ½å±‰ï¼Œç‹¬ç«‹è¯¦æƒ…é¡µä»�ç”¨ DETAIL_CSS çš„ 28pxã€‚ */
.lp-drawer .dh h1{font-size:20px}
.lp-empty{text-align:center;color:#8a9099;font-size:13.5px;padding:60px 10px}
.lp-more{max-width:880px;margin:6px auto 0;text-align:center;color:#8a9099;font-size:12.5px;padding:12px}
.lp-hint{position:fixed;left:18px;bottom:12px;background:rgba(32,33,36,.86);color:#e8eaed;font-size:11.5px;padding:6px 12px;border-radius:9px;z-index:70;display:flex;gap:12px;align-items:center}
.lp-hint kbd{background:#3c4043;border-radius:4px;padding:1px 5px;font-family:inherit;font-size:11px}
.lp-bar{position:fixed;top:0;left:0;height:2px;width:0;background:#1a73e8;z-index:99;transition:width .25s}
.lp-cmk{position:fixed;inset:0;background:rgba(20,24,32,.42);z-index:200;display:none;align-items:flex-start;justify-content:center;padding-top:12vh}
.lp-cmk.open{display:flex}
.lp-cmk-box{width:620px;max-width:92vw;background:#fff;border-radius:14px;box-shadow:0 18px 60px rgba(0,0,0,.28);overflow:hidden}
.lp-cmk-box input{width:100%;border:none;border-bottom:1px solid #eceff3;padding:15px 18px;font-size:15px;outline:none}
.lp-cmk-res{max-height:52vh;overflow-y:auto}
.lp-cmk-it{padding:10px 18px;cursor:pointer;border-bottom:1px solid #f4f6f8;font-size:13.5px}
.lp-cmk-it.act,.lp-cmk-it:hover{background:#f2f7ff}
.lp-cmk-it .s{font-size:11.5px;color:#8a9099;margin-top:3px}
.lp-cmk-foot{padding:9px 18px;font-size:11.5px;color:#8a9099;border-top:1px solid #eceff3;display:flex;gap:14px}
.lp-cmk-foot a{color:#1a73e8;text-decoration:none;margin-left:auto}
/* â”€â”€ æ‰‹æœºç«¯ï¼ˆâ‰¤760pxï¼‰ï¼šæŠ½å±‰=æ•´å±�è¯¦æƒ…é¡µ â”€â”€
   âš ï¸� ä¸�åŠ è¿™æ®µæ—¶ï¼š.lp-list{flex:1;min-width:0} ä¼šæŠŠåˆ—è¡¨åŽ‹æˆ� 0 å®½ï¼Œ
   è€Œ .lp-drawer{min-width:420px} åœ¨ 375/390px å±�ä¸Šæ¯”å±�å¹•è¿˜å®½ â†’ å�³ä¾§è¢«è£� + æ¨ªå�‘æº¢å‡ºã€‚
   æ‰‹æœºç«¯å‘ˆ"ç‚¹ä¸€æ�¡å°±æ•´å±�å�˜è¯¦æƒ…"ï¼Œæ‰€ä»¥è¿™é‡ŒæŒ‰æ•´å±�è¯¦æƒ…æ�¥æŽ’ï¼ˆåŽ»æŽ‰æœ€å°�å®½åº¦ä¸Žå·¦è¾¹æ¡†ï¼‰ã€‚ */
@media(max-width:760px){
  .lp-drawer{width:100%;max-width:none;min-width:0;border-left:none;padding:14px 14px 70px}
  .lp-list{padding:10px 10px 70px}
  .lp-item .e{display:none}                 /* å°�å±�ä¸�æ”¾æ‘˜è¦�ï¼Œé�¿å…�ä¸€å±�ä¸€æ�¡éƒ½çœ‹ä¸�å…¨ */
  .lp-item .t{font-size:14px;-webkit-line-clamp:3}
  .lp-hint{display:none}                    /* é”®ç›˜æ��ç¤ºåœ¨è§¦å±�ä¸Šæ˜¯å™ªéŸ³ */
  .lp-search{max-width:none}
  .lp-cmk-box{width:100%;max-width:100vw;border-radius:0}
  .lp-cmk{background:rgba(20,24,32,.5)}
  .lp-indpop{width:min(90vw,300px)}          /* è¡Œä¸šå¼¹å±‚åœ¨çª„å±�ä¸�è¶…å‡ºå±�å¹• */
}
</style>ue  <script>
(function(){
'use strict';
var BOOT = window.__BOOT__ || {};
var $ = function(s,r){return (r||document).querySelector(s)};
var itemsBox = $('#lp-items'), listBox = $('#lp-list'), drawer = $('#lp-drawer'),
    sentinel = $('#lp-sentinel'), bar = $('#lp-bar');
var S = { items: [], ids: {}, cursor: '', hasMore: true, loading: false, sel: null,
          busy: 0, filters: {range: BOOT.range || 'all', industry: BOOT.industry || '', q: BOOT.q || ''},
          cache: {}, cmkIdx: -1, cmkItems: [] };

function ping(on){ S.busy += on ? 1 : -1; if (S.busy < 0) S.busy = 0; bar.style.width = S.busy ? '72%' : '0'; if (!S.busy) setTimeout(function(){ bar.style.width='0' }, 200); }
function api(path, params){
  var qs = Object.keys(params||{}).filter(function(k){ return params[k] !== '' && params[k] != null })
           .map(function(k){ return k + '=' + encodeURIComponent(params[k]) }).join('&');
  return fetch(path + (qs ? '?' + qs : ''), {credentials:'same-origin'}).then(function(r){ return r.json() });
}
function esc(s){ return (s==null?'':String(s)).replace(/[&<>"']/g, function(c){ return {'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c] }) }

function rowEl(it){
  var d = document.createElement('div');
  d.className = 'lp-item'; d.dataset.id = it.id;
  var tags = (it.tags || []).map(function(t){
    return '<span class="lp-tag ' + (t.c || '') + '">' + esc(t.v) + '</span>' }).join('');
  d.innerHTML = '<div class="t">' + (esc(it.title) || '(æ— æ ‡é¢˜)') + '</div>'
    + '<div class="m">'
      + (it.site ? '<span>' + esc(it.site) + '</span>' : '')
      + (it.date ? '<span>' + esc(it.date) + '</span>' : '')
      + (it.v ? '<span title="è¢«æ‰“å¼€æ¬¡æ•°" style="font-size:11px;color:#5f6368;'
                + 'background:#f1f3f4;border-radius:9px;padding:0 6px">'
                + 'ðŸ‘� ' + it.v + '</span>' : '')
      + tags + '</div>'
    + (it.excerpt ? '<div class="e">' + esc(it.excerpt) + '</div>' : '');
  return d;
}

function appendItems(list){
  var frag = document.createDocumentFragment();
  list.forEach(function(it){
    var key = String(it.id);
    if (S.ids[key]) return;
    S.ids[key] = 1; it.id = key; S.items.push(it);
    frag.appendChild(rowEl(it));
  });
  itemsBox.appendChild(frag);
  $('#lp-count').textContent = S.items.length;
}

function skeleton(n){
  for (var i=0;i<n;i++){ var d=document.createElement('div'); d.className='lp-skel'; d.dataset.sk=1; itemsBox.appendChild(d); }
}
function clearSkel(){ Array.prototype.forEach.call(itemsBox.querySelectorAll('[data-sk]'), function(e){ e.remove() }) }

function loadMore(){
  if (S.loading || !S.hasMore) return Promise.resolve();
  S.loading = true; ping(true);
  if (!S.items.length) skeleton(4);
  return api('/api/list', {cursor:S.cursor, dir:'next', limit:30, db:'__ROUTE__', range:S.filters.range,
                           industry:S.filters.industry, q:S.filters.q})
    .then(function(d){
      clearSkel();
      if (!d || !d.ok){ S.hasMore = false; return }
      var _before = S.items.length, _cur0 = S.cursor;
      appendItems(d.items || []);
      S.cursor = d.next_cursor || ''; S.hasMore = !!d.has_more;
      // å®ˆå�«ï¼šæ¸¸æ ‡æ²¡å‰�è¿›ä¸”æ²¡æœ‰æ–°å¢ž â†’ å�œæ­¢ï¼Œé�¿å…�æ— é™�å¾ªçŽ¯é‡�å¤�è¯·æ±‚
      if (S.cursor === _cur0 && S.items.length === _before) S.hasMore = false;
      var _ltA = $('#lp-total'); if (d.total && _ltA) _ltA.textContent = d.total.toLocaleString() + (d.total_truncated ? '+' : '');   // /crawler æ— æ­¤å…ƒç´ ï¼ˆæ€»æ•°å·²åŽ»æŽ‰ï¼‰
      if (!S.items.length) itemsBox.innerHTML = '<div class="lp-empty">æ²¡æœ‰åŒ¹é…�çš„è®°å½•<br><span style="font-size:12px">æ�¢ä¸ªå…³é”®è¯�æˆ–æ”¾å®½æ—¶é—´èŒƒå›´è¯•è¯•</span></div>';
      else if (!S.hasMore) $('#lp-more').textContent = 'â€” å·²åˆ°åº•éƒ¨ï¼Œå…± ' + S.items.length + ' æ�¡ â€”';
    })
    .catch(function(){ clearSkel(); S.hasMore = false })
    .then(function(){ S.loading = false; ping(false); });
}

function resetList(){
  S.items = []; S.ids = {}; S.cursor = ''; S.hasMore = true; S.sel = null;
  itemsBox.innerHTML = ''; $('#lp-more').textContent = ''; $('#lp-count').textContent = '0';
  var _ltB = $('#lp-total'); if (_ltB) _ltB.textContent = 'â€”';
  drawer.classList.remove('open'); drawer.innerHTML = '';
  return loadMore();
}

// id â†’ Promiseï¼ˆè¿›è¡Œä¸­çš„è¯·æ±‚ï¼‰ã€‚âš ï¸� å¿…é¡»ä¸Ž"å·²å®Œæˆ�ç»“æžœ"åˆ†å¼€å­˜ï¼š
// æ—§å†™æ³•æŠŠ**å� ä½�ç¬¦ 1** å†™è¿› S.cacheï¼Œå¼•å�‘ä¸¤ä¸ªè¿žé”�ç¼ºé™· â€”â€”
//   â‘  prefetchItem() å¤�ç”¨åˆ†æ”¯ `if (S.cache[id]) return Promise.resolve(S.cache[id])`
//      ä¼šæŠŠå� ä½�ç¬¦ 1 å½“ç»“æžœè¿”å›žï¼›
//   â‘¡ select() é‡Œ `if (!cached)` åˆ¤å®šä¸º"å·²æœ‰ç¼“å­˜"â†’ **è·³è¿‡æ¸²æŸ“å›žè°ƒ** â†’ æŠ½å±‰æ°¸ä¹…å�œåœ¨ã€ŒåŠ è½½ä¸­â€¦ã€�ã€‚
// æ‰‹æœºç«¯æ—  hoverï¼Œå…¨é�  select() è‡ªå·±é¢„å�–ç›¸é‚»é¡¹(idxÂ±1/idx+2)ï¼Œè¿žç‚¹ç›¸é‚»æ�¡ç›®å¿…è¸©
// ï¼ˆ2026-09-10 å®žæµ‹ï¼šå�Œä¸€ tick ç‚¹ç¬¬ 30â†’31 æ�¡ï¼Œ3.3s å�Žä»� 138 å­—èŠ‚çš„ã€ŒåŠ è½½ä¸­ã€�ä¸�æ�¢å¤�ï¼‰ã€‚
S.pending = {};
function prefetchItem(id){
  id = String(id);
  if (typeof S.cache[id] === 'string') return Promise.resolve(S.cache[id]); // å·²å®Œæˆ�ï¼ˆå�«ç©ºä¸²=å¤±è´¥ï¼‰
  if (S.pending[id]) return S.pending[id];                                  // è¿›è¡Œä¸­ â†’ å¤�ç”¨å�Œä¸€ promise
  S.pending[id] = api('/api/item', {db:'__ROUTE__', id:id}).then(function(d){
    var h = (d && d.ok) ? (d.html || '') : '';
    S.cache[id] = h;
    return h;
  }).catch(function(){ S.cache[id] = ''; return ''; })
    .then(function(h){ delete S.pending[id]; return h; });
  return S.pending[id];
}
// åŠ è½½å¤±è´¥çš„é‡�è¯•å…¥å�£ï¼ˆæ¸…æŽ‰å¤±è´¥ç¼“å­˜å�Žé‡�æ–°é€‰ä¸­ï¼‰
window.__lpRetry = function(id){
  id = String(id); delete S.cache[id]; delete S.pending[id];
  select(id, true, false);
};

// 2026-09-14: ä¸€é”®å¤�åˆ¶åŽŸæ–‡ã€‚
// âš ï¸� æœ¬ç«™æ˜¯ http:// é�žå®‰å…¨ä¸Šä¸‹æ–‡ â†’ navigator.clipboard åœ¨å¤šæ•°æµ�è§ˆå™¨é‡Œä¸�å­˜åœ¨,
//    å¿…é¡»ç”¨ document.execCommand('copy') + ä¸´æ—¶ textarea å…œåº•, å�¦åˆ™ç‚¹äº†æ²¡å��åº”ã€‚
function __lpCopyFallback(text){
  var ta = document.createElement('textarea');
  ta.value = text; ta.setAttribute('readonly', '');
  ta.style.position = 'fixed'; ta.style.top = '-1000px'; ta.style.left = '-1000px';
  ta.style.opacity = '0';
  document.body.appendChild(ta);
  ta.select(); ta.setSelectionRange(0, ta.value.length);
  var ok = false;
  try { ok = document.execCommand('copy'); } catch (e) { ok = false; }
  document.body.removeChild(ta);
  return ok;
}
// 2026-09-14 ç”¨æˆ·è¦�æ±‚ï¼šå¤�åˆ¶å†…å®¹éœ€å�«ã€�æ ‡é¢˜ + å�‘å¸ƒæ—¥æœŸ/æ�¥æº�ç­‰å…ƒä¿¡æ�¯ + æ­£æ–‡ã€‘ï¼Œä¸�å†�å�ªå¤�åˆ¶æ­£æ–‡ã€‚
// å�„è·¯ç”±æŠ½å±‰ç‰‡æ®µçš„ç±»å��ä¸�å�Œï¼Œé€�ä¸ªé€€åŒ–å�–ï¼›å�–ä¸�åˆ°å°±è·³è¿‡è¯¥æ®µï¼ˆä¸�å¡žç©ºè¡Œï¼‰ã€‚
// ç»„è£…å¾…å¤�åˆ¶çš„å…¨æ–‡ï¼›å�•ç‹¬æŠ½æˆ� __lpCopyText() ä¾¿äºŽåœ¨æµ�è§ˆå™¨é‡Œç›´æŽ¥éªŒè¯�å†…å®¹ã€‚
window.__lpCopyText = function(){
  var pick = function(sels){
    for (var i = 0; i < sels.length; i++){
      var el = drawer.querySelector(sels[i]);
      if (el){
        var t = (el.innerText || el.textContent || '').replace(/Â /g, ' ').trim();
        if (t) { return t; }
      }
    }
    return '';
  };
  var parts = [];
  var title = pick(['.dh h1', '.dht h1', '.ds h3']);
  if (title) { parts.push(title); }
  // 2026-09-14 ç”¨æˆ·è¦�æ±‚ï¼šæ�¥æº� / å�‘å¸ƒæ—¶é—´ / åŽŸæ–‡é“¾æŽ¥è¿™äº›å…ƒä¿¡æ�¯ã€�åŽ‹æˆ�ä¸€è¡Œã€‘â€”â€”
  // .d-meta é‡Œå�„å­—æ®µå�„è‡ªæˆ�è¡Œï¼Œç²˜è´´å‡ºæ�¥è¢«æ‹†æˆ�å¤šè¡Œï¼›ç»Ÿä¸€æŠŠç©ºç™½æŠ˜å� æˆ�å�•ä¸ªç©ºæ ¼ã€‚
  var meta = pick(['.d-meta']);
  if (meta) { parts.push(meta.replace(/\s+/g, ' ').trim()); }
  // 2026-09-14 ç”¨æˆ·æŠ¥ã€Œå¤�åˆ¶å†…å®¹ä¸�å®Œæ•´ã€�ï¼šzc/ccpc/contact çš„æŠ½å±‰ç‰‡æ®µæ˜¯ã€�æ¨¡å�—åŒ–ã€‘çš„ï¼Œ
  // æ¯�ä¸ªæ¨¡å�—ä¸€ä¸ª .ds å�¡ç‰‡(h3 æ ‡é¢˜ + æ­£æ–‡)ã€‚åŽŸæ�¥ pick(['.ct-html','.ct']) å�ªå�–åˆ°ç¬¬ä¸€ä¸ª .ct
  // â†’ ZC è·¯ç”±å�ªå¤�åˆ¶äº†ã€Œå»ºè®¾å†…å®¹ã€�ä¸€å�—ã€‚çŽ°æ”¹ä¸ºï¼šæœ‰ .ds å�¡ç‰‡å°±æŒ‰åŽŸé¡ºåº�å…¨æ”¶ï¼ˆå�« .dh çš„
  // åŸºæœ¬ä¿¡æ�¯ç½‘æ ¼ .dgï¼‰ï¼›æ²¡æœ‰ .ds çš„ï¼ˆcrawlerï¼‰æ‰�é€€å›žå�•å�—æ­£æ–‡ã€‚
  // è�”ç³»äººå�¡ç‰‡ï¼š.fd æ˜¯ CSS gridï¼ˆæ ‡ç­¾ span.cl + ç´§é‚»çš„å€¼ span äº¤æ›¿ï¼‰ï¼Œ
  // innerText ä¼šæŠŠã€�æ¯�ä¸ª span å�„å� ä¸€è¡Œã€‘â†’ ä¸€ä¸ªäºº 12 è¡Œï¼ˆç”¨æˆ·æŠ¥ã€Œåˆ†è¡Œå¾ˆå¤šã€�ï¼‰ã€‚
  // æ”¹ä¸ºæŠŠã€Œæ ‡ç­¾+å€¼ã€�é…�å¯¹ï¼šå…¬å�¸å�� 1 è¡Œ + å­—æ®µ 1 è¡Œï¼ˆå­—æ®µé—´ä¸¤ç©ºæ ¼åˆ†éš”ï¼‰ã€‚
  var pairFields = function(fd){
    var out = [], cur = '';
    for (var k = 0; k < fd.children.length; k++){
      var el = fd.children[k];
      var t = (el.innerText || '').replace(/\s+/g, ' ').trim();
      if (!t) { continue; }
      if (el.classList && el.classList.contains('cl')) { cur = t; }
      else { out.push(cur + t); cur = ''; }
    }
    if (cur) { out.push(cur); }
    return out.join('  ');
  };
  var dsList = drawer.querySelectorAll('.ds');
  if (dsList.length){
    var grid = pick(['.dh .dg']);
    if (grid) { parts.push(grid); }
    for (var i = 0; i < dsList.length; i++){
      var card = dsList[i];
      var ccList = card.querySelectorAll('.cc');
      if (ccList.length){
        var seg = [], _h3 = card.querySelector('h3');
        if (_h3) { var _ht = (_h3.innerText || '').trim(); if (_ht) { seg.push(_ht); } }
        for (var j = 0; j < ccList.length; j++){
          var rec = [];
          var _cm = ccList[j].querySelector('.cm'), _fd = ccList[j].querySelector('.fd');
          if (_cm) { var _cmt = (_cm.innerText || '').replace(/\s+/g, ' ').trim(); if (_cmt) { rec.push(_cmt); } }
          if (_fd) { var _fl = pairFields(_fd); if (_fl) { rec.push(_fl); } }
          if (rec.length) { seg.push(rec.join('\n')); }
        }
        if (seg.length) { parts.push(seg.join('\n')); }
      } else {
        var block = (dsList[i].innerText || '').replace(/Â /g, ' ').trim();
        if (block) { parts.push(block); }
      }
    }
  } else {
    var body = pick(['.ct-html', '.ct']);
    if (body) { parts.push(body); }
  }
  return parts.join('\n\n');
};
window.__lpCopy = function(){
  var text = window.__lpCopyText();
  if (!text) { return; }
  var btn = drawer.querySelector('.d-copy');
  var old = btn ? btn.textContent : '';
  var done = function(ok){
    if (!btn) { return; }
    btn.textContent = ok ? 'âœ“ å·²å¤�åˆ¶' : 'âœ— å¤�åˆ¶å¤±è´¥';
    setTimeout(function(){ btn.textContent = old; }, 1400);
  };
  if (navigator.clipboard && window.isSecureContext) {
    navigator.clipboard.writeText(text).then(function(){ done(true); },
      function(){ done(__lpCopyFallback(text)); });
  } else {
    done(__lpCopyFallback(text));
  }
};
// é‡�è¯•èµ°äº‹ä»¶å§”æ‰˜ï¼ˆâš ï¸� åˆ«åœ¨ JS å­—ç¬¦ä¸²é‡Œæ‹¼ javascript:__lpRetry('â€¦')â€”â€”
// Python é�ž raw å­—ç¬¦ä¸²ä¼šæŠŠ ' å�ƒæˆ� 'ï¼Œè¾“å‡ºå�˜æˆ�ç›¸é‚»å­—ç¬¦ä¸²å­—é�¢é‡� â†’ æ•´å�— SyntaxErrorï¼‰
drawer.addEventListener('click', function(e){
  var a = e.target.closest && e.target.closest('.lp-retry'); if (!a) return;
  e.preventDefault(); window.__lpRetry(a.getAttribute('data-retry'));
});

function renderDrawer(id, html){
  // 2026-09-11: åŽ»æŽ‰æŠ½å±‰é¡¶éƒ¨æ ‡é¢˜ â€”â€” æ­£æ–‡å�¡ç‰‡ç¬¬ä¸€è¡Œï¼ˆ.dh é‡Œçš„ <h1>ï¼‰å°±æ˜¯å�Œä¸€ä¸ªæ ‡é¢˜ï¼Œ
  // åˆ�å§‹æ‰“å¼€å’Œ J/K ç¿»é¡µéƒ½èµ°è¿™é‡Œï¼Œä¸¤å¤„ä¸€èµ·æ¶ˆå¤±ã€‚æ ‡é¢˜å­—å�·ç”± .lp-drawer .dh h1 æŽ§åˆ¶ã€‚
  // 2026-09-14: ã€Œå¤�åˆ¶åŽŸæ–‡ã€�åŠ åœ¨ã€Œå…³é—­ã€�å·¦ä¾§(ç”¨æˆ·è¦�æ±‚)ã€‚ä¸¤é’®åŒ…è¿› .d-acts ç”¨ flex æŽ’ç‰ˆ,
  // DOM é¡ºåº� = å¤�åˆ¶|å…³é—­ ä¸Žè§†è§‰ä¸€è‡´(å�Œ float:right æ—¶ä¹¦å†™é¡ºåº�ä¸Žè§†è§‰é¡ºåº�ç›¸å��, æ›´æ˜“æ”¹é”™)ã€‚
  drawer.innerHTML = '<div class="d-acts">'
    + '<button class="d-copy" onclick="window.__lpCopy()">â§‰ å¤�åˆ¶åŽŸæ–‡</button>'
    + '<button class="d-close" onclick="window.__lpClose()">âœ• å…³é—­</button></div>'
    + (html || '<div class="lp-empty">åŠ è½½ä¸­â€¦</div>');
  drawer.classList.add('open');
  drawer.scrollTop = 0;
}

function select(id, open, hist){
  var prev = S.sel; S.sel = String(id);
  Array.prototype.forEach.call(itemsBox.querySelectorAll('.lp-item.sel'), function(e){ e.classList.remove('sel') });
  var el = itemsBox.querySelector('.lp-item[data-id="' + String(id) + '"]');
  if (el) el.classList.add('sel');
  if (open !== false){
    var cached = S.cache[id];
    if (typeof cached === 'string' && cached){
      renderDrawer(id, cached);
    } else {
      renderDrawer(id, '');   // å� ä½�ï¼šæ˜¾ç¤ºã€ŒåŠ è½½ä¸­â€¦ã€�
      // âš ï¸� å¿…é¡»**æ— æ�¡ä»¶**æŒ‚ .thenâ€”â€”cached ä¸º undefined æˆ–"è¯·æ±‚è¿›è¡Œä¸­"éƒ½è¦�èƒ½å›žè°ƒé‡�ç»˜ã€‚
      //    æ—§å†™æ³• `if (!cached) prefetchItem(...).then(...)` åœ¨è¯·æ±‚è¿›è¡Œä¸­æ—¶ç›´æŽ¥è·³è¿‡ï¼Œ
      //    å¯¼è‡´æŠ½å±‰æ°¸ä¹…å�œåœ¨ã€ŒåŠ è½½ä¸­ã€�ï¼ˆæ‰‹æœºç«¯è¿žç‚¹ç›¸é‚»æ�¡ç›®å¿…è¸©ï¼Œè§� prefetchItem æ³¨é‡Šï¼‰ã€‚
      prefetchItem(id).then(function(h){
        if (String(S.sel) !== String(id)) return;   // æœŸé—´å·²åˆ‡èµ° â†’ ä¸�è¦†ç›–
        renderDrawer(id, h || ('<div class="lp-empty">è¯¦æƒ…åŠ è½½å¤±è´¥ '
          + '<a href="#" class="lp-retry" data-retry="' + String(id) + '">ç‚¹æ­¤é‡�è¯•</a></div>'));
      });
    }
    // é¢„å�–ç›¸é‚»
    var idx = -1; for (var i=0;i<S.items.length;i++) if (String(S.items[i].id) === String(id)) { idx = i; break }
    if (idx >= 0){ [idx-1, idx+1, idx+2].forEach(function(k){ if (S.items[k]) prefetchItem(S.items[k].id) }) }
  }
  if (hist !== false){
    var st = {lp:1, id:String(id), scroll:listBox.scrollTop,
      f:{range:S.filters.range, industry:S.filters.industry, q:S.filters.q}, n:S.items.length};
    if (hist === 'replace') history.replaceState(st, '', location.pathname + location.search);
    else history.pushState(st, '', location.pathname + location.search);
  }
}
window.__lpClose = function(){ if (S.sel){ S.sel = null;
  Array.prototype.forEach.call(itemsBox.querySelectorAll('.lp-item.sel'), function(e){ e.classList.remove('sel') });
  drawer.classList.remove('open'); } };

// â”€â”€ æ— é™�æ»šåŠ¨ï¼ˆæ��å‰� 2 å±�é¢„å�–ä¸‹ä¸€é¡µï¼šrootMargin 1200pxï¼‰â”€â”€
if ('IntersectionObserver' in window){
  new IntersectionObserver(function(es){ es.forEach(function(e){ if (e.isIntersecting) loadMore() }) },
    {root: listBox, rootMargin: '1200px 0px 1200px 0px'}).observe(sentinel);
} else {
  listBox.addEventListener('scroll', function(){ if (listBox.scrollTop + listBox.clientHeight + 900 > listBox.scrollHeight) loadMore() });
}

// â”€â”€ æ‚¬å�œé¢„å�–è¯¦æƒ… â”€â”€
var hoverTimer = null, hoverId = null;
itemsBox.addEventListener('mouseover', function(e){
  var el = e.target.closest && e.target.closest('.lp-item'); if (!el) return;
  hoverId = el.dataset.id; clearTimeout(hoverTimer);
  hoverTimer = setTimeout(function(){ prefetchItem(hoverId) }, 110);
});
itemsBox.addEventListener('mouseout', function(){ clearTimeout(hoverTimer) });

// â”€â”€ è§¦å±�é¢„å�–ï¼ˆæ‰‹æœºç«¯æ²¡æœ‰ hoverï¼ŒæŒ‡é’ˆæŒ‰ä¸‹å�³å¼€å§‹å�–è¯¦æƒ…ï¼‰â”€â”€
// æ‰‹æŒ‡æŒ‰ä¸‹(pointerdown) åˆ° click ä¹‹é—´æœ‰ ~50-150msï¼Œè¯·æ±‚æ��å‰�èµ·é£žï¼Œ
// é…�å�ˆ prefetchItem çš„ promise å¤�ç”¨ â†’ ç‚¹å‡»æ—¶æŠ½å±‰åŸºæœ¬èƒ½ç«‹åˆ»å‡ºå†…å®¹ã€‚
itemsBox.addEventListener('pointerdown', function(e){
  if (e.pointerType === 'mouse') return;          // é¼ æ ‡èµ°ä¸Šé�¢çš„ hover é€»è¾‘
  var el = e.target.closest && e.target.closest('.lp-item'); if (!el) return;
  var id = el.getAttribute('data-id'); if (id) prefetchItem(id);
}, {passive: true});

// â”€â”€ ç‚¹å‡»æ‰“å¼€ â”€â”€
itemsBox.addEventListener('click', function(e){
  var el = e.target.closest && e.target.closest('.lp-item'); if (!el) return;
  select(el.dataset.id, true, 'push');
});

// â”€â”€ ç©ºé—²é¢„å�–å‰� 3 æ�¡è¯¦æƒ… â”€â”€
function idlePrefetch(){
  var f = function(){ (S.items.slice(0,3)).forEach(function(it,i){ setTimeout(function(){ prefetchItem(it.id) }, i*220) }) };
  if (window.requestIdleCallback) requestIdleCallback(f, {timeout: 2200}); else setTimeout(f, 900);
}

// â”€â”€ é”®ç›˜å¯¼èˆª â”€â”€
function move(delta){
  if (!S.items.length) return;
  var idx = -1; for (var i=0;i<S.items.length;i++) if (String(S.items[i].id) === String(S.sel)) { idx = i; break }
  idx += delta;
  if (idx < 0) idx = 0; if (idx > S.items.length-1) idx = S.items.length-1;
  var it = S.items[idx];
  if (idx >= S.items.length - 6) loadMore();
  select(it.id, true, 'replace');
  var el = itemsBox.querySelector('.lp-item[data-id="' + it.id + '"]');
  if (el){
    var r = el.getBoundingClientRect(), lr = listBox.getBoundingClientRect();
    if (r.top < lr.top + 10) listBox.scrollTop += r.top - lr.top - 10;
    else if (r.bottom > lr.bottom - 10) listBox.scrollTop += r.bottom - lr.bottom + 10;
  }
}
document.addEventListener('keydown', function(e){
  var t = e.target || {};
  var typing = /INPUT|TEXTAREA|SELECT/.test(t.tagName || '');
  var cmkOpen = $('#lp-cmk').classList.contains('open');
  if ((e.metaKey || e.ctrlKey) && (e.key === 'k' || e.key === 'K')){ e.preventDefault(); openCmk(); return }
  // 2026-09-14: Alt+I = ä¸€é”®å¤�åˆ¶åŽŸæ–‡ã€‚ç”¨ e.code åˆ¤å®šæ›´ç¨³ â€”â€”
  // æŸ�äº›é”®ç›˜å¸ƒå±€/è¾“å…¥æ³•ä¸‹ Alt+I çš„ e.key ä¸�æ˜¯ 'i'ï¼ˆè€Œæ˜¯ 'Â¡' ä¹‹ç±»ï¼‰ï¼Œå�ªçœ‹ e.key ä¼šå¤±ç�µã€‚
  if (e.altKey && (e.code === 'KeyI' || e.key === 'i' || e.key === 'I')){
    if (drawer.classList.contains('open')){ e.preventDefault(); window.__lpCopy(); }
    return;
  }
  if (e.key === 'Escape'){ if (cmkOpen){ closeCmk(); return } window.__lpClose(); return }
  if (cmkOpen){ return }
  if (typing){ if (e.key === 'Enter' && t.id === 'lp-q'){ e.preventDefault(); applyQ(t.value); } return }
  if (e.key === 'j' || e.key === 'ArrowDown'){ e.preventDefault(); move(1) }
  else if (e.key === 'k' || e.key === 'ArrowUp'){ e.preventDefault(); move(-1) }
  else if (e.key === 'Enter'){ if (S.sel) select(S.sel, true, true) }
  else if (e.key === '/'){ e.preventDefault(); $('#lp-q').focus() }
});

// â”€â”€ âŒ˜K å¿«é€Ÿæ�œç´¢ â”€â”€
function openCmk(){ $('#lp-cmk').classList.add('open'); var i = $('#lp-cmk-in'); i.value = ''; i.focus(); $('#lp-cmk-res').innerHTML = ''; S.cmkItems = []; S.cmkIdx = -1 }
function closeCmk(){ $('#lp-cmk').classList.remove('open') }
var cmkTimer = null;
function renderCmk(list, total){
  S.cmkItems = list || []; S.cmkIdx = list && list.length ? 0 : -1;
  var h = (list||[]).map(function(it,i){
    return '<div class="lp-cmk-it' + (i===0?' act':'') + '" data-i="' + i + '" data-id="' + it.id + '">'
      + esc(it.title) + '<div class="s">' + esc(it.site) + ' Â· ' + esc(it.date) + '</div></div>' }).join('');
  if (!h) h = '<div class="lp-cmk-it" style="color:#8a9099;cursor:default">æ— åŒ¹é…�ç»“æžœ</div>';
  $('#lp-cmk-res').innerHTML = h;
  $('#lp-cmk-foot-hint').textContent = total ? ('å…± ' + total + ' æ�¡åŒ¹é…�ï¼Œå‰� ' + (list||[]).length + ' æ�¡') : '';
}
$('#lp-cmk-in').addEventListener('input', function(){
  var v = this.value; clearTimeout(cmkTimer);
  if (!v.trim()){ renderCmk([],0); return }
  cmkTimer = setTimeout(function(){
    api('/api/quicksearch', {db:'__ROUTE__', q:v}).then(function(d){ renderCmk(d.items, d.total) });
  }, 160);
});
$('#lp-cmk-res').addEventListener('click', function(e){
  var el = e.target.closest && e.target.closest('.lp-cmk-it'); if (!el || !el.dataset.id) return;
  var seed = S.cmkItems[parseInt(el.dataset.i, 10)];
  closeCmk(); jumpTo(el.dataset.id, seed);
});
$('#lp-cmk-in').addEventListener('keydown', function(e){
  if (e.key === 'ArrowDown' || e.key === 'ArrowUp'){
    e.preventDefault();
    S.cmkIdx += (e.key === 'ArrowDown' ? 1 : -1);
    if (S.cmkIdx < 0) S.cmkIdx = 0; if (S.cmkIdx > S.cmkItems.length-1) S.cmkIdx = S.cmkItems.length-1;
    var els = $('#lp-cmk-res').querySelectorAll('.lp-cmk-it');
    Array.prototype.forEach.call(els, function(el,i){ el.classList.toggle('act', i === S.cmkIdx) });
    if (els[S.cmkIdx]) els[S.cmkIdx].scrollIntoView({block:'nearest'});
  } else if (e.key === 'Enter'){
    e.preventDefault();
    if (e.ctrlKey || e.metaKey){
      // Ctrl/âŒ˜+Enter â†’ ç›´æŽ¥è¿›å…¥**æœ¬è·¯ç”±**çš„æ�œç´¢ç»“æžœåˆ—è¡¨ï¼ˆä¸�æ˜¯ä¸»è·¯ç”±ï¼‰
      var qv = $('#lp-cmk-in').value.trim();
      if (qv){ closeCmk(); location.href = '__BASE__' + '?q=' + encodeURIComponent(qv) }
      return;
    }
    var it = S.cmkItems[S.cmkIdx];
    if (it){ closeCmk(); jumpTo(it.id, it) }
  }
});
$('#lp-cmk').addEventListener('click', function(e){ if (e.target === this) closeCmk() });
$('#lp-cmk-all').addEventListener('click', function(e){
  e.preventDefault(); var v = $('#lp-cmk-in').value.trim();
  if (v) location.href = '__BASE__' + '?q=' + encodeURIComponent(v);
});
function jumpTo(id, seed){
  // è‹¥å·²åœ¨åˆ—è¡¨é‡Œç›´æŽ¥é€‰ä¸­ï¼›å�¦åˆ™æŠŠè¯¥æ�¡ç½®é¡¶æ�’å…¥
  id = String(id);
  seed = seed || {};
  if (S.ids[id]) { select(id, true, true); var el = itemsBox.querySelector('.lp-item[data-id="'+id+'"]'); if (el) el.scrollIntoView({block:'center'}); return }
  api('/api/item', {db:'__ROUTE__', id:id, view:1}).then(function(d){
    if (!d || !d.ok) return;
    var it = {id:id, title:d.title||seed.title||'', site:d.site||seed.site||'', date:d.date||seed.date||'', excerpt:d.excerpt||''};
    it.id = String(id); S.ids[id] = 1; S.items.unshift(it);
    itemsBox.insertBefore(rowEl(it), itemsBox.firstChild);
    prefetchItem(id); select(id, true, true);
    listBox.scrollTop = 0;
  });
}

// â”€â”€ ç­›é€‰å™¨ â”€â”€
function applyRange(v){ S.filters.range = v;
  Array.prototype.forEach.call(document.querySelectorAll('#lp-range .lp-chip'), function(a){ a.classList.toggle('act', a.dataset.v === v) });
  pushFilters(); resetList();
}
function applyQ(v){ S.filters.q = (v||'').trim(); $('#lp-q').value = S.filters.q; pushFilters(); resetList(); }
function pushFilters(){ history.pushState({lp:1, f:{range:S.filters.range, industry:S.filters.industry, q:S.filters.q}, scroll:0, n:0},
  '', '__BASE__' + '?range=' + S.filters.range + (S.filters.industry ? '&industry=' + encodeURIComponent(S.filters.industry) : '') + (S.filters.q ? '&q=' + encodeURIComponent(S.filters.q) : '')) }
document.querySelectorAll('#lp-range .lp-chip').forEach(function(a){ a.addEventListener('click', function(){ applyRange(this.dataset.v) }) });
// â”€â”€ è¡Œä¸šå¤šé€‰ï¼ˆæŒ‰é’® + å¤�é€‰æ¡†å¼¹å±‚ï¼›2026-09-11 ç”±å�•é€‰ select æ”¹ä¸ºå¤šé€‰ï¼‰â”€â”€
// indSync æ˜¯å‡½æ•°å£°æ˜Ž â†’ æ��å�‡åˆ° IIFE é¡¶éƒ¨ï¼Œpopstate é‡Œä¹Ÿèƒ½ç›´æŽ¥è°ƒï¼ˆå®šä¹‰åœ¨å�Žä¸�å½±å“�ï¼‰ã€‚
function indChecked(){
  var box = $('#lp-indpop'); if (!box) return [];
  return Array.prototype.filter.call(box.querySelectorAll('input'), function(cb){ return cb.checked })
         .map(function(cb){ return cb.value });
}
function indLabel(){
  var btn = $('#lp-indbtn'); if (!btn) return;
  var ids = indChecked();
  if (!ids.length){ btn.textContent = 'å…¨éƒ¨è¡Œä¸š â–¾'; btn.classList.remove('on'); return }
  if (ids.length === 1){
    var cb = $('#lp-indpop input[value="' + ids[0] + '"]');
    btn.textContent = (cb ? cb.parentNode.textContent.trim() : ids[0]) + ' â–¾';
  } else { btn.textContent = 'å·²é€‰ ' + ids.length + ' ä¸ªè¡Œä¸š â–¾' }
  btn.classList.add('on');
}
function indSync(){
  var box = $('#lp-indpop'); if (!box) return;
  var set = {};
  (S.filters.industry || '').split(/[,\s]+/).filter(Boolean).forEach(function(v){ set[v] = 1 });
  Array.prototype.forEach.call(box.querySelectorAll('input'), function(cb){ cb.checked = !!set[cb.value] });
  indLabel();
}
if ($('#lp-indbtn')){
  $('#lp-indbtn').addEventListener('click', function(e){
    e.stopPropagation(); var p = $('#lp-indpop');
    p.style.display = (p.style.display === 'block') ? 'none' : 'block';
  });
  $('#lp-indpop').addEventListener('click', function(e){ e.stopPropagation() });
  document.addEventListener('click', function(){ var p = $('#lp-indpop'); if (p) p.style.display = 'none' });
  $('#lp-indpop').addEventListener('change', function(){
    S.filters.industry = indChecked().join(','); indLabel(); pushFilters(); resetList();
  });
  $('#lp-indclr').addEventListener('click', function(e){
    e.preventDefault();
    Array.prototype.forEach.call($('#lp-indpop').querySelectorAll('input'), function(cb){ cb.checked = false });
    S.filters.industry = ''; indLabel(); pushFilters(); resetList();
  });
  indSync();
}
$('#lp-q').addEventListener('keydown', function(e){ if (e.key === 'Enter'){ e.preventDefault(); applyQ(this.value) } });

// â”€â”€ è¿”å›žæ�¢å¤�ï¼ˆæ»šåŠ¨/ç­›é€‰/é€‰ä¸­ï¼‰â”€â”€
window.addEventListener('popstate', function(e){
  var st = e.state || {};
  var f = st.f || {range:'all', industry:'', q:''};
  var changed = (f.range !== S.filters.range) || (f.industry !== S.filters.industry) || (f.q !== S.filters.q);
  if (changed){
    S.filters = {range:f.range||'all', industry:f.industry||'', q:f.q||''};
    $('#lp-q').value = S.filters.q;
    indSync();
    Array.prototype.forEach.call(document.querySelectorAll('#lp-range .lp-chip'), function(a){ a.classList.toggle('act', a.dataset.v === S.filters.range) });
    resetList().then(function(){ return restorePages(st.n) }).then(function(){ restore(st) });
  } else { restore(st) }
});
function restorePages(n, round){
  round = round || 0;
  if (!n || round > 8 || S.items.length >= n || !S.hasMore) return Promise.resolve();
  return loadMore().then(function(){ return restorePages(n, round + 1) });
}
function restore(st){
  listBox.scrollTop = st.scroll || 0;
  if (st.id && S.ids[String(st.id)]) select(st.id, true, false); else window.__lpClose();
}

// â”€â”€ å�¯åŠ¨ â”€â”€
if (BOOT.items && BOOT.items.length){ appendItems(BOOT.items); S.cursor = BOOT.cursor || ''; S.hasMore = !!BOOT.has_more;
  var _ltC = $('#lp-total'); if (BOOT.total && _ltC) _ltC.textContent = BOOT.total.toLocaleString() + (BOOT.total_truncated ? '+' : ''); }
else { loadMore(); }
window.__lpDebug = function(){ return {items:S.items.length, sel:S.sel, cursor:S.cursor, hasMore:S.hasMore,
  cached:Object.keys(S.cache).filter(function(k){ return typeof S.cache[k] === 'string' && S.cache[k] }).length,
  cachedIds:Object.keys(S.cache).slice(0,8), loading:S.loading, filters:S.filters,
  scroll:listBox.scrollTop, drawerOpen:drawer.classList.contains('open'), drawerLen:drawer.innerHTML.length} };
history.replaceState({lp:1, f:S.filters, scroll:0}, '');
setTimeout(idlePrefetch, 500);
setTimeout(function(){ if (S.items.length && S.hasMore) loadMore() }, 260);   // é¦–å±�å�Žç«‹åˆ»è¡¥ä¸€é¡µï¼Œæ»šåŠ¨æ— ç­‰å¾…
})();
</script>c           
      ór  ‡‡‡— t         j                  |t         d   «      Š|dk(  rdnd}t        |d‰|||dk(  r
t        «       nd|dk7  ¬«      }|dk(  rt	        |«       ‰|d<   ||d<   ||d<   ||d	<   g d
¢}dj                  ˆˆfd„|D «       «      }t        j                  d|xs dj                  «       «      D �	cg c]  }	|	sŒ|	‘Œ	 c}	Št        t        «      dddœgz   }
‰sd\  }}n<t        ‰«      dk(  rt        ˆfd„|
D «       ‰d   «      dz   }d}ndt        ‰«      z  d}}d|z   dz   |z   dz   dj                  ˆfd„|
D «       «      z   dz   }‰d   rdnd}‰d   rdnd}d ‰d!   z   d"z   t        z   d#z   t        z   d$z   ‰d%   z   d&z   t        |«      z   d'z   |z   d(z   |z   d)z   |z   d(z   |z   d*z   t!        | «      z   d+z   |z   d,z   ‰d-   z   d.z   ‰d/   z   d0z   t#        j$                  |d1¬2«      z   d3z   t&        j)                  d4|«      j)                  d5‰d/   «      z   d#z   t*        z   d6z   t,        z   d7z   S c c}	w )8uL  åˆ—è¡¨é¡µ v2 å¤–å£³ï¼ˆå·¦åˆ—è¡¨ + å�³æŠ½å±‰ï¼‰ã€‚é¦–å±�æ•°æ�®å†…è�”ï¼Œé�¿å…�äºŒæ¬¡è¯·æ±‚ã€‚

    2026-09-11 å¤šè·¯ç”±åŒ–ï¼šroute âˆˆ {crawler, zc, ccpc, contact}ã€‚
    LIST_UI_JS é‡Œçš„ __ROUTE__ / __BASE__ å� ä½�ç¬¦åœ¨**è¿™é‡Œ str.replace æ›¿æ�¢**â€”â€”
    ä¸�èƒ½ç”¨ f-stringï¼šJS é‡Œå¤§é‡� {} ä¼šè¢«å½“æˆ�æ ¼å¼�å� ä½�ç¬¦ã€‚
    r6  r   u%    Â· å…± <b id="lp-total">â€”</b> æ�¡ rÎ   )r§  r;  r<  r«   rZ   rÄ  r¤   r<  r«   Úroute)©rô   õ   å…¨éƒ¨)rú   u   ä»Šæ—¥)ro  u   3å¤©)rû   u   7å¤©)rü   u   30å¤©)rq  u   ä¸€å¹´c              3   ó\   •K  — | ]#  \  }}d ‰|k(  rdnd›d|›d‰d   ›d|›d|›d�–— Œ% y	­w)
z<a class="lp-chipz actr   z
" data-v="ú" href="Úbasez?range=r³  ú</a>Nrd   )r^   r#   r,   r;  Úmetas      €€r	   ra   z$render_list_shell.<locals>.<genexpr>À
  s<   øè ø€ ò ñ ˆA‰uð   1’n‰F¨"Ñ,ªa°°f³ºqÂ%ô	Iñùs   ƒ),r   rk   õ   å…¶ä»–)r+   Úcn)u   å…¨éƒ¨è¡Œä¸š â–¾r   r›   c              3   ó@   •K  — | ]  }|d    ‰d   k(  sŒ|d   –— Œ y­w)r+   r   rë  Nrd   ©r^   rŸ   Ú_ind_sels     €r	   ra   z$render_list_shell.<locals>.<genexpr>Ë
  s$   øè ø€ ÒO Q¸¸$¹À8ÈAÁ;Ó8N˜˜4�ÑOùó   ƒ”
r   u    â–¾z onu   å·²é€‰ %d ä¸ªè¡Œä¸š â–¾z&<button type="button" class="lp-indbtnz" id="lp-indbtn">u¥   </button><div class="lp-indpop" id="lp-indpop" style="display:none"><div class="lp-indpop-hd"><b>è¡Œä¸šï¼ˆå�¯å¤šé€‰ï¼‰</b><a href="#" id="lp-indclr">æ¸…ç©º</a></div>c              3   óT   •K  — | ]  }d |d   ›d|d   ‰v rdnd›d|d   ›d�–— Œ! y­w)	z6<label class="lp-indit"><input type="checkbox" value="r+   rŽ   z checkedr   r�   rë  z</label>Nrd   rí  s     €r	   ra   z$render_list_shell.<locals>.<genexpr>Ô
  s>   øè ø€ ò /áð ˜t›W°A°d±G¸xÑ4G¡jÈRÑ&OÐQRÐSWÓQXôZñ /ùs   ƒ%(r´  Úchipsz style="display:none"r­  z6 style="min-width:140px;max-width:210px;flex:0 0 auto"ú‰<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>rw   u    Â· BJIIRé¡¹ç›®åº“</title>ú<style>z­</style></head><body><div class="lp-bar" id="lp-bar"></div><header class="lp-head"><a class="lp-logo" href="/">BJIIR</a><div class="lp-search"><input id="lp-q" placeholder="Úphú	" value="uK   "><span class="lp-kbd">âŒ˜K</span></div><div class="lp-chips" id="lp-range"r�   z'</div><div class="lp-search lp-indwrap"z</div><div class="lp-right">u¢   </div></header><div class="lp-main"><section class="lp-list" id="lp-list"><div class="lp-list-inner"><div class="lp-meta-bar">å·²åŠ è½½ <b id="lp-count">0</b> æ�¡u     <span style="color:#aab0b8">ï¼ˆrà   u*   Â· æ— é™�æ»šåŠ¨ï¼‰</span></div><div id="lp-items"></div><div class="lp-more" id="lp-more"></div><div id="lp-sentinel" style="height:1px"></div></div></section><aside class="lp-drawer" id="lp-drawer"></aside></div><div class="lp-hint"><span><kbd>J</kbd> <kbd>K</kbd> ä¸Šä¸‹ç§»åŠ¨</span><span><kbd>Enter</kbd> æ‰“å¼€</span><span><kbd>âŒ˜K</kbd> æ�œç´¢</span><span><kbd>/</kbd> ç­›é€‰</span><span><kbd>Esc</kbd> å…³é—­</span></div><div class="lp-cmk" id="lp-cmk"><div class="lp-cmk-box"><input id="lp-cmk-in" placeholder="å¿«é€Ÿæ�œç´¢ï¼šæ ‡é¢˜ / å…¬å�¸å…¨ç§° / å…³é”®è¯�â€¦ï¼ˆEsc å…³é—­ï¼‰" autocomplete="off"><div class="lp-cmk-res" id="lp-cmk-res"></div><div class="lp-cmk-foot"><span>â†‘â†“ é€‰æ‹©</span><span>Enter æ‰“å¼€</span><span>Ctrl+Enter å…¨éƒ¨ç»“æžœ</span><span id="lp-cmk-foot-hint"></span><a href="rç  ur   ?q=" id="lp-cmk-all" onclick="return false">æŸ¥çœ‹å…¨éƒ¨ç»“æžœ â†’</a></div></div></div><script>window.__BOOT__ = F©Úensure_asciiz
;</script>Ú	__ROUTE__Ú__BASE__ú</style>ú</body></html>)ÚLIST_ROUTE_METAr   Úbrowse_routeÚadmin_whitelist_kwÚ_crawler_attach_viewsr   r   r   r   r5  Ú
INDUSTRIESr]   r  ÚLIST_UI_CSSÚ
DETAIL_CSSr“   r¹  ÚjsonÚdumpsÚ
LIST_UI_JSrr   Ú_ORIG_EXTRA_CSSÚ_ORIG_SELECT_JS)r£  r;  r<  r«   râ  Ú_lp_total_htmlÚbootrñ  Ú
chips_htmlrf   Ú
_ind_itemsÚ_ind_lblÚ_ind_clsÚind_htmlÚ_chips_vÚ_ind_vrî  ré  s    `              @@r	   Úrender_list_shellr  ¦
  s�  ú€ ô ×Ñ˜u¤o°iÑ&@ÓA€Dð " YÒ.‘bÐ4[€Nô
 ˜ R°9ÀxÐSTØ49¸YÒ4FÔ.Ô0ÈBØ$)¨YÑ$6ô9€Dð �	ÒÜ˜dÔ#Ø€Dˆ�MØ€DˆÑØ€Dˆ�IØ€Dˆ�MÚu€EØ—‘ô ð ôó €Jô Ÿ8™8 I°²¸B×/EÑ/EÓ/GÓHÖN�aÊA’ÒN€HÜ”jÓ!¨G¸8Ñ%DÐ$EÑE€JÙØ3Ñˆ‘(Ü	ˆX‹˜!Ò	ÜÓO¨*ÔOÐQYÐZ[ÑQ\Ó]Ð`fÑfˆØ‰à6¼¸X»ÑFÈ�(ˆØ8¸8ÑCÐFYÑYØñð>ñ>ð
 —'‘'ó /à#-ô/ó /ñ/ð ñ€Hð ˜'’]‰rÐ(?€Hð JNÈeÊÑEÐZq€Fðà˜W™ñ&à(DñEô ñð &ñ&ô )3ñ3ð6DñDð GKÈ4ÁjñQð T_ñ_ô �!‹fñ	ð2ñ
2ð 5=ñ
=ð @Cñ
Cð FPñ
PðS0ñ0ð 39ñ9ð <?ñ?ð BJñJðM%ñ%ô (6°hÓ'?ñ@ðCLñLð  O]ñ!]ð" 1ñ#1ð" 48¸±<ñ#@ð"Cñ#!ðB ˜v™,ñC!'ðB*)ñC#)ôF ,0¯:©:°dÈÔ+OñG#PðF S_ñG#_ôH × Ñ  ¨eÓ4×<Ñ<¸ZÈÈfÉÓVñI$WðJ ñK%ôJ (ñK%(ðJ +5ñK%5ôJ 8GñK%GðL ñM&ð &ùò/ Os   Â;H4ÃH4c                  ó¨   — 	 t        t        «      5 } | j                  «       j                  «       cddd«       S # 1 sw Y   yxY w# t        $ r Y yw xY w)uX   è¯»å�–ç®¡ç�†é¡µä¿�å­˜çš„ç™½å��å�•å…³é”®è¯�ï¼ˆåˆ—è¡¨é¡µä¸Ž /crawler æ—§ç‰ˆä¿�æŒ�ä¸€è‡´ï¼‰Nr   )ÚopenÚADMIN_EXCLUDE_PATHÚreadr   r…   ©r˜  s    r	   rþ  rþ    sH   € ðÜÔ$Ó%ð 	$¨Ø—6‘6“8—>‘>Ó#÷	$÷ 	$ò 	$ûäò Ùðúó*   ‚A ‘9¯	A ¹A¾A ÁA Á	AÁAc                  ó¨   — 	 t        t        «      5 } | j                  «       j                  «       cddd«       S # 1 sw Y   yxY w# t        $ r Y yw xY w)uG  è¯»å�–ç®¡ç�†é¡µä¿�å­˜çš„ã€ŒæŽ’é™¤å…³é”®è¯�ã€�ï¼ˆ2026-09-11 æ–°å¢žï¼‰ã€‚

    è¯­ä¹‰ï¼šå‘½ä¸­å�³å‰”é™¤ â€”â€” æ ‡é¢˜/ç«™ç‚¹/URL ä»»ä¸€åˆ—å�«è¯¥è¯�å°±ä¸¢ï¼Œå¤šä¸ªè¯�ä¹‹é—´æ˜¯ ANDï¼ˆæ¯�ä¸ªéƒ½è¦�æ±‚ä¸�å‘½ä¸­ï¼‰ã€‚
    ä¸Žç™½å��å�•å� åŠ å�Žå°±æ˜¯ç”¨æˆ·è¦�çš„ã€Œå�Œæ�¡ä»¶æ”¶çª„ã€�ï¼šå…ˆæŒ‰åŒ…å�«è¯�æ”¶ï¼Œå†�æŠŠæŽ’é™¤è¯�æ¸…æŽ‰ã€‚
    Nr   )r  ÚADMIN_BLOCK_PATHr  r   r…   r  s    r	   rÂ  rÂ    sH   € ðÜÔ"Ó#ð 	$ qØ—6‘6“8—>‘>Ó#÷	$÷ 	$ò 	$ûäò Ùðúr  c                 ó„   — t        j                  d| xs dj                  «       «      D �cg c]  }|sŒ|‘Œ	 c}d| S c c}w )ua   é€—å�·/ç©ºæ ¼/å…¨è§’é€—å�·åˆ†éš”çš„å…³é”®è¯�ä¸² â†’ åˆ—è¡¨ï¼ˆä¸Žç™½å��å�•è§£æž�å�£å¾„ä¸€è‡´ï¼‰ã€‚õ	   [,ï¼Œ\s]+r   N)r   r   r   )r’   Úcaprf   s      r	   rÁ  rÁ    s5   € ä—x‘x ¨qªw°B¯o©oÓ.?Ó@ÖF�!ÂAŠAÒFÀtÈÐLÐLùÒFs   «=³=c           
      ó¼   ‡— | sdg fS ddj                  ˆfd„| D «       «      z   dz   }|| D ��cg c]   }t        d«      D ]  }dt        |«      z  ‘Œ Œ" c}}fS c c}}w )u�  ç®¡ç�†é¡µã€ŒæŽ’é™¤å…³é”®è¯�ã€�çš„ç»Ÿä¸€è°“è¯�ï¼šæ ‡é¢˜/ç«™ç‚¹/URL ä¸‰åˆ— NOT LIKEï¼Œè¯�é—´ ANDï¼ˆä»»ä¸€å‘½ä¸­å�³å‰”é™¤ï¼‰ã€‚

    âš ï¸� å¿…é¡» COALESCE(page_url)ï¼špage_url å�¯èƒ½ä¸º NULLï¼Œè€Œ `NULL NOT LIKE x` æ±‚å€¼ä¸º NULL
    ï¼ˆåœ¨ WHERE é‡Œå½“ Falseï¼‰â†’ æ•´æ�¡è¢«**è¯¯å‰”é™¤**ã€‚ç™½å��å�•é‚£è¾¹ç”¨ LIKEï¼ŒNULL å�ªæ˜¯ä¸�å‘½ä¸­ä¸�ä¼šè¯¯ä¼¤ï¼Œ
    æ‰€ä»¥é‚£ä¸ªå‡½æ•°æ²¡è¿™ä¸ªé—®é¢˜ â€”â€” åˆ«ç…§æŠ„ã€‚
    Nr±   r  c              3   ó6   •K  — | ]  }d ‰›d‰›d‰›d�–— Œ y­w)r±   ztitle NOT LIKE ? AND z"site_name NOT LIKE ? AND COALESCE(zpage_url,'') NOT LIKE ?)Nrd   ©r^   r  Úaliass     €r	   ra   z#_block_like_pred.<locals>.<genexpr>*  s   øè ø€ ò 2á$%Š5’%šô	 ñ2ùó   ƒr²   rm   ú%%%s%%©r   r¤   r�   ©Úkw_listr   rŽ  r…  r  s    `   r	   rÀ  rÀ  !  sp   ø€ ñ Ø�RˆxˆØ�—‘ó 2à)0ô2ó 2ñ 2à47ñ8€Dð ¨W×G¨¼eÀA»hÒG¸�(œS ›VÓ#ÐGÐ#ÓGÐGÐGùÓGó   ®%Aú	/crawler/õ   çŽ¯è¯„å…¬ç¤ºTu   æŒ‰å�‘å¸ƒæ—¶é—´å€’åº�uF   æ�œç´¢é¡¹ç›®æ ‡é¢˜/å…¬å�¸/å…³é”®è¯�ï¼ˆâ‰¥3 å­—æ›´å‡†ï¼Œå›žè½¦ç­›é€‰ï¼‰)rç  rw   rñ  r­  rà   rô  ú/zc/õ   ä¸­ç­–å¤§æ•°æ�®u6   æ�œç´¢é¡¹ç›®å��ç§° / è¡Œä¸š / åœ°åŒºï¼ˆå›žè½¦ç­›é€‰ï¼‰ú/ccpcõ	   ä¸­é¡¹ç½‘u3   æ�œç´¢é¡¹ç›®å��ç§° / ä¸šä¸»å…¬å�¸ï¼ˆå›žè½¦ç­›é€‰ï¼‰ú/contactõ   è�”ç³»äººDBu   æŒ‰å½•å…¥å€’åº�u<   æ�œç´¢å…¬å�¸ / è�”ç³»äºº / æ‰‹æœº / é‚®ç®±ï¼ˆå›žè½¦ç­›é€‰ï¼‰)r6  ÚzcÚccpcÚcontactc           
      ó¼   ‡— | sdg fS ddj                  ˆfd„| D «       «      z   dz   }|| D ��cg c]   }t        d«      D ]  }dt        |«      z  ‘Œ Œ" c}}fS c c}}w )u%  ç®¡ç�†é¡µç™½å��å�•ï¼ˆ"ä»…é™�ç»™å®šå…³é”®è¯�"ï¼‰çš„**ç»Ÿä¸€è°“è¯�**ï¼šæ ‡é¢˜/ç«™ç‚¹/URL ä¸‰åˆ— LIKEï¼Œè¯�é—´ ORã€‚

    2026-09-11 å�£å¾„ç»Ÿä¸€ã€‚åŽŸæ�¥å�Œä¸€ä»½ç™½å��å�•**ä¸¤å¥—è¯­ä¹‰**ï¼š
      Â· v2 åˆ—è¡¨ `browse_items`ï¼š`_list_term_preds` â†’ ä¸­æ–‡ 2 å­—è¯�èµ° `gov_bigram`
        ï¼ˆè¦†ç›– **æ ‡é¢˜ + æ­£æ–‡ + æ‘˜è¦�**ï¼‰
      Â· ç»�å…¸é¡µ `handle_db_list`ï¼š`title/site_name/page_url LIKE '%kw%'`
    å®žæµ‹å�Œä¸€æ�¡ç™½å��å�• "é¡¹ç›® å·¥ç¨‹"ï¼šv2 è¯­ä¹‰é¦–å±� 30/30 å�ˆæ ¼ã€�LIKE å�£å¾„å�ª 23/30ï¼ˆ7 æ�¡ä»…æ­£æ–‡å‘½ä¸­ï¼‰
    â†’ å�Œä¸€ä»½ç™½å��å�•ä¸¤ä¸ªé¡µé�¢å‡ºä¸¤å¥—ç»“æžœï¼Œ**éªŒè¯�æ—¶æž�æ˜“è¯¯åˆ¤"è§„åˆ™æ²¡ç”Ÿæ•ˆ"**ã€‚

    ç»Ÿä¸€åˆ°æœ¬å‡½æ•°ï¼ˆä¸‰åˆ— LIKEï¼‰çš„ç�†ç”±ï¼š
      1. ç™½å��å�•æ˜¯**å…¬å‘Šçº§é—¨ç¦�** â€”â€” è¯¥çœ‹å…¬å‘Šè‡ªèº«çš„èº«ä»½ï¼ˆæ ‡é¢˜ / æ�¥æº�ç«™ / URLï¼‰ï¼Œ
         æ­£æ–‡é‡Œé¡ºå¸¦æ��åˆ°çš„å…³é”®è¯�ä¸�è¯¥æŠŠä¸€æ�¡å…¬å‘Šæ”¾è¿›æ�¥ï¼›
      2. ä¸‰åˆ— LIKE åœ¨ v2 ä¸Žç»�å…¸é¡µçš„å››æ�¡ SQL è·¯å¾„ä¸Šéƒ½èƒ½å®‰å…¨è�½åœ°ï¼›æ�¢æˆ� bigram å�£å¾„
         è¦�ç»™ã€Œæ— è¯�æµ�è§ˆã€�è·¯å¾„åŠ è¡¨åˆ«å��ï¼ˆæŠ€èƒ½é‡Œæ˜Žä»¤çš„é›·åŒºï¼‰ï¼Œé£Žé™©ä¸�æˆ�æ¯”ä¾‹ï¼›
      3. å�£å¾„å�¯è¢«"çœ‹æ ‡é¢˜"ç›´æŽ¥éªŒè¯� â€”â€” è¿™æ­£æ˜¯ç”¨æˆ·å½“åˆ�åˆ¤å®š"æ²¡ç”Ÿæ•ˆ"çš„æ–¹å¼�ã€‚
    ä»£ä»·ï¼šv2 åˆ—è¡¨ä¸�å†�åŒ…å�«"ä»…æ­£æ–‡å‘½ä¸­"çš„è®°å½•ï¼ˆæœ¬æ¬¡å®žæµ‹çº¦ 7/30 æ�¡ï¼‰ã€‚
    è®¡æ•°ä¸�å�—å½±å“�ï¼šç™½å��å�•ç”Ÿæ•ˆæ—¶ä»�èµ°æˆªæ–­å¼�è®¡æ•°ï¼ˆLIMIT 5001ï¼Œ0.077s â†’ æ˜¾ç¤º "5,001+"ï¼‰ã€‚

    âš ï¸� LIKE ä¸�åŒºåˆ† ASCII å¤§å°�å†™ï¼Œæ•…è°ƒç”¨æ–¹**ä¸�å¿…**å…ˆ lowercaseï¼ˆç»�å…¸é¡µåŽŸæ�¥ lower() è¿‡ï¼Œ
    ç»“æžœç­‰ä»·ï¼‰ã€‚è¿”å›ž (None, []) è¡¨ç¤ºæ— ç™½å��å�•ã€‚
    Nr±   rz  c              3   ó6   •K  — | ]  }d ‰›d‰›d‰›d�–— Œ y­w)r±   ztitle LIKE ? OR zsite_name LIKE ? OR zpage_url LIKE ?)Nrd   r  s     €r	   ra   z'_whitelist_like_pred.<locals>.<genexpr>i  s$   øè ø€ ò áò JOÒPUÒW\Ô]ñùr!  r²   rm   r"  r#  r$  s    `   r	   r¿  r¿  Q  sp   ø€ ñ, Ø�RˆxˆØ�—‘ó àôó ñ àñ €Dð ¨W×G¨¼eÀA»hÒG¸�(œS ›VÓ#ÐGÐ#ÓGÐGÐGùÓGr&  c                 óè   — g }t        j                  d|xs dj                  «       «      D ]  }|sŒ||vsŒ|j                  |«       Œ |sdg fS | ›ddj	                  dt        |«      z  «      ›d�|fS )u  industry å�‚æ•° â†’ (SQL ç‰‡æ®µ, å�‚æ•°åˆ—è¡¨)ï¼›**æ”¯æŒ�å¤šé€‰**ï¼ˆé€—å�·/ç©ºæ ¼åˆ†éš”ï¼Œ2026-09-11ï¼‰ã€‚

    å�•é€‰æ—¶ä»£ç �æ˜¯ `col = ?`ï¼Œå¤šé€‰æ”¹ `col IN (?,?,...)`ã€‚
    åŽ»é‡�ä¿�åº�ï¼›é�žæ³•å€¼åŽŸæ ·è¿› INï¼ˆä¸Žæ—§è¡Œä¸ºç­‰ä»·ï¼šæŸ¥ä¸�åˆ°å�³ 0 æ�¡ï¼‰ã€‚
    r   r   Nz IN (r	  r
  r²   )r   r   r   r   r   r]   )ÚcolÚindustry_csvrP  rf   s       r	   r¾  r¾  o  st   € ð €CÜ�X‰X�i ,Ò"4°"×!;Ñ!;Ó!=Ó>ò ˆÚ�˜#’Ø�J‰J�q�Mðñ Ø�RˆxˆÚ §¡¨¬s°3«x©Õ 8Ð9¸3Ð>Ð>r   c                 ó¶   — 	 t        j                  | xs d›d|›�j                  d«      «      j                  «       j	                  d«      S # t
        $ r Y yw xY w)uL   æ¸¸æ ‡ç¼–ç �ï¼ˆè·¨é�ž crawler è·¯ç”±å…±ç”¨ï¼›rid ä¿�æŒ�å­—ç¬¦ä¸²å½¢æ€�ï¼‰ã€‚r   rs  rt  ru  rv  r|  s     r	   Ú	_enc_cursr8  ~  sU   € ðÜ×'Ñ'°C²I¸2±I¹sÐ)C×(KÑ(KÈGÓ(TÓU×\Ñ\Ó^×eÑeÐfiÓjÐjøÜò Ùðúr  c                 óæ   — | sy	 t        j                  | dt        | «       dz  z  z   j                  «       «      j	                  dd«      }|j                  dd«      \  }}||fS # t        $ r Y yw xY wr�  )rw  rƒ  r]   ry  rz  r   r…   r†  s       r	   Ú	_dec_cursr:  †  sw   € ÙØðÜ×$Ñ$ c¨C´C¸³H°9¸q±=Ñ,AÑ&A×%IÑ%IÓ%KÓL×SÑSÐT[Ð]eÓfˆØ—7‘7˜3 “?‰ˆˆSØ�CˆxˆøÜò Ùðús   …AA$ Á$	A0Á/A0c                 óÀ   — t        j                  ddt        | «      «      }t        j                  dd|«      }t        j                  dd|«      j                  «       d| S )uq   æ‘˜å½•æ¸…æ´—ï¼šåŽ»å™ªå£°å�—ã€�åŽ»æ ‡ç­¾ã€�åŽ»å®žä½“ã€�åŽ‹ç©ºç™½ï¼ˆå�« SUBSTR æˆªæ–­åœ¨æ ‡ç­¾ä¸­é—´çš„æ®‹ç‰‡ï¼‰ã€‚z<[^>]*>?r´   r§  r·   N)r   r—   rÃ  r   )r#   r�  ro   s      r	   Ú
_clean_txtr<  ‘  sR   € ä
�‰ˆ{˜CÔ!1°!Ó!4Ó5€Aô 	�‰Ð8¸#¸qÓA€AÜ�6‰6�&˜#˜qÓ!×'Ñ'Ó)¨"¨1Ð-Ð-r   c           
      óü  — | j                  d«      xs dj                  «       }| j                  d«      xs dj                  «       }dj                  | j                  d«      xs dj                  «       | j                  d«      xs dj                  «       fD �cg c]  }|r|‘Œ c}«      }g }|r|j                  |ddœ«       |r|j                  |ddœ«       t	        | j                  d	«      xs d«      | j                  d
«      xs dj                  «       || j                  d«      xs dd d |t        | j                  d«      xs( | j                  d«      xs | j                  d«      xs d«      ddœS c c}w )Nr<  r   r9  ú/r   r"  r­  r®  r  r  r-  r|   r>  Útopicr@  ©r+   rw   r±  r²  r³  rµ  r›  )r   r   r   r   r�   r<  )r  r­  rô  rf   Úlocr³  s         r	   Ú_zc_itemrB  ›  sV  € Ø�5‰5�ÓÒ" ×
)Ñ
)Ó
+€CØ
�%‰%�‹.Ò
˜B×	%Ñ	%Ó	'€BØ
�(‰( §¡ zÓ!2Ò!8°b× ?Ñ ?Ó AØ!"§¡ v£Ò!4°"× ;Ñ ;Ó =ð ?ö E˜!ÙBCò ò Eó F€Cà€DÙ
Ø�‰˜# EÑ*Ô+Ù	Ø�‰˜" 2Ñ&Ô'Ü�a—e‘e˜LÓ)Ò/¨RÓ0Ø—e‘e˜NÓ+Ò1¨r×8Ñ8Ó:ØØ—U‘U˜>Ó*Ò0¨b°#°2Ð6ØÜ! !§%¡%¨£.Ò"c°A·E±E¸'³NÒ"cÀaÇeÁeÐL\ÓF]Ò"cÐacÓdØñð ùòEs   ÂE9c           
      óD  — | j                  d«      xs dj                  «       }| j                  d«      xs dj                  «       }g }|r|j                  |ddœ«       |r|j                  |ddœ«       t        | j                  d«      xs d«      | j                  d«      xs dj                  «       | j                  d«      xs dj                  «       | j                  d	«      xs dd d
 |t	        | j                  d«      xs | j                  d«      xs d«      ddœS )Nr<  r   r9  r­  r®  r+   r  r  r-  r|   ÚoverviewrY  r@  )r   r   r   r�   r<  )r  r­  rô  r³  s       r	   Ú
_ccpc_itemrE  ®  sú   € Ø�5‰5�ÓÒ" ×
)Ñ
)Ó
+€CØ
�%‰%�‹.Ò
˜B×	%Ñ	%Ó	'€BØ€DÙ
Ø�‰˜# EÑ*Ô+Ù	Ø�‰˜" 2Ñ&Ô'Ü�a—e‘e˜D“kÒ' RÓ(Ø—e‘e˜NÓ+Ò1¨r×8Ñ8Ó:Ø—U‘U˜?Ó+Ò1¨r×8Ñ8Ó:Ø—U‘U˜>Ó*Ò0¨b°#°2Ð6ØÜ! !§%¡%¨
Ó"3Ò"L°q·u±u¸X³Ò"LÈ"ÓMØñð r   c           
      ó"  — g }t        | j                  d«      «      }|r|j                  |ddœ«       dj                  | j                  d«      xs dj	                  «       | j                  d«      xs dj	                  «       fD �cg c]  }|r|‘Œ c}«      }|r|j                  |ddœ«       t        | j                  d«      xs d«      | j                  d	«      xs dj	                  «       dj                  | j                  d
«      xs dj	                  «       | j                  d«      xs dj	                  «       fD �cg c]  }|r|‘Œ c}«      d|t        | j                  d«      xs | j                  d«      xs d«      ddœS c c}w c c}w )NÚroler­  r®  õ    Â· r`  r   ra  r+   r  r_  r  rc  rb  r@  )r$   r   r   r   r   r�   r<  )r  r³  Ú_rolerf   Ú_dps        r	   Ú_contact_itemrK  ¿  sn  € Ø€DÜ  §¡ v£Ó/€EÙØ�‰˜% eÑ,Ô-Ø
�+‰+ A§E¡E¨,Ó$7Ò$=¸2×#DÑ#DÓ#FØ#$§5¡5¨Ó#4Ò#:¸×"AÑ"AÓ"Cð#Eö K˜QÙHIò ò Kó L€Cá
Ø�‰˜# BÑ'Ô(Ü�a—e‘e˜D“kÒ' RÓ(Ø—e‘e˜IÓ&Ò,¨"×3Ñ3Ó5Ø—K‘K¨a¯e©e°NÓ.CÒ.IÀr×-PÑ-PÓ-RØ-.¯U©U°7«^Ò-A¸r×,HÑ,HÓ,Jð-Lö !R qÙOPò "#ò !Ró SàØÜ! !§%¡%¨	Ó"2Ò"L°a·e±e¸IÓ6FÒ"LÈ"ÓMØñð ùò	Kùò!Rs   ÂFÅ Fc           	      óp  — g ddddddœ}t         j                  j                  | «      s|S 	 t        dt	        t        |xs d«      d«      «      }	 t        j                  | d	¬
«      }t        j                  |_
        |j                  «       }g g d}}}t        j                  |
«      }|r|r|j                  d|||fz  «       t        j                   d|xs dj#                  «       «      D �cg c]  }|sŒ|‘Œ	 c}dd D ]S  }|j                  ddj%                  d„ |D «       «      z   dz   «       |j'                  d|z   dz   gt)        |«      z  «       ŒU d\  }}|rt+        |«      \  }}|dvr½	 |rt        |«      n|}|rm|	dk(  r4|j                  d|›d|›d�«       |j'                  ||g«       |›d|›d�}nÂ|j                  d|›d|›d�«       |j'                  ||g«       |›d|›d�}nŽ|j                  |›d|	dk(  rdnd›d �«       |j                  |«       |›d|	dk(  rd!nd"›�}nP|r|›d|›d�nd#|z  }|r?	 |j-                  d$|›|rd%d&j%                  |«      z   nd›�|«      j/                  «       d   }g }	 |j-                  d'|›|rd%d&j%                  |«      z   nd›d(|›d)�||dz   gz   «       |j1                  «       D �cg c]  }t3        |«      ‘Œ }}	 |j5                  «        t)        |«      |kD  }|r|d| }|	dk(  r|j7                  «        |D �cg c]
  } ||«      ‘Œ }}|r;t9        |r|d*   j                  |«      xs ddd	 nd|d*   j                  |«      «      nd}|r;t9        |r|d   j                  |«      xs ddd	 nd|d   j                  |«      «      nd}||r|nd|||dt)        |«      d+œS # t        $ r d}Y �Œw xY w# t        $ r |cY S w xY wc c}w # t        $ r |}Y �Œyw xY w# t        $ r d}Y �ŒŽw xY wc c}w # t        $ r g }Y �ŒDw xY w# t        $ r Y �ŒCw xY wc c}w ),uU  keyset æ¸¸æ ‡åˆ†é¡µå¼•æ“Žï¼ˆé�ž crawler è·¯ç”±å…±ç”¨ï¼‰ã€‚

    id_col    : ä¸»é”®åˆ—ï¼ˆzc=TEXT project_idï¼›ccpc/contact=INTEGER idï¼‰
    date_col  : æ—¥æœŸåˆ—ï¼›None = è¯¥è¡¨æ— æ—¥æœŸï¼ˆcontactï¼Œé€€åŒ–ä¸º id å�•é”® keysetï¼‰
    like_cols : å…³é”®è¯� LIKE çš„åˆ—ï¼ˆå¤šè¯�ä¹‹é—´ ANDï¼‰
    row_fn    : è¡Œ dict â†’ ç»Ÿä¸€ item å½¢çŠ¶
    r   FNr   )r·  r¸  r¹  rL  rD  r  r›   rÎ   rž  r|   r}   zi(%s GLOB '20[0-9][0-9]-[0-9][0-9]-[0-9][0-9]*' AND SUBSTR(%s,1,10) >= date('now','localtime','-%d days'))r   ry  r±   rz  c              3   ó&   K  — | ]	  }d |z  –— Œ y­w©z	%s LIKE ?Nrd   ©r^   r5  s     r	   ra   z"_browse_generic.<locals>.<genexpr>ô  s   è ø€ Ò&N¸S {°SÕ'8Ñ&Nùr  r²   r  rë   )Nr   rÂ  z, z
) > (?, ?)z ASC, z ASCz
) < (?, ?)ú DESC, ú DESCr´   r�   rŒ   z ?ÚASCÚDESCz%s DESCúSELECT COUNT(*) FROM r¢  r  úSELECT * FROM r  r£  rÆ   r¶  )rÕ   rÖ   rÜ   r»  r¼  r…  r…   r   r€   rÀ   rÁ   r.  r½  r   r   r   r   r   r   r£   r]   r:  r‚   r1  rÝ   r2  r„   rÓ   r8  ) Údb_pathÚtableÚid_colÚdate_colÚ	like_colsÚrow_fnÚ	id_is_intr.  r§  rÃ  r;  r«   rÄ  Úemptyr‚  rµ   ro  r=  rD  r@  rf   ro   rË  rÌ  Úci_vrÍ  ræ   rL  r  r·  rÐ  rÑ  s                                    r	   Ú_browse_genericr_  Ò  sl  € ð ¨¸BÈEØ Qñ(€Eä�7‰7�>‰>˜'Ô"ØˆðÜ�A”sœ3˜uš{¨Ó+¨RÓ0Ó1ˆðÜ�_‰_˜W¨bÔ1ˆÜ Ÿ™ˆŒð 	�	‰	‹€AØ˜r 4�5ˆ6€Eä�=‰=˜Ó#€DÙ‘à�‰ð Rà  (¨DÐ1ñ2ô 	3ô Ÿ™ )¨aªg°2¯_©_Ó->Ó?ÖE�AÂ1ŠaÒEÀbÀqÐIò 8ˆØ�‰�S˜6Ÿ;™;Ñ&NÀIÔ&NÓNÑNÐQTÑTÔUØ�‰�s˜Q‘w ‘}�o¬¨I«Ñ6Õ7ð8ð �F€BˆÙÜ˜6Ó"‰ˆˆBØ	�Ñð	Ù'”3�r”7¨RˆDñ à˜FÒ"Ø—’²HºfÐEÔFØ—‘˜r 4˜jÔ)Ú,4²fÐ=‘à—’²HºfÐEÔFØ—‘˜r 4˜jÔ)Ú.6ºÐ?‘à�L‰L¢f°YÀ&Ò5H©cÈcÑ.QÐRÔSØ�M‰M˜$ÔÚ%°	¸VÒ0C¡uÈÐ'OÐP‰Eá=E¢x²Ñ8ÈIÐX^ÑL^ˆÙðð Ÿ	š	ÙÁ˜I¨¯©°UÓ(;Ò;È2ÐMð#OØPVóXßX`ÑX`ÓXbÐcdñf�ð
 €DðØ	�	Š	ÙÁ˜Y¨¯©°eÓ)<Ò<ÈBÑNÒPUðWà˜E A™I˜;Ñ&ô	(ð "#§¡£Ö.˜A”�Q•Ð.ˆÐ.ðØ
�‰Œ
ô �4‹y˜5Ñ €HÙØ�F�Uˆ|ˆØ�FÒØ�‰ŒØ $Ö%˜1‰V�A�YÐ%€EÐ%á-1ô ¹H�d˜2‘h—l‘l 8Ó,Ò2°°C°RÑ8È"Ø˜‘H—L‘L Ó(ô*Ø79ð ñ -1ô ¹8�d˜1‘g—k‘k (Ó+Ò1¨r°3°BÑ7ÈØ˜‘G—K‘K Ó'ô)Ø68ð à±(©3ÀÐSVØ ¨5ÀUÜ˜“Zñ!ð !øô[ ò Ø‹ðûô
 ò ØŠðüò Føô ò 	Ø‹Dð	ûô0 ò Ø“ðüò /øÜò Ø‹ðûô ò Úðüò &s�   ¬#O  Á,O Ã,O#Ã4O#Å.O( È<>O: É=A
P ËPËP ËP# ÌP3Ï OÏOÏO ÏO Ï(O7Ï6O7Ï:P	ÐP	ÐP ÐP ÐP Ð#	P0Ð/P0c	                 ó  — | dk(  rt        t        ddddt        ||||||¬«      S | dk(  r t        t        dd	dd
t        d||||||¬«      S | dk(  r t        t
        dd	ddt        d||||||¬«      S t        ||||||||¬«      S )un   åˆ—è¡¨é¡µ v2 æ•°æ�®å…¥å�£ï¼ˆæŒ‰è·¯ç”±åˆ†å�‘ï¼‰ã€‚crawler èµ°æ—¢æœ‰ browse_itemsï¼Œå…¶ä½™èµ° _browse_genericã€‚r/  Úzc_projectsr  r-  )r  r<  r   r"  )r.  r§  rÃ  r;  r«   rÄ  r0  Úcceup_projectsr+   )r  r  r<  r   r"  T)r\  r.  r§  rÃ  r;  r«   rÄ  r1  r�  N)r  r_  r  ÚlandlineÚemailrG  r`  ra  )r.  r§  rÃ  r;  r<  rZ   r«   rÄ  )r_  r”  rB  r~  rE  ÚCONTACT_ROUTE_DBrK  rÒ  )	râ  r.  r§  rÃ  r;  r<  r«   rZ   rÄ  s	            r	   rý  rý  4  sÍ   € ð �‚}Üœz¨=¸,ÈØOÔQYØ&,°EÀYØ)2°aÀJôPð 	Pð �‚ÜœÐ0@À$ÈØ`Ü)°TÀ&ÐPUØ)2¸iÈ1ÐYcôeð 	eð �	ÒÜÔ/°¸TÀ4ð BÜCPØ)-°fÀEÐU^Ø)2°aÀJô	Pð 	Pô
 ˜v¨U¸iÐS\Ø!)¨b°AÀ*ôNð Nr   c           
      óÆ  — t         j                  j                  | «      sg ddœS |gt        |«      z   }dj	                  d„ |D «       «      }	d|z   dz   gt        |«      z  }
|r|dz   nd|dz   z   }dg }}	 t        j                  | d	¬
«      }t        j                  |_	        |j                  d|›d|	›�|
«      j                  «       d   }|j                  d|›d|	›d|›d�|
|gz   «      j                  «       }|j                  «        g }|D ]·  }dj	                  |D �cg c]?  }||   �8t        ||   «      j!                  «       rt        ||   «      j!                  «       ‘ŒA c}«      }|j#                  ||   �t        ||   «      ndt        ||   xs d«      j!                  «       d d |d d |r||   xs dd d	 nddœ«       Œ¹ ||dœS # t        $ r dg }}Y ŒÒw xY wc c}w )Nr   rÔ  rz  c              3   ó&   K  — | ]	  }d |z  –— Œ y­wrN  rd   rO  s     r	   ra   z_qs_like.<locals>.<genexpr>O  s   è ø€ Ò6¨#�K #Õ%Ñ6ùr  r  rP  r   rQ  r|   r}   rT  r¢  rU  r  r£  rH  rÖ  r×  rØ  )rÕ   rÖ   rÜ   r5  r   r]   r   r€   rÀ   rÁ   r‚   r1  rÝ   r„   r…   r�   r   r   )rV  rW  rX  Ú	title_colÚ	site_colsrY  r«   r§  ÚcolsÚwÚargsrÍ  rD  ræ   r‚  r"   r  rµ   r±  s                      r	   Ú_qs_likerm  K  sï  € Ü�7‰7�>‰>˜'Ô"Ø aÑ(Ð(Øˆ;œ˜i›Ñ(€DØ�‰Ñ6°Ô6Ó6€AØ�!‰G�c‰Mˆ?œS ›YÑ&€DÙ'/ˆh˜Ò"°R¸FÀWÑ<LÑM€EØ�Rˆ4€EðÜ�_‰_˜W¨bÔ1ˆÜ Ÿ™ˆŒØ—
’
ÂÉÐJÈDÓQ×ZÑZÓ\Ð]^Ñ_ˆØ�zŠzÊUÒTUÒW\Ð]Ø % ™.ó*ß*2©(«*ð 	à
�‰Œ
ð €CØò MˆØ�{‰{°yö F°!Ø ™dÐ.´3°q¸±t³9·?±?Ô3Dô    !¡›IŸO™OÕ-ò Fó Gˆà�
‰
¨A¨f©IÐ,Aœ#˜a ™iœ.ÀrÜ   9¡Ò!3°Ó4×:Ñ:Ó<¸T¸cÐBØ   "˜IÙ9A˜a ™kÒ/¨R°°"Ñ5ÀrñLõ 	MðMð  5Ñ)Ð)øô ò Ø˜ˆtŠðüòFs   Á5BG ÄAG
ÇGÇGc           
      ót  — |xs dj                  «       }t        |«      dk  rg ddœS 	 t        dt        t	        |xs d«      d«      «      }| dk(  rt        t        d	d
ddd||«      S | dk(  rt        t        ddddd||«      S | dk(  rt        t        ddddd||«      S t        ||«      S # t
        $ r d}Y Œjw xY w)ul   âŒ˜K å¿«é€Ÿæ�œç´¢ï¼ˆæŒ‰è·¯ç”±åˆ†å�‘ï¼‰ã€‚crawler å¤�ç”¨ list_quicksearchï¼ˆå®žä½“/bigram/FTS å…¨è¯­ä¹‰ï¼‰ã€‚r   rž   r   rÔ  r›   rÍ   rÎ   r/  ra  r  r  )r<  r   r"  r-  r0  rb  r+   )r  r<  r1  r�  r  )r_  r  rc  N)r   r]   r»  r¼  r…  r…   rm  r”  r~  re  rà  )râ  r«   r§  s      r	   Úquicksearch_routero  g  sæ   € à	
Šˆb�‰Ó€AÜ
ˆ1ƒv�‚zØ aÑ(Ð(ðÜ�A”sœ3˜uš{¨Ó+¨RÓ0Ó1ˆð �‚}Üœ
 M°<ÀØ8¸.È!ÈUóTð 	Tà�‚ÜœÐ)9¸4ÀØ5°~ÀqÈ%óQð 	Qà�	ÒÜÔ(¨*°d¸IØ=¸tÀQÈóOð 	Oä˜A˜uÓ%Ð%øô ò ØŠðús   ©#B) Â)B7Â6B7c                 ó  — dddddœ}	 | dk(  rÛt        j                  t        «      }t         j                  |_        |j                  dt        |«      f«      j                  «       }|j                  «        |�rtdj                  |d   xs d|d   xs dfD �cg c]  }|sŒ|‘Œ	 c}«      }|d   xs d|xs	 |d	   xs d|d
   xs ddd t        |d   xs	 |d   xs dd«      dœ}	 |S | dk(  ržt        j                  t        «      }t         j                  |_        |j                  dt        |«      f«      j                  «       }|j                  «        |�r”|d   xs d|d   xs d|d
   xs ddd t        |d   xs dd«      dœ}	 |S | dk(  rÂt        j                  t        «      }t         j                  |_        |j                  dt        |«      f«      j                  «       }|j                  «        |rò|d   xs ddj                  |d   xs d|d   xs dfD �cg c]  }|r|‘Œ c}«      dt        |d   xs	 |d   xs dd«      dœ}	 |S t        j                  t        «      }t         j                  |_        |j                  dt        |«      f«      j                  «       }|j                  «        |r0|d   xs d|d   xs d|d   xs ddd t        |d    xs dd«      dœ}|S c c}w c c}w # t        $ r Y |S w xY w)!u]   /api/item ä¸Ž âŒ˜K è·³è½¬éœ€è¦�çš„å…ƒæ•°æ�®ï¼štitle/site/date/excerptï¼ˆæŒ‰è·¯ç”±å�–åº“ï¼‰ã€‚r   )rw   r±  r²  rµ  r/  zmSELECT project_name, industry, province, city, publish_date, scale, topic FROM zc_projects WHERE project_id=?r>  r   r"  r  r<  r-  Nr|   r>  r?  é    r0  zYSELECT project_name, owner_company, publish_date, overview FROM cceup_projects WHERE id=?r  rD  r1  zNSELECT company, contact_name, phone, remarks, address FROM contacts WHERE id=?r  rH  r_  r  rc  rb  zaSELECT title, site_name, publish_date, SUBSTR(COALESCE(summary,''),1,300) FROM gov_raw WHERE id=?r   r›   rž   rm   )r   r€   r”  rÀ   rÁ   r‚   r�   r1  r„   r   r<  r~  r…  re  Ú	SEARCH_DBr…   )râ  Úiidré  r‚  r  rf   rA  s          r	   Úroute_item_metart  |  s8  € à ¨R¸BÑ?€Dð,Ø�DŠ=Ü—‘¤Ó,ˆBÜ$Ÿ[™[ˆBŒNØ—
‘
ð NÜPSÐTWÓPXÈ{ó\ß\dÑ\dÓ\fð à�H‰HŒJÚØ—h‘h¨Q¨z©]Ò-@¸bÀAÀfÁIÂOÐQSÐ+UÖ[ aÒYZ¢Ò[Ó\�Ø!" >Ñ!2Ò!8°bÀ#ÒB^È!ÈJÉ-ÒJ]Ð[]Ø!" >Ñ!2Ò!8°b¸#¸2Ð >Ü#-¨a°©jÒ.L¸A¸g¹JÒ.LÈ"ÈcÓ#RñT‘ðH €KðC �fŠ_Ü—‘¤Ó1ˆBÜ$Ÿ[™[ˆBŒNØ—
‘
ð <Ü>AÀ#»h¸[óJßJRÉ(Ë*ð à�H‰HŒJÚØ!" >Ñ!2Ò!8°bÀ!ÀOÑBTÒBZÐXZØ!" >Ñ!2Ò!8°b¸#¸2Ð >Ü#-¨a°
©mÒ.A¸rÀ3Ó#GñI‘ð4 €Kð/ �iÒÜ—‘Ô!1Ó2ˆBÜ$Ÿ[™[ˆBŒNØ—
‘
ð 6Ü8;¸C»°{óDßDLÁHÃJð à�H‰HŒJÙØ!" 9¡Ò!3°Ø &§¡¸!¸NÑ:KÒ:QÈrØ9:¸7¹Ò9IÀrð9Lö -R°1ÙOPò ./ò -Ró !Sà "¬z¸!¸I¹,Ò:\È!ÈIÉ,Ò:\ÐZ\Ð^aÓ/bñd‘ð  €Kô —‘¤Ó+ˆBÜ$Ÿ[™[ˆBŒNØ—
‘
ð Xä ›H˜;ó(ç(0©«
ð ð �H‰HŒJÙØ!" 1¡¢¨°Q°q±T²Z¸RÈ!ÈAÉ$Ê*ÐRTÐVYÐWYÐIZÜ#-¨a°©dªj°b¸#Ó#>ñ@�ð €KùòK  \ùò,-Røô ò ØØ€KðúsL   ‰BK9 ÂK/Â K/Â$AK9 Ã)B K9 ÆBK9 È"K4
È-#K9 ÉBK9 Ë/
K9 Ë9	LÌLc                 ód  — 	 t        j                  t        «      }t         j                  |_        |j                  dt        | «      f«      j                  «       }|s|j                  «        yt        |«      }|j                  dt        | «      f«      D �cg c]  }t        |«      ‘Œ }}|j                  «        dt        |j                  d«      xs d«      z   dz   }dD ]N  \  }}t        |j                  |«      xs d«      j                  «       }	|	sŒ5|d|z   d	z   t        |	«      z   d
z   z  }ŒP |dz  }dD ]‡  \  }}t        |j                  |«      xs d«      j                  «       }	|	sŒ5t        |	«      }	|	j                  «       sŒQt!        |	«      r|d|z   dz   |	z   dz   z  }Œn|d|z   dz   t        |	«      z   dz   z  }Œ‰ |rØ|dt        t#        |«      «      z   dz   z  }|D ]±  }
|dt        |
j                  d«      xs d«      z   dz   z  }dD ]N  \  }}t        |
j                  |«      xs d«      j                  «       }	|	sŒ5|d|z   dz   t        |	«      z   dz   z  }ŒP t%        |
j                  d«      «      }|r|dt        |«      z   dz   z  }|dz  }Œ³ |dz  }|S c c}w # t        $ r Y yw xY w)u"  ä¸­é¡¹ç½‘é¡¹ç›® â†’ æŠ½å±‰è¯¦æƒ…ç‰‡æ®µï¼ˆè‡ªåŒ…å�«ï¼š.dh/.ds å�¡ç‰‡é£Žæ ¼ï¼Œä¸Ž crawler/zc æŠ½å±‰ä¸€è‡´ï¼‰ã€‚

    âš ï¸� ä¸�åŠ¨æ—¢æœ‰ handle_cceup_project_detailï¼ˆ/ccpc/project/{id} æ•´é¡µä»�åœ¨ç”¨ï¼‰ï¼Œ
       æœ¬å‡½æ•°æ˜¯æŠ½å±‰ä¸“ç”¨ç‰‡æ®µï¼Œé�¿å…�æ”¹åŠ¨çº¿ä¸Šé¡µé�¢å¼•å…¥å›žå½’ã€‚
    ú'SELECT * FROM cceup_projects WHERE id=?r   zvSELECT company, contact_name, phone, landline, email, role, address FROM cceup_contacts WHERE project_id=? ORDER BY idr  r  ú</h1></div><div class="dg">)r  r  ©u   é¡¹ç›®ç±»åž‹r<  r8  )u   å»ºè®¾æ€§è´¨r%  )r:  r  )u   èµ„é‡‘æ€§è´¨Úinvest_nature)u   èµ„é‡‘æ�¥æº�Úfunding©u   é¡¹ç›®ç­‰çº§Úgrader  r!  )r?  Úproject_address)r   r  rA  rC  ©u   å¼€å·¥æ—¶é—´Ú
start_time)u   ç«£å·¥æ—¶é—´Úend_time©u   è®¾å¤‡æ�¥æº�Úequipment_sourcer,  r3  r4  r5  rO  )©u   é¡¹ç›®æ¦‚å†µrD  )u   é¡¹ç›®è¯¦æƒ…rY  ©u   å·¥è‰ºæµ�ç¨‹Úprocess_flow)u   é¡¹ç›®ä¸»è¦�é‡‡è´­è®¾å¤‡rU  )u   é‡‡è´­è¦�æ±‚Úprocurement_needs)u   é˜¶æ®µå»ºè®¾å†…å®¹Úphase_construction)u   ä¸»è¦�å·¥ä½œÚ	key_works)u   é¡¹ç›®è¿›åº¦ÚprogressrM  z</h3><div class="ct-html">rN  õ    <div class="ds"><h3>è�”ç³»äººï¼ˆõ   ï¼‰</h3>r]  r  r^  ))õ	   è�”ç³»äººr_  )õ   æ‰‹æœºr  )õ   åº§æœºrc  ©õ   é‚®ç®±rd  ©õ   åœ°å�€rb  ú<span class="cl">ú</span><span>r²  rG  u$   <span class="cl">è§’è‰²</span><span>r´  )r   r€   r~  rÀ   rÁ   r‚   r…  r1  r„   r2  r…   r“   r   r�   r   rÃ  rà  r]   r$   )ri  r‚  r  r    rf   r�  rg  ri  ri   r#   rè   rI  s               r	   Úrender_ccpc_fragr•  ¯  sï  € ðÜ�_‰_œ_Ó-ˆÜ Ÿ™ˆŒØ�J‰JÐ@Ä3ÀsÃ8À+ÓN×WÑWÓYˆÙØ�H‰HŒJØÜ�‹GˆØ%'§Z¡ZðAÜCFÀsÃ8À+ó&Oö P ”D˜•Gð Pˆð Pð 	�‰Œ
ð 	0´#°a·e±e¸NÓ6KÒ6QÈrÓ2RÑRÐUrÑr€Að7ò 
`‰ˆˆSô �—‘�c“
Ò ˜bÓ!×'Ñ'Ó)ˆÚØÐ)¨CÑ/Ð2DÑDÄsÈ1ÃvÑMÐP_Ñ_Ñ_‰Að
`ð ˆÑ€Að3ò b‰ˆˆSô �—‘�c“
Ò ˜bÓ!×'Ñ'Ó)ˆÙØÜ˜QÓˆØ�w‰wŒyØÜ˜Œ?ØÐ'¨#Ñ-Ð0LÑLÈqÑPÐSaÑaÑa‰AàÐ'¨#Ñ-Ð0GÑGÌ#ÈaË&ÑPÐSaÑaÑa‰Aðbñ Ø	Ð/´#´c¸(³mÓ2DÑDÀzÑQÑQˆØò 
	 ˆBØÐ3´c¸"¿&¹&ÀÓ:KÒ:QÈrÓ6RÑRÐUmÑmÑmˆAðIò Z‘��Sä˜Ÿ™˜s›Ò) rÓ*×0Ñ0Ó2�ÚØÐ,¨sÑ2°_ÑDÄsÈ1ÃvÑMÐPYÑYÑY‘Að	Zô
 )¨¯©°«Ó8ˆEÙØÐ;¼cÀ%»jÑHÈ9ÑTÑT�Ø�Ñ‰Að
	 ð 	
ˆX‰ˆØ€HùòaPøô ò Ùðús*   ‚A*J# Á-)J# ÂJÂ(J# ÊJ# Ê#	J/Ê.J/c                 óþ  — 	 t        | «      }	 t        j                  t        «      }t        j
                  |_        |j                  d|f«      j                  «       }|s|j                  «        yt        |«      }|j                  d|f«      D �cg c]  }t        |«      ‘Œ }}|j                  «        dt        |j                  d«      xs d«      z   dz   }t        |j                  d«      «      }d|j                  d	«      fd
|fd|j                  d«      fd|j                  d«      fd|j                  d«      fd|j                  d«      fd|j                  d«      fd|j                  d«      fd|j                  d«      ff	D ]?  \  }	}
t        |
xs d«      j                  «       }
|
sŒ&|d|	z   dz   t        |
«      z   dz   z  }ŒA |dz  }|�rti }t!        |D �ch c]`  }|j                  d«      xs ddk(  rF|j                  d«      xs dj                  «       r#|j                  d«      xs dj                  «       ’Œb c}«      }|rž	 t        j                  t"        «      }t        j
                  |_        |j                  d d!j%                  d"t'        |«      z  «      z  |«      D ],  }|j)                  |d   xs dj                  «       |d#   «       Œ. |j                  «        t+        «       }|d$t        t'        |«      «      z   d%z   z  }|D �]+  }|j                  d«      xs dj                  «       }|j                  d&«      xs dj                  «       }|j                  d«      xs dj                  «       xs |}d}|d'k(  r%|r#d(t,        j.                  j1                  |«      z   }n|dk(  r||v rd)t        ||   «      z   }|xs ||v rŒÀ|j3                  |xs |«       |d'k(  rd*n|dk(  rd+n|}t        |«      }|r d,t        |«      z   d-z   t        |«      z   d.z   }|d/|z   d0z   t        |«      z   d1z   z  }�Œ. |d2z  }|S # t        $ r Y yw xY wc c}w # t        $ r Y yw xY wc c}w # t        $ r Y �Œ“w xY w)3uƒ  è�”ç³»äºº â†’ æŠ½å±‰è¯¦æƒ…ç‰‡æ®µï¼šå…¨å­—æ®µå�¡ç‰‡ + å…³è�”é¡¹ç›®ï¼ˆcontact_projects å��æŸ¥ï¼‰ã€‚

    âš ï¸� ccpc æ�¥æº�çš„ contact_projects.project_key **æ�’ä¸ºç©ºä¸²**ï¼ˆå®žæµ‹ 11308/14947 è¡Œä¸ºç©ºï¼‰ï¼Œ
       å�ªèƒ½æŒ‰ project_name å��æŸ¥ cceup_projects.idï¼ˆå®žæµ‹ 14947/14947 å…¨éƒ¨å‘½ä¸­ï¼‰ï¼›
       zc æ�¥æº�çš„ project_key å°±æ˜¯ zc_projects.project_idï¼Œå�¯ç›´æŽ¥è·³ã€‚
    r   z!SELECT * FROM contacts WHERE id=?zxSELECT source, project_key, project_name FROM contact_projects WHERE contact_id=? ORDER BY source, project_name LIMIT 60r  r  rw  rG  rŒ  r_  u   è§’è‰²u   éƒ¨é—¨r`  u   è�ŒåŠ¡ra  r�  r  rŽ  rc  r�  rd  r’  rb  u   å¤‡æ³¨rc  r3  r4  r5  rO  Úsourcer0  r  zFSELECT id, project_name FROM cceup_projects WHERE project_name IN (%s)r	  r
  r+   u#   <div class="ds"><h3>å…³è�”é¡¹ç›®ï¼ˆr‹  Úproject_keyr/  ú/zc/project/ú/ccpc/project/u   ä¸­ç­–r,  ú	<a href="zL" target="_blank" rel="noopener" style="color:#1a73e8;text-decoration:none">rè  r]  u:   </div><div class="fd"><span class="cl">æ�¥æº�</span><span>z</span></div></div>r´  )r…  r…   r   r€   re  rÀ   rÁ   r‚   r1  r„   r2  r“   r   r$   r�   r   Úsortedr~  r   r]   Ú
setdefaultr¸   ÚurllibÚparseÚquoterß   )ÚcidÚcid_ir‚  r  Úrowrf   Úrelrg  rI  ri  r#   ÚidmapÚ_namesÚkdbÚrrÚseenÚsrcri   Únmr›  Ú_tagÚ_nm_htmls                         r	   Úrender_contact_fragr®  ð  s�  € ðÜ�C“ˆðÜ�_‰_Ô-Ó.ˆÜ Ÿ™ˆŒØ�J‰JÐ:¸U¸HÓE×NÑNÓPˆÙØ�H‰HŒJØÜ�1‹gˆØ "§
¡
ðHØJOÈó!Sö T˜1Œt�A�wð Tˆð Tð 	�‰Œ
ð 	0´#°c·g±g¸iÓ6HÒ6NÈBÓ2OÑOÐRoÑo€AÜ  §¡¨£Ó1€EØ §¡¨Ó!8Ð9¸HÀeÐ;LØ˜cŸg™g lÓ3Ð4°xÀÇÁÈÓATÐ6UØ˜cŸg™g gÓ.Ð/°(¸C¿G¹GÀJÓ<OÐ1PØ˜cŸg™g gÓ.Ð/°(¸C¿G¹GÀIÓ<NÐ1OØ˜cŸg™g iÓ0Ð1ð	3ò `‰ˆˆQô
 �’�R‹L×ÑÓ ˆÚØÐ)¨CÑ/Ð2DÑDÄsÈ1ÃvÑMÐP_Ñ_Ñ_‰Að`ð ˆÑ€AÚ
ØˆÜÈö DÀ1ØŸU™U 8›_Ò2°°vÒ=ØŸe™e NÓ3Ò9°r×@Ñ@ÔBð Ÿ%™% Ó/Ò5°2×<Ñ<Õ>ò Dó Eˆñ ð	Ü—o‘o¤oÓ6�Ü")§+¡+�”ØŸ+™+Ø`ØŸ(™( 3¬¨V«Ñ#4Ó5ñ6Ø7=ó?ò S�Bð ×$Ñ$ b¨Ñ&8Ò&>¸B×%EÑ%EÓ%GÈÈDÉÕRðSð —	‘	”ô ‹uˆØ	Ð2´S¼¸S»³]ÑBÀZÑOÑOˆØó 	nˆAØ—5‘5˜“?Ò( b×/Ñ/Ó1ˆCØ—5‘5˜Ó'Ò-¨2×4Ñ4Ó6ˆCØ—%‘%˜Ó'Ò-¨2×4Ñ4Ó6Ò=¸#ˆBØˆCØ�dŠ{™sØ$¤v§|¡|×'9Ñ'9¸#Ó'>Ñ>‘Ø˜’ 2¨¡;Ø&¬¨U°2©Y«Ñ7�Ø’	�r˜dÑ"ØØ�H‰H�S’Y˜BÔØ" dš{‘8ÀÀvÂ±ÐSVˆDÜ˜2“wˆHÙØ'¬#¨c«(Ñ2ð 6Jñ JÜLOÐPRËGñTØV\ñ]�àÐ4°xÑ?ð CIñ IÜKNÈtË9ñUØWlñmñ nŠAð#	nð& 	
ˆX‰ˆØ€HøôE ò ÙðüòTøô ò Ùðüò Døô ò ÚðúsU   ‚Q ŽA!Q Á0 Q ÂQÂ"Q ÇA%Q*ÉBQ/ Ñ	QÑQÑQ Ñ	Q'Ñ&Q'Ñ/	Q<Ñ;Q<z/mnt/data/toolsz/mnt/data/tools/tools.jsonz/mnt/data/tools/.zipsrä  u   ðŸ§°z#1a73e8)r+   rë  ÚiconÚtintÚocru   æ–‡å­—è¯†åˆ«u   ðŸ”�Údocu   æ–‡æ¡£å¤„ç�†u   ðŸ“„z#7b3fa0Údatau   æ•°æ�®å¤„ç�†u   ðŸ“Šz#1e7d45Únetu   ç½‘ç»œå·¥å…·u   ðŸŒ�z#b26a00Úmediau   å½±éŸ³å›¾åƒ�u   ðŸŽ¬z#d93025Údevu   å¼€å�‘è¾…åŠ©u   âš™ï¸�z#3c4043rk   rê  u   ðŸ“¦z#5f6368c                 óB   — t         D ]  }|d   | k(  sŒ|c S  t         d   S )Nr+   rÆ   )ÚTOOLS_CATEGORIES)r¡  rµ   s     r	   Ú
_tools_catr¹  j  s.   € Üò ˆØˆT‰7�c‹>ØŠHðô ˜BÑÐr   c                 ó–   — 	 t        | xs d«      } dD ]!  }| dk  r|dk(  rd| z  c S d| |fz  c S | dz  } Œ# d	| z  S # t        $ r Y yw xY w)
Nr   õ   â€”)ÚBÚKBÚMBÚGBé   r¼  z%d Bz%.1f %sg      �@z%.1f TB)Úfloatr…   )r�  r·  s     r	   Útools_humanrÂ  q  ss   € ðÜ�!’&�q‹Mˆð %ò ˆØˆtŠ8Ø#$¨¢8�F˜Q‘JÒE°)¸qÀ!¸fÑ2DÒEØ	ˆV‰‰ðð �q‰=Ðøô ò Ùðús   ‚< ¼	AÁAc           	      ó¸  — 	 t        j                  | «      }t        j	                  | «      }|r%|d   t        |j                  «      k(  r
|d   |d   fS d\  }}t         j                  j                  | «      r‘t        j                  | «      D ]x  \  }}}|D �cg c]  }|j                  d«      rŒ|‘Œ c}|dd |D ]H  }		 |t         j                  j                  t         j                  j                  ||	«      «      z  }|dz  }ŒJ Œz n|j                  d}}t        |j                  «      ||ft        | <   ||fS # t        $ r Y yw xY wc c}w # t        $ r Y Œžw xY w)u]   (æ€»å­—èŠ‚, æ–‡ä»¶æ•°)ã€‚å¸¦ mtime ç¼“å­˜ â€”â€” 120MB ç›®å½•æ ‘ä¸�å¿…æ¯�æ¬¡è¯·æ±‚éƒ½ walkã€‚©r   r   r   r›   rž   ú.N)Ú	_os_toolsÚstatrÙ   Ú_TOOLS_SIZE_CACHEr   r…  Úst_mtimerÖ   ÚisdirÚwalkrª   Úgetsizer   Úst_size)
rÖ   rì   ÚhitrD  ÚcntÚrootÚdirsÚfilesrž  r˜  s
             r	   Útools_dir_sizerÓ  }  sQ  € ðÜ�^‰^˜DÓ!ˆô ×
Ñ
 Ó
%€CÙ
ˆs�1‰vœ˜RŸ[™[Ó)Ò)Ø�1‰v�s˜1‘vˆ~ÐØ�J€Eˆ3Ü‡~�~×Ñ˜DÔ!Ü!*§¡°Ó!5ò 	ÑˆD�$˜Ø"&Ö@˜Q¨a¯l©l¸3Õ.?’qÒ@ˆD‘ˆGØò �ðØœYŸ^™^×3Ñ3´I·N±N×4GÑ4GÈÈaÓ4PÓQÑQ�EØ˜1‘H‘Cññ	ð —Z‘Z ˆsˆÜ" 2§;¡;Ó/°¸Ð<Ô�dÑØ�#ˆ:Ðøô% ò Ùðüò Aøô
 ò Ùðús0   ‚D9 ÂEÂ.EÂ>AEÄ9	EÅEÅ	EÅEc                  óÄ   — 	 t        t        d¬«      5 } t        j                  | «      }d d d «       t	        t
        «      r|S i S # 1 sw Y   ŒxY w# t        $ r i cY S w xY w)Nrt  )Úencoding)r  ÚTOOLS_MANIFESTÚ_json_toolsÚloadÚ
isinstancer2  r…   )r˜  rž  s     r	   Útools_manifestrÚ  –  sa   € ðÜ”.¨7Ô3ð 	$°qÜ× Ñ  Ó#ˆA÷	$ä˜q¤$Ô'ˆqÐ/¨RÐ/÷	$ð 	$ûô ò ØŠ	ðús-   ‚A “A©A ÁA ÁAÁ
A ÁAÁA)z.tar.gzz.tar.bz2z.tar.xzz.tarú.zipz.7zz.rarz.gzz.exez.msiz.dmgz.pkgz.apkz.isoz.jarz	.appimageú.shz.commandz.batz.ps1ú.pyc                 ó–   — | j                  «       }t        D ]/  }|j                  |«      sŒ| d t        | «      t        |«      z
   c S  | S r\   )r   Ú_TOOLS_FILE_EXTrt   r]   )r«  ÚlowÚes      r	   Ú_tools_strip_extrâ  ¦  sI   € Ø
�(‰(‹*€CÜò )ˆØ�<‰<˜�?ØÐ'”s˜2“w¤ Q£Ñ'Ð(Ò(ð)ð €Ir   c                 óþ   — | j                  «       }t        D ]4  }|j                  |«      sŒ|j                  d«      j	                  «       c S  | j                  d«      }|dkD  r| |dz   d  j	                  «       d d S dS )NrÅ  r   r›   rw  r   )r   rß  rt   rÐ  ÚupperÚrfind)r«  rà  rá  Údots       r	   Ú
_tools_extrç  ®  sx   € Ø
�(‰(‹*€CÜò )ˆØ�<‰<˜�?Ø—8‘8˜C“=×&Ñ&Ó(Ò(ð)ð �(‰(�3‹-€CØ'*¨Q¢wˆ2ˆc�A‰gˆhˆ<×ÑÓ  Ð#Ð6°BÐ6r   c                 óÚ   — | j                  dd«      j                  «       j                  «       }|r|d   j                  «       s't        j
                  j                  | «      d   }d|z   S |S )u¬   Content-Disposition çš„ ASCII å…œåº•å��ã€‚ä¸­æ–‡å��å‰¥å®Œ ASCII å�ªå‰© '.sh' / '_v1.2.zip'
    è¿™ç±»æ®‹ç‰‡ï¼ˆè€�å®¢æˆ·ç«¯ä¼šç…§å­˜ï¼‰ï¼Œå¿…é¡»æ�¢æˆ� tool-download.<ext>ã€‚Úasciir‚  r   r›   ztool-download)ry  rz  r   ÚisalnumrÆ  rÖ   Úsplitext)ÚfnameÚaÚexts      r	   Ú_tools_ascii_namerï  ·  s^   € ð 	�‰�W˜hÓ'×.Ñ.Ó0×6Ñ6Ó8€AÙ�q˜‘t—|‘|”~Ü�n‰n×%Ñ% eÓ,¨QÑ/ˆØ Ñ$Ð$Ø€Hr   c                 ó”   — t        | «      } t        j                  d| «      }|r"|j                  d«      |j                  d«      fS | dfS )uL   'Umi-OCR_Paddle_v2.1.5' â†’ ('Umi-OCR_Paddle', '2.1.5')ï¼›å…ˆå‰¥æ‰©å±•å��ã€‚z"^(.+?)[ _\-]+[vV]?(\d+(?:\.\d+)*)$r›   rž   r   )râ  Ú	_re_toolsrÇ  r'   )r«  r(   s     r	   Ú_tools_guessrò  Á  sC   € ä	˜"Ó	€BÜ�‰Ð=¸rÓB€AÙ'(ˆA�G‰G�A‹J˜Ÿ™ ›
Ð#Ð6¨r°2¨hÐ6r   c           	      ó   — g }	 t         j                  j                  | «      rJt         j                  j                  | «      t	        t         j                  j                  | «      «      ddœgS t        t        j                  | «      «      D ]Ð  }|j                  d«      rŒt         j                  j                  | |«      }	 t         j                  j                  |«      r0t        |«      \  }}|j                  |dz   t	        |«      ddœ«       n;|j                  |t	        t         j                  j                  |«      «      ddœ«       t        |«      |k\  sŒÏ |S  	 |S # t        $ r Y Œáw xY w# t        $ r Y |S w xY w)NF)r�  r’   rž  rÅ  r>  T)rÆ  rÖ   ÚisfileÚbasenamerÂ  rÌ  rœ  Úlistdirrª   r   rÊ  rÓ  r   rÙ   r]   )rÖ   r§  r"   r«  ÚfpÚszrµ   s          r	   Ú_tools_top_filesrù  È  sK  € Ø
€CðÜ�>‰>× Ñ  Ô&Ü#Ÿ.™.×1Ñ1°$Ó7¼kÌ)Ï.É.×J`ÑJ`ÐaeÓJfÓ>gÐnsÑtÐuÐuÜœ×*Ñ*¨4Ó0Ó1ò 	ˆBØ�}‰}˜SÔ!ØÜ—‘×$Ñ$ T¨2Ó.ˆBðÜ—>‘>×'Ñ'¨Ô+Ü*¨2Ó.‘E�B˜Ø—J‘J R¨#¡X´KÀ³OÈ$ÑOÕPà—J‘J R¬k¼)¿.¹.×:PÑ:PÐQSÓ:TÓ.UÐ\aÑbÔcô �3‹x˜5Ó Øð €Jñ!	ð  €Jøô ò Ùðûô ò ØØ€JðúsJ   „A(E0 Á-AE0 ÃB
E!ÅE0 ÅE0 ÅE0 Å!	E-Å*E0 Å,E-Å-E0 Å0	E=Å<E=c                 ó:  — | xs dj                  «       } | r| j                  d«      sd| v sd| v sd| v ry| t        j                  j	                  | «      k7  ryt        j                  j                  t        j                  j                  t        | «      «      r| S dS )uD   æ ¡éªŒå·¥å…· id å�ªèƒ½æ˜¯ä¸€çº§ç›®å½•/æ–‡ä»¶å��ï¼ˆé˜²ç›®å½•ç©¿è¶Šï¼‰r   rÅ  r>  ú\z..)r   rª   rÆ  rÖ   rõ  rÜ   r   Ú	TOOLS_DIR)Útids    r	   Útools_safe_idrþ  à  s€   € àŠ9�"×
Ñ
Ó
€CÙ�C—N‘N 3Ô'¨C°3©J¸DÀC¹KÈTÐUXÉ[ØØ
Œi�n‰n×%Ñ% cÓ*Ò*ØÜ—.‘.×'Ñ'¬	¯©×(;Ñ(;¼IÀsÓ(KÔLˆ3ÐTÐRTÐTr   c                  óÞ  — t        «       } | j                  d«      xs i }g }	 t        t        j                  t
        «      «      }|D �]é  }|j                  d«      s|dk(  rŒt        j                  j                  t
        |«      }t        j                  j                  |«      s t        j                  j                  |«      sŒ~|j                  |«      xs i }t        |«      \  }}t        |«      \  }	}
t        j                  j                  |«      }|j                  d«      xs d}|sM|rK	 t        t        j                  |«      «      D ])  }|j                  «       j                  t         «      sŒ'|} n t        j                  j                  t"        |dz   «      }|j                  d«      xs d}t%        |«      }t'        |«      }|rdn
t)        |«      }|j                  d	«      xs d}|sƒ|rm|d
d D �cg c]3  }t        j                  j+                  |d   j-                  d«      «      ‘Œ5 }}|r'd|
dj                  |«      |
t/        |«      kD  rdndfz  nd}n|xs d›dt1        |	«      ›�}t3        |j                  d«      xs g «      }|r||vr|j5                  d|«       |j7                  i d|“d|j                  d«      xs |“d|j                  d«      xs |“d	|“d|“d|d   “d|j                  d«      xs |rdn|r|dz   nd“d|“d|j                  d«      xs |d   “d |d    “d!|j                  d!«      xs d“d|“d"|“d#|	“d$t1        |	«      “d%|
“d&t9        j:                  d't9        j<                  t        j                  j?                  |«      «      «      “t        j                  j                  |«      t        j                  j                  |«      r(t1        t        j                  jA                  |«      «      nd|tC        |j                  d(«      «      d)œ¥«       �Œì |jE                  d*„ ¬+«       |S # t        $ r |cY S w xY w# t        $ r Y �Œíw xY wc c}w ),u'   æ‰«æ�� TOOLS_DIR â†’ å�¡ç‰‡æ•°æ�®åˆ—è¡¨ÚtoolsrÅ  z
tools.jsonÚentryr   rÛ  r:  rk   ÚsummaryNrm   r�  r>  u   åŒ…å�« %d é¡¹ï¼š%s%su   ã€�u    ç­‰u	   ç©ºç›®å½•u   æœªçŸ¥ç±»åž‹u    æ–‡ä»¶ Â· r³  r   r+   ÚnameÚversionÚcat_cnrë  Úplatformu	   æ–‡ä»¶å¤¹u
    å�•æ–‡ä»¶u	   å�•æ–‡ä»¶r¯  r°  ÚhomepageÚis_dirÚsizeÚsize_hrÒ  Úupdatedú%Y-%m-%dÚpinned)Ú	zip_readyÚzip_hÚ	top_filesr  c                 ó4   — | d    | d   j                  «       fS )Nr  r  )r   rÈ   s    r	   rg   zscan_tools.<locals>.<lambda>.  s   €   (¡˜O¨Q¨v©Y¯_©_Ó->Ð?€ r   rh   )#rÚ  r   rœ  rÆ  rö  rü  rÙ   rª   rÖ   r   rÊ  rô  rò  rÓ  r   rt   rß  ÚTOOLS_ZIP_DIRr¹  rù  rç  rõ  r{  r]   rÂ  r5  Úinsertr   Ú_time_toolsÚstrftimeÚ	localtimer×   rÌ  r   rà   )ÚmanÚcuratedr"   Únamesr«  r    rµ   ÚgnameÚgverr	  rÏ  rÊ  r  r˜  Úzpr¡  r´  Útopsrî  r  rf   r³  s                         r	   Ú
scan_toolsr  ê  s[  € ä
Ó
€CØ�g‰g�gÓÒ$ "€GØ
€CðÜ”y×(Ñ(¬Ó3Ó4ˆð ó :ˆØ�=‰=˜Ô  |Ò!3ØÜ�N‰N×Ñ¤	¨2Ó.ˆÜ—‘×$Ñ$ QÔ'¬9¯>©>×+@Ñ+@ÀÔ+CØØ�K‰K˜‹OÒ!˜rˆÜ" 2Ó&‰ˆˆtÜ" 1Ó%‰	ˆˆcÜ—‘×$Ñ$ QÓ'ˆØ—‘�g“Ò$ "ˆÙ™ðÜ¤	× 1Ñ 1°!Ó 4Ó5ò �AØ—w‘w“y×)Ñ)¬/Õ:Ø !˜Ùðô �^‰^× Ñ ¤°°V±Ó<ˆØ�e‰e�JÓÒ* 7ˆÜ˜‹oˆÜ Ó"ˆÙ‰bœz¨"›~ˆà—%‘%˜	Ó"Ò( bˆÙÙØNRÐSUÐTUÈhÖWÈœŸ™×0Ñ0°°3±·±¸sÓ1CÕDÐW�ÐWá#ð 2°S¸%¿*¹*ÀUÓ:KÐWZÔ]`ÐafÓ]gÒWgÉVÐmoÐ4pÒpØ)4ñ ð 03Ò/D°nÑ/DÄkÐRVÔFWÐX�Ü�A—E‘E˜&“MÒ' RÓ(ˆÙ�3˜d‘?Ø�K‰K˜˜3ÔØ�
‰
ð 
Ø�"ð
à�A—E‘E˜&“MÒ* Uð
ð �q—u‘u˜YÓ'Ò/¨4ð
ð �wð	
ð
 ˜ð
ð �c˜$‘ið
ð ˜Ÿ™˜jÓ)Òw¹U©kÑadÈ#ÐP\ÒJ\Ðjuð
ð �Dð
ð �A—E‘E˜&“MÒ0 S¨¡[ð
ð �C˜‘Kð
ð ˜Ÿ™˜jÓ)Ò/¨Rð
ð �Uð
ð �eð
ð �Dð
ð ”k $Ó'ð
ð  �Sð!
ð" ”{×+Ñ+¨J¼×8MÑ8MÌiÏnÉn×NeÑNeÐfgÓNhÓ8iÓjð#
ô$ #Ÿ™×.Ñ.¨rÓ2Ü@IÇÁ×@UÑ@UÐVXÔ@Y”[¤§¡×!7Ñ!7¸Ó!;Ô<Ð_aØÜ˜1Ÿ5™5 ›?Ó+ò+
ö 	ðI:ðv ‡H�HÑ?€HÔ@Ø€Jøô} ò ØŠ
ðûô& ò Úðüò Xs0   £"Q	 Ä/AQÅ4QÇ:8Q*Ñ	QÑQÑ	Q'Ñ&Q'c                 ó  — t        | «      }|syt        j                  j                  t        |«      }t        j                  j                  |«      rd|dfS 	 t        j                  t        d¬«       t        j                  j                  t        |dz   «      }t        j                  j                  |«      rDt        j                  j                  |«      t        j                  j                  |«      k\  rd|dfS |dz   }|dz   fD ]  }	 t        j                  |«       Œ t        j                  |d|¬«       t        j                  |dz   |«       d|dfS # t        $ r Y Œ\w xY w# t        $ r}d	dd
|z  fcY d}~S d}~ww xY w)ul   â†’ (ok, å�¯ä¸‹è½½æ–‡ä»¶è·¯å¾„, é”™è¯¯)ã€‚ç›®å½•åž‹åŽ‹æˆ� .zips/<id>.zipï¼ˆmtime æ—§åˆ™é‡�åŽ‹å¹¶ç¼“å­˜ï¼‰ã€‚)Fr   u   å·¥å…·ä¸�å­˜åœ¨Tr   )Úexist_okrÛ  z.partÚzip)Úroot_dirFu   æ‰“åŒ…å¤±è´¥: %sN)rþ  rÆ  rÖ   r   rü  rô  Úmakedirsr  r×   ÚremoverÙ   Ú_shutil_toolsÚmake_archiverr   r…   )rý  Úsaferª  r  ÚtmpbaseÚstalerá  s          r	   Útools_build_zipr*  2  sY  € ä˜Ó€DÙØ+Ü
�.‰.×
Ñ
œi¨Ó
.€CÜ‡~�~×Ñ˜SÔ!Ø�S˜"ˆ}Ðð1Ü×Ñœ=°4Õ8Ü�^‰^× Ñ ¤°°v±Ó>ˆÜ�>‰>× Ñ  Ô$¬¯©×)@Ñ)@ÀÓ)DÌ	ÏÉ×H_ÑH_Ð`cÓHdÒ)dØ˜˜R�<ÐØ�w‘,ˆØ Ñ&Ð(ò 	ˆEðÜ× Ñ  Õ'ð	ô
 	×"Ñ" 7¨E¸CÕ@Ü×Ñ˜' FÑ*¨BÔ/Ø�R˜ˆ|Ðøô	 ò Ùðûô
 ò 1Ø�bÐ,¨qÑ0Ð0Õ0ûð1úsI   ÁB$E( Ã=E( ÄEÄ!7E( Å	E%Å"E( Å$E%Å%E( Å(	FÅ1E>Å8FÅ>FaÇ  <style>
*{margin:0;padding:0;box-sizing:border-box}
body{background:#f1f3f5;color:#202124;font-family:-apple-system,BlinkMacSystemFont,"Microsoft YaHei","PingFang SC",sans-serif;-webkit-font-smoothing:antialiased}
a{text-decoration:none}
.tw{max-width:1160px;margin:0 auto;padding:16px 20px 64px}
.tnav{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:20px}
.tlogo{font-weight:700;color:#1a73e8;font-size:17px;letter-spacing:-.4px}
.tlinks{display:flex;gap:4px;flex-wrap:wrap}
.tlinks a{font-size:13px;color:#5f6368;padding:5px 11px;border-radius:16px}
.tlinks a:hover{background:#fff;color:#1a73e8}
.tlinks a.act{background:#e8f0fe;color:#1a73e8;font-weight:600}
.thero{background:linear-gradient(135deg,#1a73e8 0%,#3f8bf0 55%,#5aa0f5 100%);border-radius:16px;padding:26px 28px;color:#fff;box-shadow:0 6px 22px rgba(26,115,232,.22);position:relative;overflow:hidden}
.thero:after{content:"";position:absolute;right:-60px;top:-70px;width:230px;height:230px;border-radius:50%;background:rgba(255,255,255,.10)}
.thero:before{content:"";position:absolute;right:56px;bottom:-96px;width:170px;height:170px;border-radius:50%;background:rgba(255,255,255,.08)}
.thero-t{font-size:25px;font-weight:700;letter-spacing:-.5px;position:relative}
.thero-s{font-size:13.5px;opacity:.92;margin-top:7px;position:relative}
.thero-st{display:flex;gap:22px;margin-top:18px;flex-wrap:wrap;position:relative}
.thero-st div{font-size:12.5px;opacity:.95}
.thero-st b{display:block;font-size:19px;font-weight:700;margin-bottom:2px}
.tbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:20px 0 14px}
.tq{flex:1;min-width:220px;position:relative}
.tq input{width:100%;padding:11px 14px 11px 38px;border:1px solid #dfe3e8;border-radius:11px;font-size:14px;outline:none;background:#fff;font-family:inherit}
.tq input:focus{border-color:#1a73e8;box-shadow:0 0 0 3px rgba(26,115,232,.12)}
.tq span{position:absolute;left:13px;top:50%;transform:translateY(-50%);font-size:14px;opacity:.45}
.tchips{display:flex;gap:6px;flex-wrap:wrap}
.tchip{padding:7px 13px;border:1px solid #dfe3e8;border-radius:999px;background:#fff;font-size:12.5px;color:#3c4043;cursor:pointer;white-space:nowrap;font-family:inherit}
.tchip:hover{border-color:#1a73e8;color:#1a73e8}
.tchip.on{background:#1a73e8;border-color:#1a73e8;color:#fff;font-weight:600}
.tcount{font-size:12.5px;color:#7a8089;margin-left:auto;white-space:nowrap}
.tgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(318px,1fr));gap:14px}
.tcard{background:#fff;border:1px solid #e9ecef;border-radius:14px;padding:18px;display:flex;flex-direction:column;gap:11px;transition:box-shadow .18s,transform .18s,border-color .18s}
.tcard:hover{box-shadow:0 10px 26px rgba(20,30,50,.10);transform:translateY(-2px);border-color:#dbe4f0}
.thead{display:flex;gap:12px;align-items:flex-start}
.ticon{width:50px;height:50px;border-radius:13px;display:flex;align-items:center;justify-content:center;font-size:24px;flex:0 0 auto;background:color-mix(in srgb,var(--tint) 12%,#fff);border:1px solid color-mix(in srgb,var(--tint) 24%,#fff)}
.ttitle{min-width:0;flex:1}
.tname{font-size:15.5px;font-weight:650;line-height:1.3;word-break:break-word}
.tver{display:inline-block;font-size:11px;font-weight:600;color:#1a73e8;background:#e8f0fe;border-radius:6px;padding:2px 7px;margin-left:6px;vertical-align:1px}
.tsub{font-size:12px;color:#7a8089;margin-top:4px}
.tsum{font-size:13px;color:#3c4043;line-height:1.62;flex:1}
.tmeta{display:flex;gap:12px;flex-wrap:wrap;font-size:11.5px;color:#7a8089;padding-top:2px}
.ttags{display:flex;gap:5px;flex-wrap:wrap}
.ttag{font-size:11px;color:#5f6368;background:#f1f3f5;border-radius:6px;padding:2px 8px}
.tacts{display:flex;gap:8px;align-items:center;margin-top:2px}
.tbtn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:9px 16px;border-radius:10px;font-size:13px;font-weight:600;cursor:pointer;border:1px solid transparent;font-family:inherit;white-space:nowrap}
.tbtn.p{background:#1a73e8;color:#fff}
.tbtn.p:hover{background:#1557b0}
.tbtn.g{background:#fff;color:#3c4043;border-color:#dfe3e8}
.tbtn.g:hover{border-color:#1a73e8;color:#1a73e8}
.tdet{flex:1;min-width:0}
.tdet summary{list-style:none;cursor:pointer;font-size:12.5px;color:#5f6368;padding:9px 12px;border:1px solid #e9ecef;border-radius:10px;text-align:center}
.tdet summary::-webkit-details-marker{display:none}
.tdet summary:hover{border-color:#1a73e8;color:#1a73e8}
.tdet[open] summary{border-color:#1a73e8;color:#1a73e8;border-bottom-left-radius:0;border-bottom-right-radius:0}
.tfl{border:1px solid #e9ecef;border-top:none;border-radius:0 0 10px 10px;max-height:210px;overflow-y:auto;font-size:12px}
.tfl div{display:flex;gap:8px;padding:6px 12px;border-bottom:1px solid #f4f6f8}
.tfl div:last-child{border-bottom:none}
.tfl .fn{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c4043}
.tfl .fs{color:#9aa0a6;flex:0 0 auto}
.tfl .fd{color:#1a73e8}
.tfoot{margin-top:26px;font-size:11.5px;color:#9aa0a6;text-align:center;line-height:1.9}
.tempty{background:#fff;border:1px dashed #dfe3e8;border-radius:14px;padding:46px 20px;text-align:center;color:#7a8089;font-size:14px;line-height:2}
.tempty code{background:#f1f3f5;border-radius:5px;padding:2px 7px;font-size:12.5px;color:#3c4043}
@media(max-width:760px){
  .tw{padding:12px 12px 48px}
  .thero{padding:20px 18px;border-radius:14px}
  .thero-t{font-size:21px}
  .tgrid{grid-template-columns:1fr;gap:12px}
  .tcount{margin-left:0;width:100%}
  .tq{min-width:100%}
  .tbtn{padding:9px 14px}
}
</style>c           
      óÚ	  ‡
— t        «       }t        d„ |D «       «      }g }t        D ]1  Š
‰
d   dk(  rŒt        ˆ
fd„|D «       «      sŒ!|j	                  ‰
«       Œ3 ddddt
        d	g}|j	                  d
«       dD ]#  \  }}}|j	                  d|z   dz   |z   dz   «       Œ% |j	                  dt        | «      z   dz   «       |j	                  dt        t        |«      «      z   dz   t        |«      z   dz   t        t        d„ |D «       «      «      z   dz   «       |s|j	                  dt        z   dz   «       |�rV|j	                  d«       |j	                  d«       |D ].  Š
|j	                  d‰
d   z   dz   ‰
d   z   dz   ‰
d   z   dz   «       Œ0 |j	                  dt        t        |«      «      z   d z   «       |j	                  d!«       |D �]Ÿ  }dj                  |d"   |d#   |d   |d$   |d%   gt        |d&   «      z   «      }	|j	                  d'|d(   z   d)z   t        |	j                  «       «      z   dz   «       |j	                  d*|d+   z   dz   t        |d   «      z   d,z   t        |d"   «      z   |d-   rd.t        |d-   «      z   d/z   nd0z   d1z   t        |d$   «      z   d2z   t        |d%   «      z   |d3   rd4t        |d3   «      z   nd0z   d5z   «       |d#   r#|j	                  d6t        |d#   «      z   dz   «       |j	                  d7t        |d8   «      z   d9z   t        |d:   «      z   d;z   t        |d<   «      z   d/z   |d=   rd>t        |d=   «      z   d/z   nd0z   dz   «       |d&   r0|j	                  d?d0j                  d@„ |d&   D «       «      z   dz   «       |j	                  dAt        j                   j#                  |d   «      z   dBz   d0z   dz   «       |dC   r#|j	                  dDt        |dC   «      z   dEz   «       |j	                  d«       |dF   rK|j	                  dGt        t        |dF   «      «      z   dHz   d0j                  dI„ |dF   D «       «      z   dJz   «       |j	                  dK«       �Œ¢ |j	                  d«       |j	                  dL«       |j	                  dMt        z   dNz   «       |j	                  d«       |r|j	                  dO«       |j	                  dP«       d0j                  |«      S )QNc              3   ó&   K  — | ]	  }|d    –— Œ y­w)r	  Nrd   r  s     r	   ra   z$render_tools_page.<locals>.<genexpr>˜  s   è ø€ Ò. 1�Q�v•YÑ.ùr  r+   rô   c              3   ó4   •K  — | ]  }|d    ‰d   k(  –— Œ y­w)r:  r+   Nrd   )r^   ro   rµ   s     €r	   ra   z$render_tools_page.<locals>.<genexpr>�  s   øè ø€ Ò7¨Aˆq�‰}  $¡Õ'Ñ7ùs   ƒz><!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">zC<meta name="viewport" content="width=device-width,initial-scale=1">u-   <title>å·¥å…·å¸‚åœº Â· BJIIRé¡¹ç›®åº“</title>z<link rel="icon" href="data:,">z</head><body><div class="tw">zI<div class="tnav"><a class="tlogo" href="/">BJIIR</a><div class="tlinks">)©r6  r'  r(  ©r/  r)  r*  )r0  r+  r,  ©r1  r-  r.  ©Ú	originalsz/originals/u   åŽŸå§‹æ•°æ�®r›  r³  rè  r´  u¼   <div class="thero"><div class="thero-t">ðŸ§° å·¥å…·å¸‚åœº</div><div class="thero-s">å†…éƒ¨å®žç”¨å·¥å…·ï¼Œç‚¹å¼€å�³ä¸‹ Â· ç›®å½•ä¸Žå�šæžœäº‘ Tools å�Œæ­¥</div><div class="thero-st"><div><b>u   </b>ä¸ªå·¥å…·</div><div><b>u   </b>å�ˆè®¡ä½“ç§¯</div><div><b>c              3   ó&   K  — | ]	  }|d    –— Œ y­w)rÒ  Nrd   r  s     r	   ra   z$render_tools_page.<locals>.<genexpr>¶  s   è ø€ Ò!<° ! G¥*Ñ!<ùr  u   </b>ä¸ªæ–‡ä»¶</div></div></div>uo   <div class="tempty" style="margin-top:20px">ðŸ§° å·¥å…·ç›®å½•è¿˜æ˜¯ç©ºçš„<br>æŠŠå·¥å…·æ”¾è¿›æœ�åŠ¡å™¨çš„ <code>uÈ   </code>ï¼Œæˆ–åœ¨æœ¬æœºè·‘ <code>sync_tools_to_server.sh</code> ä»Žå�šæžœäº‘ Tools ç›®å½•å�Œæ­¥<br>ï¼ˆå�¯é€‰ï¼šåŠ ä¸€ä»½ <code>tools.json</code> å†™ç®€ä»‹/åˆ†ç±»/ç‰ˆæœ¬ï¼Œé¡µé�¢ä¼šè‡ªåŠ¨è¯»å�–ï¼‰</div>u®   <div class="tbar"><div class="tq"><span>ðŸ”�</span><input id="tq" placeholder="æ�œç´¢å·¥å…·å�� / ç®€ä»‹ / æ ‡ç­¾â€¦" autocomplete="off"></div><div class="tchips" id="tchips">uJ   <button class="tchip on" data-cat="all" type="button">ðŸ§° å…¨éƒ¨</button>z <button class="tchip" data-cat="z" type="button">r¯  r´   rë  ú	</button>u*   </div><div class="tcount" id="tcount">å…± u    ä¸ªå·¥å…·</div></div>z<div class="tgrid" id="tgrid">r  r  r  r  r³  z!<article class="tcard" data-cat="r:  z" data-hay="z4<div class="thead"><div class="ticon" style="--tint:r°  z-</div><div class="ttitle"><div class="tname">r  z<span class="tver">vr²  r   z</div><div class="tsub">rH  r  u    Â· å…¥å�£ ú</div></div></div>z<div class="tsum">u   <div class="tmeta"><span>ðŸ“¦ r
  u   </span><span>ðŸ—‚ rÒ  u    ä¸ªæ–‡ä»¶</span><span>ðŸ•’ r  r  u   <span>ðŸ—œ z<div class="ttags">c              3   ó>   K  — | ]  }d t        |«      z   dz   –— Œ y­w)z<span class="ttag">r²  N©r“   r  s     r	   ra   z$render_tools_page.<locals>.<genexpr>ß  s    è ø€ Ò"aÐRSÐ#8¼3¸q»6Ñ#AÀIÕ#MÑ"aùs   ‚z;<div class="tacts"><a class="tbtn p" href="/tools/download/u   ">â¬‡ ä¸‹è½½r  z<a class="tbtn g" href="u+   " target="_blank" rel="noopener">å®˜ç½‘</a>r  u2   <details class="tdet"><summary>åŒ…å�«æ–‡ä»¶ï¼ˆå‰� u"    é¡¹ï¼‰</summary><div class="tfl">c              3   ó‚   K  — | ]7  }d |d   rdndz   dz   t        |d   «      z   dz   t        |d   «      z   dz   –— Œ9 y	­w)
z<div><span class="fnrž  z fdr   r³  r�  z</span><span class="fs">r’   r5  Nr7  )r^   r˜  s     r	   ra   z$render_tools_page.<locals>.<genexpr>ê  sa   è ø€ ò #<à'(ð $:ÀaÈÂf¹UÐRTÑ#UÐX\Ñ#\Ô_bÐcdÐehÑciÓ_jÑ#jØ%?ñ$@ÜBEÀaÈÁfÃ+ñ$NØP_õ$`ñ #<ùs   ‚=?z</div></details>z
</article>um   <div class="tempty" id="tempty" style="display:none">ðŸ”� æ²¡æœ‰åŒ¹é…�çš„å·¥å…·ï¼Œæ�¢ä¸ªå…³é”®è¯�è¯•è¯•</div>u<   <div class="tfoot">èµ„æº�ç›®å½• <code style="color:#7a8089">uX   </code> Â· å�šæžœäº‘ Tools å�Œæ­¥ Â· æ‰“åŒ…ä¸‹è½½é¦–æ¬¡çº¦ 5~15sï¼Œä¹‹å�Žèµ°ç¼“å­˜</div>ud  <script>
(function(){
  var q = document.getElementById('tq'), grid = document.getElementById('tgrid'),
      chips = document.getElementById('tchips'), cnt = document.getElementById('tcount'),
      empty = document.getElementById('tempty');
  var cat = 'all', cards = [].slice.call(grid.querySelectorAll('.tcard'));
  function apply(){
    var kw = (q.value || '').trim().toLowerCase(), shown = 0;
    cards.forEach(function(c){
      var ok = (cat === 'all' || c.dataset.cat === cat) && (!kw || c.dataset.hay.indexOf(kw) >= 0);
      c.style.display = ok ? '' : 'none';
      if (ok) shown++;
    });
    cnt.textContent = kw || cat !== 'all' ? ('åŒ¹é…� ' + shown + ' / ' + cards.length + ' ä¸ªå·¥å…·') : ('å…± ' + cards.length + ' ä¸ªå·¥å…·');
    empty.style.display = shown ? 'none' : '';
  }
  q.addEventListener('input', apply);
  chips.addEventListener('click', function(e){
    var b = e.target.closest && e.target.closest('.tchip'); if (!b) return;
    cat = b.dataset.cat;
    [].forEach.call(chips.querySelectorAll('.tchip'), function(x){ x.classList.toggle('on', x === b) });
    apply();
  });
})();
</script>rû  )r  Úsumr¸  ru   r   Ú	TOOLS_CSSr¹  r�   r]   rÂ  rü  r   r5  r“   r   rž  rŸ  r   )r£  r   Ú
total_sizeÚcats_presentrg  Ú_hidÚhrefr,   ro   Úhayrµ   s             @r	   Úrender_tools_pager@  –  s  ø€ Ü‹L€EÜÑ.¨Ô.Ó.€JØ€LÜò #ˆØˆT‰7�eÒØÜÓ7°Ô7Õ7Ø×Ñ Õ"ð	#ð 
JØ	NØ	8Ø	*Ü	Ð3ð		5€Að ‡H�HÐXÔYðLò =Ñˆˆd�Eð 	
�‰�˜tÑ# dÑ*¨UÑ2°VÑ;Õ<ð=ð ‡H�HˆXœ xÓ0Ñ0°8Ñ;Ô<ð ‡H�Hð ô œc %›j›/ñ*ð-ñô & jÓ1ñ	2ð5ñ	ô
 œcÑ!<°eÔ!<Ó<Ó=ñ>ð
Añô ñ Ø	�‰ð 6Ü8AñBðEzñzô 	{ò
 à	�‰ð 4ô 	5ð 	
�‰Ð]Ô^Øò 	@ˆAØ�H‰HÐ7¸!¸D¹'ÑAÐDVÑVØ˜‘yñ!Ø#&ñ'Ø)*¨4©ñ1Ø3>ñ?õ @ð	@ð 	
�‰Ð=ÄÄCÈÃJÃÑOÐRjÑjÔkð 	
�‰Ð1Ô2Øó "	#ˆAØ—(‘(˜A˜f™I q¨¡|°Q°t±W¸aÀ¹kÈ1ÈZÉ=ÐYÔ\`ÐabÐciÑajÓ\kÑkÓlˆCØ�H‰HÐ8¸1¸Z¹=ÑHÈ>ÑYÜ˜3Ÿ9™9›;Ó'ñ(Ø*.ñ/ô 0à�H‰HÐKÈaÐPVÉiÑWÐZ^Ñ^Ü˜1˜V™9“~ñ&ð)+ñ+ä-0°°6±«^ñ<ð STÐT]ÒR^Ð.´°Q°y±\Ó1BÑBÀYÒNÐdfñhð 2ñ	2ô 58¸¸(¹Ó4Dñ	Eð HNñ	Nô QTÐTUÐV`ÑTaÓPbñ	cð
 >?¸wºZ˜¬¨Q¨w©Z«Ò8ÈRñQð
 Thñhô ið �Š|Ø—‘Ð-´°A°i±LÓ0AÑAÀHÑLÔMØ�H‰HÐ5¼¸A¸h¹KÓ8HÑHð L#ñ #Ü%(¨¨7©£_ñ5ð8#ñ#ä%(¨¨9©Ó%6ñ7à9BñCð HIÈÂz˜¬¨A¨g©J«Ñ7¸)ÒCÐWYñ[ð  ñ	 ô !ð
 �ŠyØ—‘Ð.ØŸ7™7Ñ"aÐWXÐY_ÑW`Ô"aÓañbà#ñ$ô %ð �H‰Hð @ÜBHÇ,Á,×BTÑBTÐUVÐW[ÑU\ÓB]ñ^Ø`nñoà\^ñ`àbhñiô jð �Š}Ø—‘Ð3´c¸!¸J¹-Ó6HÑHÐKxÑxÔyØ�H‰H�XÔØ�Š~Ø—‘ÐMÔPSÔTWÐXYÐZeÑXfÓTgÓPhÑhð l-ñ -àŸ7™7ñ #<à,-¨k©Nô#<ó <ñ<ð
 .ñ.ô /ð �H‰H�\Ö"ðE"	#ðF 	
�‰�ÔØ	�‰ð  Aô  	Bà‡H�HÐKÌiÑWð [añ aô bà‡H�HˆXÔáØ	�‰ð ô 	ð2 ‡H�HÐÔØ�7‰7�1‹:Ðr   c                 óx  ‡ — dt        ‰ j                  d«      xs d«      z   dz   }ˆ fd„}|d |g d¢«      z   dz   z  }d	g d
¢fdg d¢ffD ]!  \  }} ||«      }|sŒ|d|z   dz   |z   dz   z  }Œ# dD ]V  \  }}‰ j                  |d«      }	|	€dn
t        |	«      }	|	j                  «       sŒ8|	dvsŒ=|d|z   dz   t        |	«      z   dz   z  }ŒX ‰ j                  dd«      }
|
€dn
t        |
«      }
|
j                  «       rß|
dvrÛg g }}|
j	                  d«      D ]{  }|j                  «       }|sŒd|v rQ|j                  d«      \  }}}	|j                  «       |	j                  «       }	}|r|	r|dvr|j                  ||	f«       Œk|j                  |«       Œ} |r!|ddj                  d„ |D «       «      z   dz   z  }|r#|dt        dj                  |«      «      z   dz   z  }‰ j                  d«      r|dt        ‰ d   «      z   dz   z  }|r·|dt        t        |«      «      z   dz   z  }|D ]�  }|dt        |j                  d«      xs d«      z   dz   z  }d D ]]  \  }}|j                  |«      €dn't        |j                  |«      «      j                  «       }	|	sŒD|d!|z   d"z   t        |	«      z   d#z   z  }Œ_ |dz  }Œ’ |d$z  }|S )%u  ä¸­é¡¹ç½‘(CCPC)é¡¹ç›® â†’ è¯¦æƒ…æ­£æ–‡å�¡ç‰‡ã€‚

    2026-09-11ï¼šç”±è€�è®¾è®¡ï¼ˆ.detail-wrap/.detail-title/.detail-card/.detail-grid/
    .label/.value/.detail-textï¼‰ç»Ÿä¸€åˆ° v2 çš„ .dh/.dht/.dg/.lb/.ds/.ct/.ccï¼Œ
    ä¸Žåˆ—è¡¨é¡µå�³ä¾§æŠ½å±‰ï¼ˆrender_ccpc_fragï¼‰å�Š crawler/zc è¯¦æƒ…é¡µå…±ç”¨å�Œä¸€å¥— DETAIL_CSSã€‚
    å­—æ®µä¸Žè€�ç‰ˆé€�ä¸€å¯¹é½�ï¼šåŸºæœ¬ä¿¡æ�¯ 15 é¡¹ + å·¥æœŸä¸Žè§„æ¨¡ + ç»“æž„ä¸Žé…�å¥— + 8 ä¸ªæ–‡æœ¬æ®µ +
    é¢„æµ‹è¯´æ˜Ž/é¡¹ç›®è¯¦æƒ… + ä¸šä¸» + è�”ç³»äººã€‚ä¸�å�« <html>/<style>/é¡µå£³ã€‚
    r  r  r   r  c                 óÂ   •— d}| D ]V  \  }}‰j                  |d«      }|€dn
t        |«      }|j                  «       sŒ8|dvsŒ=|d|z   dz   t        |«      z   dz   z  }ŒX |S )Nr   r0  r3  r4  r5  )r   r�   r   r“   )Úpairsr"   ri  ri   r#   r    s        €r	   Ú_gridz'render_cceup_detail_body.<locals>._grid  sy   ø€ ØˆØò 	f‰HˆC�Ø—‘�c˜2“ˆAØ�i‘¤S¨£VˆAØ�w‰w�y˜QÐ&:Ò:ØÐ/°#Ñ5Ð8JÑJÌSÐQRËVÑSÐVeÑeÑe‘ð		fð
 ˆ
r   r  )r  rx  r8  )u   æŠ•èµ„é‡‘é¢�r  r  )u   ç»†åˆ†è¡Œä¸šÚ
field_typer#  )u   æŠ•èµ„æ€§è´¨ry  )r.  rz  r{  r  r!  )r’  r}  r,  )u   ç‰ˆæœ¬r  rO  u   å·¥æœŸä¸Žè§„æ¨¡)r~  )u   å·¥æœŸr€  rA  rC  r�  u   ç»“æž„ä¸Žé…�å¥—))rI   Ústeel_structure)u   å»ºç­‘å±‚æ•°Úbuilding_floors)u   ä¾›æš–æ–¹å¼�Úheating_method)u   å¤–å¢™æ��æ–™Úwall_materialrE  )u   æœ‰æ— ç©ºè°ƒÚhas_ac)u   æœ‰æ— ç«‹ä½“å�œè½¦ä½�Úhas_parking)u   æœ‰æ— ç”µæ¢¯Úhas_elevatorrM  z</h3><div class="dg">)rƒ  r„  )u   é‡‡è´­è®¾å¤‡Úprocurement_equipment)u   é‡‡è´­éœ€æ±‚r†  )u   é¡¹ç›®è¿›å±•r‰  )u   è®¾å¤‡æ¸…å�•rU  )u   å•†æœºÚopportunity)u   é‡�ç‚¹å·¥ä½œrˆ  r0  rN  rY  rþ  õ   ï¼š)u   ã€�æ‰€éœ€æ��æ–™è®¾å¤‡ã€‘u   ã€�é¡¹ç›®è¿›å±•ã€‘u   ã€�é¡¹ç›®è¯¦æƒ…ã€‘u   ç‰ˆæ�ƒæ‰€æœ‰u5   <div class="ds"><h3>é¢„æµ‹è¯´æ˜Ž</h3><div class="ct">c              3   óV   K  — | ]!  \  }}t        |«      d z   t        |«      z   –— Œ# y­w)rO  Nr7  ©r^   r…  r#   s      r	   ra   z+render_cceup_detail_body.<locals>.<genexpr>Z  s%   è ø€ ÒM¹$¸!¸Qœc !›f u™n¬s°1«vÕ5ÑMùs   ‚')u5   <div class="ds"><h3>é¡¹ç›®è¯¦æƒ…</h3><div class="ct">r  u/   <div class="ds"><h3>ä¸šä¸»</h3><div class="ct">rŠ  r‹  r]  r  r^  ))u   å§“å��r_  )u   ç”µè¯�r  r�  r‘  r“  r”  r²  r´  )	r“   r   r�   r   r   Ú	partitionr   r   r]   )r    r�  rg  rD  Ú_titleÚ_pairsÚ_innerri  ri   r#   Ú_dvÚ
table_rowsÚ
text_partsÚliner…  r  rµ   s   `                r	   Úrender_cceup_detail_bodyrZ    sj  ø€ ð 	0´#°a·e±e¸NÓ6KÒ6QÈrÓ2RÑRÐUbÑb€Aôð Ð	™eò %ó ñ 
ð 
ñ
ñ €Að 
ò >ð 	?ð 
ò dð 	eð	ò e‰ˆ�ñ �v“ˆÚØÐ'¨&Ñ0Ð3JÑJÈVÑSÐVdÑdÑd‰AðeðOò b‰ˆˆSð �E‰E�#�r‹NˆØ�)‰B¤ Q£ˆØ�7‰7�9˜Ð"6Ò6ØÐ'¨#Ñ-Ð0GÑGÌ#ÈaË&ÑPÐSaÑaÑa‰Aðbð �%‰%�˜"Ó
€CØ�‰"¤ S£€CØ
‡y�y„{�sÐ"6Ñ6Ø!# R�Jˆ
Ø—I‘I˜d“Oò 
	$ˆDØ—:‘:“<ˆDÙØØ˜‰}ØŸ.™.¨Ó/‘��1�aØ—w‘w“y !§'¡'£)�1�Ù™˜qð  )Añ   AØ×%Ñ% q¨! fÔ-ØØ×Ñ˜dÕ#ð
	$ñ ØÐIØ—I‘IÑMÀ*ÔMÓMñNØP^ñ_ñ `ˆAáØÐIÜ˜Ÿ	™	 *Ó-Ó.ñ/Ø1?ñ@ñ AˆAð 	‡u�uˆ_ÔØ	Ð>ÄÀQÀÑEWÓAXÑXÐ[iÑiÑiˆáØ	Ð/´#´c¸(³mÓ2DÑDÀzÑQÑQˆØò 	 ˆAØÐ4´s¸1¿5¹5ÀÓ;KÒ;QÈrÓ7RÑRð V%ñ %ñ &ˆAðIò Z‘��SàŸ%™% ›*Ð,‘B´#°a·e±e¸C³j³/×2GÑ2GÓ2I�ÚØÐ,¨sÑ2°_ÑDÄsÈ1ÃvÑMÐPYÑYÑY‘Að	Zð
 �Ñ‰Að	 ð 	
ˆX‰ˆà€Hr   c                 óX   — 	 t        j                  dd| xs d«      S # t        $ r Y yw xY w)u2   å�–çº¯æ•°å­—ï¼ˆå®¹å¿� ._3085230 è¿™ç±»è„�å‰�ç¼€ï¼‰r  r   )r   r—   r…   r‘   s    r	   Ú_orig_digitsr\  z  s0   € ðÜ�v‰v�e˜R ¢ bÓ)Ð)øÜò Ùðús   ‚ �	)¨)c                 óf   — t        | «      }t        |«      dk(  rd|z   S t        |«      dk(  rd|z   S y)u@   7 ä½� â†’ plantï¼›9 ä½� â†’ confirmedProjectï¼›å…¶å®ƒè¿”å›ž Nonerø   z0https://ed.industrialinfo.com/NED/ui/#/ED/plant/é	   z;https://ed.industrialinfo.com/NED/ui/#/ED/confirmedProject/N)r\  r]   )rç   rž  s     r	   Ú_orig_ext_urlr_  �  s;   € ä�TÓ€AÜ
ˆ1ƒv�‚{ØAÀAÑEÐEÜ
ˆ1ƒv�‚{ØLÈqÑPÐPØr   c                 ó´   — | syd|z   dz   t         j                  j                  t        | «      «      z   dz   t	        j
                  t        | «      «      z   dz   S )Nr   z<a class="kw z(" draggable="false" href="/originals/?q=u    " title="æŒ‰æ­¤å…³é”®è¯�æ�œç´¢">rè  )rž  rŸ  r   r�   ÚhtmlÚescape)r   r¸  s     r	   Ú_orig_search_linkrc  Š  s\   € ÙØØ˜cÑ!Ð$NÑNÜ�L‰L×Ñœs 4›yÓ)ñ*Ø,NñOä�K‰Kœ˜D›	Ó"ñ#à%+ñ,ð -r   c                 óP   — t        | «      }|syt        | «      }d|z   dz   |z   dz   S )Nr   z<a class="extlink" href="uB   " target="_blank" rel="noopener" title="åœ¨ industrialinfo æ‰“å¼€ a*  "><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="#1a73e8" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>)r_  r\  )rç   r·  rž  s      r	   Ú_orig_ext_iconre  ‘  sH   € Ü�dÓ€AÙØÜ�TÓ€AØ'¨!Ñ+ð /0ñ 0Ø23ñ4ð7añað br   aO  .kw{color:inherit;cursor:text;text-decoration:none}.kw:hover{color:#1a73e8}.extlink{display:inline-flex;vertical-align:-1px;margin-left:4px;opacity:.6}.extlink:hover{opacity:1}.selbar{position:absolute;display:none;z-index:9999;align-items:center;gap:8px;background:#202124;color:#fff;border-radius:16px;padding:5px 10px;font-size:12px;box-shadow:0 2px 12px rgba(0,0,0,.35);font-family:sans-serif}.selbar .seltxt{max-width:220px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;opacity:.85}.selbar a{color:#8ab4f8;text-decoration:none;font-size:12px}.selbar .selclose{color:#9aa0a6}c                 ó²  — i }| xs g D �cg c]'  }t        |«      j                  «       sŒt        |«      ‘Œ) } }| s|S 	 t        j                  t        d¬«      }|j                  d«       dj                  dt        | «      z  «      }|j                  d|z  | «      D ]  \  }}||t        |«      <   Œ |j                  «        |S c c}w # t        $ r Y |S w xY w)u^   crawler åˆ—è¡¨é¡µçš„ã€Œè®¿é—®æ¬¡æ•°ã€�â€”â€”å¤�ç”¨æ—¢æœ‰ project_visitsï¼ˆtype='crawler'ï¼‰ã€‚é   r}   zPRAGMA busy_timeout=15000r	  r
  zwSELECT project_id, COUNT(*) FROM project_visits WHERE project_type='crawler' AND project_id IN (%s) GROUP BY project_id)
r�   r   r   r€   r¡  r‚   r   r]   r„   r…   )rP  r"   rŸ   rë  Úqsri  r�  s          r	   Ú_crawler_views_mapri  ©  sÙ   € à
€CØšI 2Ö
9�a¬#¨a«&¯,©,­.Œ3ˆq�6Ð
9€CÐ
9ÙØˆ
ðÜ�_‰_œZ°Ô4ˆØ
�
‰
Ð.Ô/Ø�X‰X�cœC ›H‘nÓ%ˆØ—j‘jð&à(*ñ+à,/ó1ò 	‰FˆC�ð ˆC”�C“ŠMð		ð
 	�‰Œ
ð €Jùò :øô ò ØØ€Jðús   ‹CªC¾BC	 Ã		CÃCc                 ó  — 	 | j                  d«      xs g }t        |D �cg c]  }|j                  d«      ‘Œ c}«      }|D ]/  }|j                  t        |j                  d«      «      d«      |d<   Œ1 	 | S c c}w # t        $ r Y | S w xY w)u@   ç»™åˆ—è¡¨ items é™„ä¸Šè®¿é—®æ¬¡æ•° vï¼ˆä¾›å‰�ç«¯ rowEl æ¸²æŸ“ï¼‰r·  r+   r   r#   )r   ri  r�   r…   )rž  r·  Úitr(   s       r	   rÿ  rÿ  ¾  s‹   € ðØ—‘�g“Ò$ "ˆÜ°uÖ=° §¡ t¥Ò=Ó>ˆØò 	2ˆBØ—e‘eœC §¡ t£Ó-¨qÓ1ˆBˆsŠGñ	2ð €Hùò  >øô ò ØØ€Hðús!   ‚A;  A6¸;A; Á6A; Á;	BÂBaQ  <script>
(function(){
  var bar=document.createElement('div');
  bar.className='selbar';
  bar.innerHTML='<span class="seltxt"></span><a class="selbtn" href="#">\u{1F50D} \u641C\u7D22</a><a class="selclose" href="#">\u00D7</a>';
  document.body.appendChild(bar);
  function hide(){bar.style.display='none';}
  function show(){
    var s=window.getSelection();
    var t=s?s.toString().replace(/\s+/g,' ').trim():'';
    if(!t||t.length<2||t.length>120){hide();return;}
    var r=s.getRangeAt(0).getBoundingClientRect();
    bar.querySelector('.seltxt').textContent=t.length>32?t.slice(0,32)+'\u2026':t;
    bar.querySelector('.selbtn').href='/originals/?q='+encodeURIComponent(t);
    bar.style.display='inline-flex';
    var top=r.top-42; if(top<6) top=r.bottom+8;
    bar.style.top=(top+window.scrollY)+'px';
    bar.style.left=Math.max(8,r.left+window.scrollX)+'px';
  }
  document.addEventListener('mouseup',function(e){
    if(e.target.closest('.selbar'))return; setTimeout(show,10);
  });
  document.addEventListener('keyup',function(e){ if(e.key==='Escape') hide(); });
  document.addEventListener('mousedown',function(e){ if(!bar.contains(e.target)) hide(); });
  bar.querySelector('.selclose').addEventListener('click',function(e){
    e.preventDefault(); hide(); if(window.getSelection()) window.getSelection().removeAllRanges();
  });
})();
</script>c                   óØ   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d"d	„Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd#d„Zd„ Zd$d„Z	 	 d%d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d „ Z!d!„ Z"y)&ÚSearchHandlerc                 ó0  — ddl }|}|j                  d«      r|t        d«      d xs d}	 ddi}| j                  j	                  dd«      }|r||d<   |j
                  j                  dd	d
¬«      }|j                  d||¬«       |j                  «       }|j                  «       }| j                  |j                  «       |j                  «       D ]*  \  }	}
|	j                  «       dvsŒ| j                  |	|
«       Œ, | j                  dt        t        |«      «      «       | j!                  «        | j"                  j%                  |«       |j'                  «        y# t(        $ r°}	 | j                  d«       | j                  dd«       | j                  dt        t        t        |«      «      dz   «      «       | j!                  «        | j"                  j%                  d|z  j+                  d«      «       n# t(        $ r Y nw xY wY d}~yY d}~yd}~ww xY w)uB   å��å�‘ä»£ç�† /tm/* â†’ 127.0.0.1:8010 (Tampermonkey script center)r   Nú/tmr>  zX-Forwarded-PrefixÚCookier   z	127.0.0.1iJ  rg  r}   ÚGET)Úheaders)zcontent-lengthztransfer-encodingÚ
connectionúContent-Lengthiö  úContent-Typeútext/plain; charset=utf-8r×  u    Tampermonkey æœ�åŠ¡ä¸�å�¯ç”¨: %srt  )Úhttp.clientrª   r]   rr  r   ÚclientÚHTTPConnectionÚrequestÚgetresponser  Úsend_responseÚstatusÚ
getheadersr   Úsend_headerr�   Úend_headersÚwfileÚwriter„   r…   ry  )ÚselfÚraw_pathÚhttpÚtargetÚ_hdrsÚ_ckr‡   ÚrespÚbodyr…  r#   rá  s               r	   Ú_proxy_tampermonkeyz!SearchHandler._proxy_tampermonkeyë  sÓ  € ãàˆØ×Ñ˜UÔ#ØœC ›J˜KÐ(Ò/¨CˆFð	à)¨5Ð1ˆEØ—,‘,×"Ñ" 8¨RÓ0ˆCÙØ"%��h‘Ø—;‘;×-Ñ-¨k¸4ÈÐ-ÓLˆDØ�L‰L˜ °ˆLÔ6Ø×#Ñ#Ó%ˆDØ—9‘9“;ˆDØ×Ñ˜tŸ{™{Ô+ØŸ™Ó)ò +‘��1Ø—7‘7“9Ð$YÒYØ×$Ñ$ Q¨Õ*ð+ð ×ÑÐ-¬s´3°t³9«~Ô>Ø×ÑÔØ�J‰J×Ñ˜TÔ"Ø�J‰J�LøÜò 	ðØ×"Ñ" 3Ô'Ø× Ñ  Ð1LÔMØ× Ñ Ð!1´3´s¼3¸q»6³{ÀRÑ7GÓ3HÔIØ× Ñ Ô"Ø—
‘
× Ñ Ð"DÀqÑ"H×!PÑ!PÐQXÓ!YÕZøÜò ÙðúÜô [ûð	ús>   «B<E Ã(A3E Å	HÅ&BG7Ç6HÇ7	HÈ HÈHÈHÈHc                 ó&  — dt        j                  |«      z   dz   t        j                  |«      z   dz   }| j                  d«       | j                  dd«       | j	                  «        | j
                  j                  |j                  d«      «       y )Nu¬  <!DOCTYPE html><html><head><meta charset="utf-8"><title>æ��ç¤º</title></head><body style="font-family:sans-serif;background:#f5f6fa;padding:60px 20px;text-align:center"><div style="background:#fff;max-width:540px;margin:0 auto;padding:40px 32px;border-radius:10px;box-shadow:0 2px 12px rgba(0,0,0,.08)"><h2 style="margin-top:0;color:#333">å…³é”®è¯�è¿‡çŸ­</h2><p style="color:#666;font-size:15px;line-height:1.8">å…³é”®è¯� â€œ<b>u·   </b>â€� è¿‡çŸ­ï¼ˆâ‰¤2 ä¸ªå­—ç¬¦ï¼‰ï¼Œæ— æ³•è¿›è¡Œæœ‰æ•ˆæ£€ç´¢ã€‚è¯·è‡³å°‘è¾“å…¥ <b>3 ä¸ªå­—ç¬¦</b>ï¼Œå»ºè®®ä½¿ç”¨å®Œæ•´çš„å…¬å�¸å��ç§°æˆ–æ›´å…·ä½“çš„é¡¹ç›®å…³é”®è¯�ã€‚</p><p><a href="uS   " style="color:#1a73e8;font-size:15px">â†� è¿”å›žæ�œç´¢</a></p></div></body></html>éÈ   ru  útext/html; charset=utf-8rt  )ra  rb  r|  r  r€  r�  r‚  ry  )rƒ  rÖ   rZ   rl  s       r	   Ú_send_short_query_noticez&SearchHandler._send_short_query_notice  s“   € ðYô
 \`×[fÑ[fÐgiÓ[jñkð
n ñ ô #'§+¡+¨dÓ"3ñ4ð7(ñ(ˆð 	×Ñ˜3ÔØ×Ñ˜Ð)CÔDØ×ÑÔØ�
‰
×Ñ˜Ÿ™ gÓ.Õ/r   c                 óp+  ‡)— t         j                  j                  | j                  «      }t         j                  j	                  |j
                  «      }| j                  «       | _        |j                  j                  d«      r| j                  xs d| _        |j                  j                  d«      s|j                  dk(  r| j                  | j                  «       y |j                  dv rg|j                  dk(  rF| j                  d«       | j                  dd	«       | j                  d
d«       | j                  «        y | j                  |«       y |j                  j                  d«      �rdd l}dd l}d|j                  z   }|j                  j!                  |«      rœ|j#                  |«      \  }}| j                  d«       | j                  d|xs d«       | j                  dd«       | j                  «        t%        |d«      5 }| j&                  j)                  |j+                  «       «       d d d «       y | j                  d«       | j                  «        | j&                  j)                  d«       y |j                  j                  d«      r| j-                  |«       y |j                  j                  d«      r| j/                  |«       y | j                  s4| j                  d«       | j                  d
d«       | j                  «        y | j1                  |j                  |«       |j                  dv r‰dD �	cg c]&  }	|j3                  |	dg«      d   j5                  «       ‘Œ( }
}	|
D �	cg c]  }	|	sŒ|	‘Œ	 }
}	|
rDt7        dj9                  d„ |
D «       «      «      dk  r | j;                  |j                  |
d   «       y |j                  }|}|dk(  r2d|v r.|j3                  dd g«      d   }t=        d!|t?        | d"d#«      «       |j                  d$v r| jA                  d%|«       y |j                  j                  d&«      r| jC                  d%|j                  «       y |j                  d'v r�|j3                  d(«      r| jA                  d)|«       y | jE                  dtG        t?        | d"d«      xs d|j3                  d*«      xs d+gd   |j3                  d,«      xs dgd   d)¬-«      «       y |j                  j                  d.«      r| jC                  d)|j                  «       y |j                  d/k(  �r\t?        | d"d «      s| jI                  d0d1d2œ«       y tK        |j3                  d3«      xs d4gd   |j3                  d5«      xs dgd   |j3                  d6«      xs d7gd   |j3                  d8«      xs d9gd   |j3                  d*«      xs d+gd   |j3                  d:«      xs dgd   |j3                  d,«      xs dgd   tM        «       tO        |j3                  d5«      xs dgd    xr |j3                  d3«      xs d4gd   d4k7  «      ¬;«	      }|j3                  d3«      xs d4gd   d4k(  rtQ        |«       d<|d=<   | jI                  |«       y |j                  d>k(  �rt?        | d"d «      s| jI                  d0d1d2œ«       y |j3                  d«      xs dgd   }|j3                  d3«      xs d4gd   }|s| jI                  d0d?d2œ«       y d}|d@k(  r	 tS        |«      }nm|dAk(  r	 tW        |«      }n[i Š)| jD                  }ˆ)fdB„| _"        d<| _,        	 | jC                  |dC|›dD|›�«       || _"        d0| _,        ‰)j3                  dG«      xs d}t[        ||«      }| jI                  tO        |«      ||dHœ|¥«       y |j                  dIk(  r‹t?        | d"d «      s| jI                  d0d1d2œ«       y t]        |j3                  d3«      xs d4gd   |j3                  d,«      xs dgd   |j3                  d6«      xs dJgd   «      }d<|d=<   | jI                  |«       y |j                  dKv r+| jE                  dt_        t?        | d"d«      xs d«      «       y |j                  j                  dL«      �rt         j                  ja                  |j                  t7        dL«      d  «      }tc        |«      \  }}}|s‹dM|xs dz   je                  dN«      }| j                  d«       | j                  ddO«       | j                  dPtg        t7        |«      «      «       | j                  «        | j&                  j)                  |«       y th        j                  jk                  |«      }| j                  d«       | j                  d|jm                  «       jo                  dQ«      rdRnd«       | j                  dPtg        th        j                  jq                  |«      «      «       | j                  dSdTts        |«      ›dUt         j                  ju                  |«      ›�«       | j                  «        t%        |d«      5 }	 |j+                  dV«      }|sn| j&                  j)                  |«       Œ0	 d d d «       y |j                  dWv r˜|j3                  d(«      r| jA                  d4|«       y | jE                  dtG        t?        | d"d«      xs d|j3                  d*«      xs d+gd   |j3                  d:«      xs dgd   |j3                  d,«      xs dgd   ¬X«      «       y |j                  j                  dY«      r| jC                  d4|j                  «       y |j                  dZv r| jA                  d[|«       y |j                  j                  d\«      r| jC                  d[|j                  «       y |j                  dCk(  r| jw                  |«       y |j                  dk(  r| jy                  |«       y |j                  d]k(  r| j{                  |«       y |j                  d^v rh|j3                  d(«      r| j}                  |«       y | jE                  dtG        t?        | d"d«      xs d|j3                  d,«      xs dgd   dA¬_«      «       y |j                  d`v r€|j3                  d(«      r| j                  |«       y | jE                  dtG        t?        | d"d«      xs d|j3                  d*«      xs d+gd   |j3                  d,«      xs dgd   d@¬-«      «       y |j                  dak(  r| j                  |«       y |j                  dbv r| j�                  |«       y |j                  dck(  r| jƒ                  «        y |j                  j                  dd«      s|j                  j                  de«      r| j…                  | j                  «       y |j                  dfk(  r| j‡                  «        y |j                  dgk(  r| j‰                  «        y |j                  dhk(  r| j‹                  |«       y |j                  dik(  r| j�                  «        y |j                  dk(  rÌ	 t�        |j3                  dj«      xs dkgd   xs dl«      }| jE                  dt‘        ||j3                  dm«      xs d+gd   |j3                  dn«      xs d+gd   |j3                  do«      xs dgd   |j3                  dp«      xs dqgd   |j3                  d8«      xs drgd   t?        | d"d«      xs d¬s«      «       y |j                  dtk(  r}dd lI}t•        «       }| j                  d«       | j                  ddu«       | j                  «        | j&                  j)                   |j–                  |d0¬v«      je                  «       «       y |j                  dwk(  r}dd lI}t™        «       }| j                  d«       | j                  ddu«       | j                  «        | j&                  j)                   |j–                  |d0¬v«      je                  «       «       y |j                  dxk(  r½dd lI}|j3                  dydg«      d   }|j3                  d:dg«      d   }t›        ||«      }| j                  d«       | j                  ddu«       | j                  dzd{«       | j                  «        | j&                  j)                   |j–                  |d0¬v«      je                  «       «       y |j                  d|k(  r¦dd lI}|j3                  dydg«      d   }t�        |«      }| j                  d«       | j                  ddu«       | j                  dzd{«       | j                  «        | j&                  j)                   |j–                  |d0¬v«      je                  «       «       y |j                  d}k(  r½dd lI}dd l} |j3                  dodg«      d   }!	 t%        tž        d~«      5 }"|"j)                  |!«       d d d «       d<|!dœ}| j                  d«       | j                  ddu«       | j                  «        | j&                  j)                   |j–                  |d0¬v«      je                  «       «       y |j                  d�k(  r½dd lI}dd l} |j3                  dodg«      d   }!	 t%        t         d~«      5 }"|"j)                  |!«       d d d «       d<|!dœ}| j                  d«       | j                  ddu«       | j                  «        | j&                  j)                   |j–                  |d0¬v«      je                  «       «       y |j                  d‚k(  r÷dd lI}ddƒlQmR}$ |j3                  d„d…g«      d   }%|j3                  d†d‡g«      d   }&|j3                  dˆd‰g«      d   }'t�        |j3                  dŠd‹g«      d   «      }( |$|%|&|'|(«      }| j                  d«       | j                  ddu«       | j                  dzd{«       | j                  «        | j&                  j)                   |j–                  |d0¬v«      je                  «       «       y | j                  d«       | j                  «        | j&                  j)                  d«       y # 1 sw Y   y xY wc c}	w c c}	w # tT        $ r d}Y �Œcw xY w# tT        $ r d}Y �Œuw xY w# tT        $ r	 dEddFœŠ)Y �Œ­w xY w# || _"        d0| _,        w xY w# 1 sw Y   y xY w# tT        $ r dl}Y �Œ•w xY w# 1 sw Y   �ŒxY w# tT        $ r}#d0tg        |#«      d€œ}Y d }#~#�Œ(d }#~#ww xY w# 1 sw Y   �ŒsxY w# tT        $ r}#d0tg        |#«      d€œ}Y d }#~#�ŒŽd }#~#ww xY w)ŒNz/crawler/adminr«  z/tm/ro  )ú/loginú/logoutr’  é.  ú
Set-Cookiezsession=; Path=/; Max-Age=0ÚLocationr‘  z/static/r   ú/root/gov_crawlerr�  ru  zapplication/octet-streamzCache-Controlzmax-age=86400Úrbé”  ó   404z/originals/detailz
/originals)r>  ú/crawlerr'  )r«   Úq2Úq3r   c              3   ó@   K  — | ]  }|j                  d d«      –— Œ y­w)r´   r   N©rr   )r^   Ú_ks     r	   ra   z'SearchHandler.do_GET.<locals>.<genexpr>‚  s   è ø€ Ò#G¸B B§J¡J¨s°B×$7Ñ#Gùs   ‚rž   z/detailr+   Ú0Úgovr£  Ú	anonymous)z/znlhz/znlh/r  ú/znlh/project/)z/zcr)  Úclassicr/  r¤   rô   r«   )r£  r;  r«   râ  r™  z	/api/listFÚauth)ÚokÚerrorr‚  r6  r.  r§  Ú30Údirr  r<  )r.  r§  rÃ  r;  r<  r«   rZ   rÄ  Tr¦  z	/api/itemz
missing idr0  r1  c                 ó,   •— ‰j                  | |dœ«      S )N©rç   ra  )Úupdate)rç   ra  Ú_caps     €r	   rg   z&SearchHandler.do_GET.<locals>.<lambda>ã  s   ø€ ¸T¿[¹[ÐRVÐ`dÑIeÓ=f€ r   r>  ú	/project/éô  r«  ra  )r¦  ra  r+   z/api/quicksearchÚ12)z/toolsz/tools/z/tools/download/u!   å·¥å…·ä¸�å­˜åœ¨æˆ–ä¸�å�¯ä¸‹è½½ï¼šrt  rv  rt  rÛ  zapplication/zipzContent-Dispositionzattachment; filename="z"; filename*=UTF-8''i   )rš  r'  )r£  r;  r<  r«   ú/crawler/project/)z/eiaú/eia/r*   z/eia/project/z/cceup)r-  z	/contact/)r£  r«   râ  )r+  z/ccpc/z/cceup/projects)z/crawler/tempz/crawler/temp/z/crawler/temp/syncú/cceup/project/rš  z
/dashboardz/api/sourcesz
/api/visitz/preview_mdr    Ú1r›   r_  r’   rZ   rà   ÚlatestÚdesc)r7  ÚfgroupÚfstatusÚfkwrà   Úsdirr£  ú/crawler/admin/run-dailyúapplication/json; charset=utf-8rö  ú/crawler/admin/run-statusz/crawler/admin/set-industryr  zAccess-Control-Allow-OriginÚ*z/crawler/admin/toggle-enabledz/crawler/admin/save-excluderk  )Úsuccessr-   ©r¿  r§  z/crawler/admin/save-blockz/crawler/admin/analysis)Úget_analysis_dataÚperiodÚdayÚmodeÚincrementalÚmetricÚbothr@  Ú90)Srž  rŸ  ÚurlparserÖ   Úparse_qsr6  Ú_get_session_userr£  rª   r‹  r|  r  r€  Úhandle_login_pagerÕ   Ú	mimetypesrô  Ú
guess_typer  r�  r‚  r  Úhandle_originals_detailÚhandle_originals_pageÚ
_log_usager   r   r]   r   r�  r¤  ÚgetattrÚhandle_db_listÚhandle_db_detailÚsend_response_htmlr  Ú	send_jsonrý  rþ  r   rÿ  r•  r…   r®  Ú_detail_fragrt  ro  r@  Úunquoter*  ry  r�   rÆ  rõ  r   rt   rÌ  rï  r   Úhandle_search_pageÚhandle_detailÚhandle_cceup_pageÚhandle_contact_pageÚhandle_cceup_projectsÚhandle_temp_dbÚhandle_temp_syncÚhandle_cceup_project_detailÚhandle_dashboardÚhandle_sources_apiÚhandle_visitÚsend_preview_mdr…  Úrender_admin_pager  Úrun_daily_crawlr  Úget_daily_run_statusÚset_crawler_industryÚtoggle_crawler_enabledr  r  Úcrawler_adminrÁ  )*rƒ  Úparsedr=  Ú_osrÍ  Ú
_file_pathÚ_content_typer  rÞ  rŸ  Ú_kwsÚ_parsed_pathÚ_paramsÚ_idrž  rs  Ú_dbÚ_htmlÚ_origÚ_metaÚ_tidÚ_okÚ_fpathÚ_errÚ_bÚ_fnameÚ_chunkrß  r  r»   r�  r­  rÕ   r-   r˜  rá  rÁ  rÂ  rÄ  rÆ  r@  r­  s*                                            @r	   Údo_GETzSearchHandler.do_GET  sò  ø€ ä—‘×&Ñ& t§y¡yÓ1ˆä—‘×&Ñ& v§|¡|Ó4ˆð ×.Ñ.Ó0ˆŒà�;‰;×!Ñ!Ð"2Ô3à ŸM™MÒ4¨WˆDŒMð �;‰;×!Ñ! &Ô)¨V¯[©[¸EÒ-Aà×$Ñ$ T§Y¡YÔ/àà�;‰;Ð/Ñ/à�{‰{˜iÒ'à×"Ñ" 3Ô'à× Ñ  Ð/LÔMà× Ñ  ¨XÔ6à× Ñ Ô"àà×"Ñ" 6Ô*àð �;‰;×!Ñ! *Õ-ç'à,¨v¯{©{Ñ:ˆJà�x‰x�‰˜zÔ*à#,×#7Ñ#7¸
Ó#CÑ �˜qà×"Ñ" 3Ô'à× Ñ  °Ò1\ÐB\Ô]à× Ñ  °/ÔBà× Ñ Ô"ä˜* dÓ+ð 0¨rà—J‘J×$Ñ$ R§W¡W£YÔ/÷0ð ð ×"Ñ" 3Ô'¨×)9Ñ)9Ô);¸T¿Z¹Z×=MÑ=MÈfÔ=Uàð �;‰;×!Ñ!Ð"5Ô6Ø×(Ñ(¨Ô0ØØ�;‰;×!Ñ! ,Ô/Ø×&Ñ& vÔ.Øà�}Š}à×Ñ˜sÔ#à×Ñ˜Z¨Ô2à×ÑÔàð 	�‰˜Ÿ™ VÔ,ð �;‰;Ð8Ñ8Ø>OÖP¸�F—J‘J˜r B 4Ó(¨Ñ+×1Ñ1Õ3ÐPˆDÐPØ!%Ö,˜2ª’BÐ,ˆDÐ,Ùœ˜BŸG™GÑ#GÀ$Ô#GÓGÓHÈAÒMØ×-Ñ-¨f¯k©k¸4À¹7ÔCØð —{‘{ˆàˆà˜9Ò$¨°©à—+‘+˜d S EÓ*¨1Ñ-ˆCä  ¨¬W°T¸:À{Ó-SÔTð �;‰;Ð-Ñ-à×Ñ ¨Õ/à�[‰[×#Ñ#Ð$4Ô5à×!Ñ! &¨&¯+©+Õ6ð �[‰[˜OÑ+ð �z‰z˜)Ô$Ø×#Ñ# D¨&Õ1à×'Ñ'¨Ô->Ü$ T¨:°rÓ:Ò@¸bØ%Ÿz™z¨'Ó2Ò=°u°g¸qÑAØ—z‘z #“Ò.¨2¨$°Ñ2Øô	. õ !ð �[‰[×#Ñ# NÔ3à×!Ñ! $¨¯©Õ4ð �[‰[˜KÓ'ä˜4 ¨TÔ2Ø—‘ e°fÑ=Ô>ÀÜØ—‘˜DÓ!Ò0 i [°!Ñ4ØŸ
™
 8Ó,Ò4°°°aÑ8Ø—z‘z 'Ó*Ò4¨t¨f°aÑ8Ø!Ÿ:™: eÓ,Ò8°°¸!Ñ<Ø!Ÿ:™: gÓ.Ò9°5°'¸1Ñ=Ø Ÿ*™* ZÓ0Ò8°R°D¸!Ñ<Ø—:‘:˜c“?Ò* r d¨AÑ.Ü%Ó'ô   V§Z¡Z°Ó%9Ò%A¸b¸TÀ1Ñ$EÐ Eò !VØ%+§Z¡Z°Ó%5Ò%D¸)¸ÀaÑ$HÈIÑ$UóWôXˆAð —
‘
˜4Ó Ò/ Y K°Ñ3°yÒ@Ü% aÔ(ØˆAˆd‰GØ�N‰N˜1Õà�[‰[˜KÓ'ä˜4 ¨TÔ2Ø—‘ e°fÑ=Ô>ÀØ—:‘:˜dÓ#Ò+¨ t¨QÑ/ˆCØ—:‘:˜dÓ#Ò2¨	 {°AÑ6ˆCÙØ—‘ e°lÑCÔDÀfØˆEØ�fŠ}ðÜ,¨SÓ1‘Eð ˜	Ò!ðÜ/°Ó4‘Eð
 �Ø×/Ñ/�Û*f�Ô'Ø$(�Ô!ð.Ø×)Ñ)©#Â3ÉÐ/LÔMð /4�DÔ+Ø(-�DÔ%ØŸ™ Ó(Ò.¨B�Ü# C¨Ó-ˆEØ�N‰N¤$ u£+°uÀCÑQÈ5ÐQÕRà�[‰[Ð.Ò.ä˜4 ¨TÔ2Ø—‘ e°fÑ=Ô>ÀÜ! 6§:¡:¨dÓ#3Ò#B¸	°{ÀAÑ"FØ#)§:¡:¨c£?Ò#:°r°d¸AÑ">Ø#)§:¡:¨gÓ#6Ò#@¸4¸&À!Ñ"DóFˆAð ˆAˆd‰GØ�N‰N˜1Õð �[‰[Ð1Ñ1Ø×#Ñ# CÔ):¼7À4ÈÐUWÓ;XÒ;^Ð\^Ó)_Ô`Øà�[‰[×#Ñ#Ð$6Õ7Ü—<‘<×'Ñ'¨¯©´CÐ8JÓ4KÐ4LÐ(MÓNˆDÜ /°Ó 5ÑˆC�˜ÙØ9¸TºZÀRÑH×PÑPÐQXÓY�Ø×"Ñ" 3Ô'Ø× Ñ  Ð1LÔMØ× Ñ Ð!1´3´s¸2³w³<Ô@Ø× Ñ Ô"Ø—
‘
× Ñ  Ô$ØÜ—^‘^×,Ñ,¨VÓ4ˆFØ×Ñ˜sÔ#Ø×Ñ˜^À&Ç,Á,Ã.×BYÑBYÐZ`ÔBaÑ->Ø"<ô>à×ÑÐ-¬s´9·>±>×3IÑ3IÈ&Ó3QÓ/RÔSØ×ÑÑ2ä 1°&Õ 9¼6¿<¹<×;MÑ;MÈfÔ;UðWôXð ×ÑÔÜ�f˜dÓ#ð - rØØŸW™W V›_�FÙ!ØØ—J‘J×$Ñ$ VÔ,ð	 ð ÷	-ð ð �[‰[Ð5Ñ5ð �z‰z˜)Ô$Ø×#Ñ# I¨vÕ6à×'Ñ'¨Ô->Ü$ T¨:°rÓ:Ò@¸bØ%Ÿz™z¨'Ó2Ò=°u°g¸qÑAØ$Ÿj™j¨Ó4Ò<¸¸¸aÑ@Ø—z‘z #“Ò.¨2¨$°Ñ2ô	.4õ 5ð �[‰[×#Ñ#Ð$7Ô8à×!Ñ! )¨V¯[©[Õ9ð �[‰[Ð-Ñ-à×Ñ  vÕ.à�[‰[×#Ñ# OÔ4à×!Ñ! %¨¯©Õ5ð �[‰[˜CÒà×#Ñ# FÕ+à�[‰[˜IÒ%à×Ñ˜vÕ&à�[‰[˜HÒ$à×"Ñ" 6Õ*à�[‰[Ð5Ñ5ð �z‰z˜)Ô$Ø×(Ñ(¨Õ0à×'Ñ'¨Ô->Ü$ T¨:°rÓ:Ò@¸bØ—z‘z #“Ò.¨2¨$°Ñ2Ø#ô.%õ &ð
 �[‰[Ð/Ñ/ð �z‰z˜)Ô$Ø×*Ñ*¨6Õ2à×'Ñ'¨Ô->Ü$ T¨:°rÓ:Ò@¸bØ%Ÿz™z¨'Ó2Ò=°u°g¸qÑAØ—z‘z #“Ò.¨2¨$°Ñ2Ø ô	."õ #ð �[‰[Ð-Ò-à×&Ñ& vÕ.ð �[‰[Ð?Ñ?Ø×Ñ Õ'Ø�[‰[Ð0Ò0Ø×!Ñ!Õ#à�[‰[×#Ñ#Ð$5Ô6¸&¿+¹+×:PÑ:PÐQaÔ:bà×,Ñ,¨T¯Y©YÕ7à�[‰[˜LÒ(à×!Ñ!Õ#à�[‰[˜NÒ*à×#Ñ#Õ%à�[‰[˜LÒ(à×Ñ˜fÕ%à�[‰[˜MÒ)à× Ñ Õ"à�[‰[Ð,Ò,ðÜ˜&Ÿ*™* S›/Ò2¨c¨U°AÑ6Ò;¸!Ó<�ð ×#Ñ# CÔ):ØØŸ
™
 3›Ò2¨E¨7°AÑ6ØŸ™ C›Ò3¨U¨G°QÑ7Ø—Z‘Z Ó%Ò-¨"¨¨qÑ1Ø—j‘j Ó(Ò6¨X¨J¸Ñ:Ø—j‘j Ó'Ò3¨F¨8°QÑ7Ü   z°2Ó6Ò<¸"ô*õ ð �[‰[Ð6Ò6ãä$Ó&ˆFà×Ñ˜sÔ#à×Ñ˜^Ð-NÔOà×ÑÔà�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMà�[‰[Ð7Ò7ãä)Ó+ˆFà×Ñ˜sÔ#à×Ñ˜^Ð-NÔOà×ÑÔà�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMà�[‰[Ð9Ò9ãà—
‘
˜6 B 4Ó(¨Ñ+ˆAØ—*‘*˜Z¨"¨Ó.¨qÑ1ˆCÜ)¨!¨SÓ1ˆFà×Ñ˜sÔ#à×Ñ˜^Ð-NÔOØ×ÑÐ:¸CÔ@à×ÑÔà�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMà�[‰[Ð;Ò;ÛØ—
‘
˜6 B 4Ó(¨Ñ+ˆAÜ+¨AÓ.ˆFØ×Ñ˜sÔ#Ø×Ñ˜^Ð-NÔOØ×ÑÐ:¸CÔ@Ø×ÑÔØ�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMà�[‰[Ð9Ò9ßØ—z‘z $¨¨Ó-¨aÑ0ˆHð=ÜÔ,¨cÓ2ð &°aØ—G‘G˜HÔ%÷&à%)°xÑ@�ð ×Ñ˜sÔ#Ø×Ñ˜^Ð-NÔOØ×ÑÔØ�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMà�[‰[Ð7Ò7÷ Ø—z‘z $¨¨Ó-¨aÑ0ˆHð=ÜÔ*¨CÓ0ð &°AØ—G‘G˜HÔ%÷&à%)°xÑ@�ð ×Ñ˜sÔ#Ø×Ñ˜^Ð-NÔOØ×ÑÔØ�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMà�[‰[Ð5Ò5ãå7à—Z‘Z ¨5¨'Ó2°1Ñ5ˆFà—:‘:˜f } oÓ6°qÑ9ˆDà—Z‘Z ¨6¨(Ó3°AÑ6ˆFä�v—z‘z &¨4¨&Ó1°!Ñ4Ó5ˆDá& v¨t°V¸TÓBˆFà×Ñ˜sÔ#à×Ñ˜^Ð-NÔOà×ÑÐ:¸CÔ@à×ÑÔà�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMð ×Ñ˜sÔ# T×%5Ñ%5Ô%7¸¿¹×9IÑ9IÈ&Õ9Q÷C0ð üò8 QùÚ,øôl !ò Ø“Eðûô !ò Ø“Eðûô !ò 5Ø$'°Ñ4“Dð5ûð /4�DÔ+Ø(-�DÕ%ú÷P-ð ûôN ò Ø“ðú÷P&ñ &ûô ò =Ø%*´S¸³VÑ<–ûð=ú÷&ñ &ûô ò =Ø%*´S¸³VÑ<–ûð=ús'  È*ASÍ+AS Í4AS%Í<AS%ÜAS* Ü.AS< ÝAT é72AT6ú&AU ÁH'AU! ÁH7AUÁI	AU! ÁK3AV ÁLAVÁLAV ÁSASÁS*AS9ÁS8AS9ÁS<ATÁT
ATÁTAT ÁTAT# ÁTAT ÁT AT# ÁT#AT3ÁT6AT?ÁUAUÁUAUÁUAUÁUAU! ÁU!	AVÁU*AU>ÁU>AVÁVAVÁVAV ÁV	AV5ÁVAV0ÁV0AV5c           	      óÄ	  — | j                  |dd«      j                  «       }t        | j                  |dd«      «      }t        | j                  |dd«      «      }|dz
  |z  }d}t        j                  j                  |«      s^| j                  d	«       | j                  d
d«       | j                  «        | j                  j                  dj                  d«      «       y t        j                  |«      }|j                  «       }g }	d}
|�rt        |«      \  }}g }g }|D ].  }|j!                  d«       |j#                  d|z   dz   gdz  «       Œ0 |D ].  }|j!                  d«       |j#                  d|z   dz   gdz  «       Œ0 |rdj%                  |«      nd}|j'                  d|z   |«      j)                  «       d   }
|j'                  d|z   dz   |||gz   «      j+                  «       }|D ]0  }|	j!                  |d   |d   |d   xs d|d   |d   xs ddœ«       Œ2 d}	 |j'                  d«      j)                  «       d   }|j-                  «        | j                  d	«       | j                  d
d«       | j                  «        d}|dt.        z   dz   z  }|dz  }|d t1        |«      z   d!z   z  }|d"z  }|d#t3        j4                  |«      z   d$z   z  }|d%z  }|�rÁ|d&t1        |
«      z   d'z   z  }|	�r¥|d(z  }|	D ]·  }|d)   }d*d+d,d-œj7                  ||«      }d.d/d0d-œj7                  |d«      }|d1z  }|d2t1        |d3   «      z   d4z   t3        j4                  |d5   «      z   d6z   z  }|d7z  }|d8   r'|d9t9        |d8   «      z   t;        |d8   «      z   d:z   z  }n|d;z  }|d<|z   d4z   |z   d:z   z  }|d=z  }Œ¹ |d>z  }t=        d|
|z   dz
  |z  «      }|dkD  rÊ|d?z  }t?        dtA        |dz   d@«      «      D ]b  }||k(  r|dAt1        |«      z   dBz   z  }Œ|dCtB        jD                  jG                  |«      z   dDz   t1        |«      z   d4z   t1        |«      z   dEz   z  }Œd |dFkD  r7|dGtB        jD                  jG                  |«      z   dDz   t1        |«      z   dHz   z  }|d>z  }n|dIz  }|dJz  }|tH        dKz   z  }| j                  j                  |j                  d«      «       y #  Y �ŒšxY w)LNr«   r   r7  r´  r8  Ú20r›   rÃ   r�  zContent-typerŽ  z9<html><body><h2>Originals DB not found</h2></body></html>rt  r   z2(title LIKE ? OR content LIKE ? OR id_code LIKE ?)r  rm   z@(title NOT LIKE ? AND content NOT LIKE ? AND id_code NOT LIKE ?)r  z1=0z$SELECT COUNT(*) FROM tsk_data WHERE z?SELECT id, title, id_code, source, content FROM tsk_data WHERE z ORDER BY id LIMIT ? OFFSET ?rž   ry  ©r+   rw   rò   r—  r  zSELECT COUNT(*) FROM tsk_dataz=<html><head><meta charset=utf-8><title>Originals_Data</title>aë  <style>body{font-family:sans-serif;margin:20px;background:#f5f5f5;text-align:center}.sb{margin:20px auto;display:flex;gap:0;justify-content:center;max-width:600px}.sb input{flex:1;padding:12px 20px;border:1px solid #dfe1e5;border-radius:24px 0 0 24px;font-size:16px;outline:none;max-width:500px}.sb input:focus{border-color:#1a73e8}.sb button{padding:12px 24px;background:#1a73e8;color:#fff;border:none;border-radius:0 24px 24px 0;font-size:15px;cursor:pointer}.sb button:hover{background:#1557b0}.results{max-width:800px;margin:0 auto;text-align:left}.result-item{padding:12px 0;border-bottom:1px solid #eee}.result-item h3{font-size:16px;font-weight:400;margin:0 0 2px 0}.result-item h3 a{color:#1a0dab;text-decoration:none}.result-item h3 a:hover{text-decoration:underline}.meta{font-size:12px;color:#70757a;display:flex;gap:12px;align-items:center}.id_code{color:#c00;font-weight:bold}.src{display:inline-block;padding:2px 8px;border-radius:3px;font-size:11px}.src-p{background:#e8f5e9;color:#2e7d32}.src-c{background:#e3f2fd;color:#1565c0}.src-l{background:#fff3e0;color:#e65100}.nav{margin:16px 0}.nav a,.nav strong{margin:0 3px;font-size:14px}.nav a{color:#1a73e8;text-decoration:none}.count{font-size:14px;color:#70757a;margin:8px 0;text-align:center}ú</style></head><body>u5   <h1 style=text-align:center>ðŸ”� åŽŸå§‹æ•°æ�®åº“</h1>z<p style=color:#666>z* records &middot; Pharma / CPI / Plant</p>z-<form class=sb method=get action=/originals/>z<input type=text name=q value="u)   " placeholder="è¾“å…¥å…³é”®è¯�æ�œç´¢...">u*   <button type=submit>æ�œç´¢</button></form>z<p class=count>u    æ�¡ç»“æžœ</p>z<div class=results>r—  úP PharmaúC CPIúL Plant©r3   rL   rð   úsrc-púsrc-cúsrc-lz<div class=result-item>z"<h3><a href="/originals/detail?id=r+   r³  rw   ú	</a></h3>ú<div class=meta>rò   ú<span class=id_code>r²  ú<span class=id_code>-</span>ú<span class="src rO  r´  z<div class=nav>é3   z<strong>z
</strong> z<a href="/originals/?q=ú&page=z</a> é2   z... <a href="/originals/?q=z
">Last</a>u   <p>æ— ç»“æžœ</p>uK   <p style=color:#999;margin-top:30px><a href=/>"U+2190" è¿”å›žä¸»é¡µ</a></p>rû  )%Ú	get_paramr   r…  rÕ   rÖ   rÜ   r|  r  r€  r�  r‚  ry  r   r€   r.  r®   r   r£   r   r‚   r1  rÝ   r„   r  r�   ra  rb  r   rc  re  r»  r¤   r¼  rž  rŸ  r   r  )rƒ  r=  r«   r7  r8  rC  ÚORIGINALS_DBr‡   rµ   ÚresultsrD  rE  rF  rƒ  ro   ro  ræ   r  Útotal_countrg  ÚscÚslÚsc_clsÚtpr    s                            r	   rÐ  z#SearchHandler.handle_originals_page  s·  € Ø�N‰N˜6 3¨Ó+×1Ñ1Ó3ˆÜ�4—>‘> &¨&°#Ó6Ó7ˆÜ˜Ÿ™ v¨{¸DÓAÓBˆ	Ø˜‘(˜iÑ'ˆà+ˆÜ�w‰w�~‰~˜lÔ+Ø×Ñ˜sÔ#Ø×Ñ˜^Ð-GÔHØ×ÑÔØ�J‰J×ÑÐY×aÑaÐbiÓjÔkØä�‰˜|Ó,ˆØ�K‰K‹MˆàˆØˆÚÜ#5°aÓ#8Ñ ˆI�yØˆEØˆFØò 3�Ø—‘ÐQÔRØ—‘˜s Q™w¨™}˜o°Ñ1Õ2ð3ð ò 3�Ø—‘Ð_Ô`Ø—‘˜s Q™w¨™}˜o°Ñ1Õ2ð3ñ ,1�G—L‘L Ô'°eˆEà—I‘IÐDÀuÑLÈfÓU×^Ñ^Ó`ÐabÑcˆEØ—9‘9Ð^ÐafÑfð  jIñ  IØ˜) VÐ,Ñ,ó.ß.6©h«jð ð ò z�Ø—‘ a¨¡d°Q°q±TÀaÈÁdÂjÈbÐ\]Ð^_Ñ\`ÐmnÐopÑmqÒmwÐuwÑxÕyðzð ˆð	ØŸ)™)Ð$CÓD×MÑMÓOÐPQÑRˆKð 	�
‰
Œà×Ñ˜3ÔØ×Ñ˜Ð)CÔDØ×ÑÔàKˆØ	ð  {ô  ~Mñ  Mð  Pgñ  gñ  	gˆØ	ÐDÑDˆØ	Ð#¤c¨+Ó&6Ñ6Ð9eÑeÑeˆØ	Ð<Ñ<ˆØ	Ð.´·±¸Q³Ñ?ÐBmÑmÑmˆØ	Ð9Ñ9ˆâØÐ"¤S¨£ZÑ/Ð2BÑBÑBˆAÚØÐ*Ñ*�Ø ò (�AØ˜8™�BØ#-°GÀIÑN×RÑRÐSUÐWYÓZ�BØ'.°WÀWÑM×QÑQÐRTÐVXÓY�FØÐ2Ñ2�AØÐ=ÄÀAÀdÁGÃÑLÈtÑSÔVZ×VaÑVaÐbcÐdkÑblÓVmÑmÐp{Ñ{Ñ{�AØÐ+Ñ+�AØ˜’|ØÐ4Ô7HÈÈ9ÉÓ7VÑVÜ,¨Q¨y©\Ó:ñ;Ø=FñGñ H™ð Ð;Ñ;˜ØÐ,¨vÑ5¸Ñ<¸rÑAÀIÑMÑM�AØ˜Ñ'‘Að(ð �X‘�ä˜˜U YÑ.°Ñ2°yÑ@ÓA�Ø˜’6ØÐ*Ñ*�AÜ" 1¤c¨"¨q©&°"£oÓ6ò A˜Ø š9Ø ¬c°!«fÑ!4°|Ñ!CÑC™AàÐ!:¼V¿\¹\×=OÑ=OÐPQÓ=RÑ!RÐU]Ñ!]Ô`cÐdeÓ`fÑ!fÐimÑ!mÔpsÐtuÓpvÑ!vð  zAñ  "Añ  A™Að	Að
 ˜B’wØÐ:¼V¿\¹\×=OÑ=OÐPQÓ=RÑRÐU]Ñ]Ô`cÐdfÓ`gÑgÐjvÑvÑv˜Ø˜‘M‘AàÐ'Ñ'�à	ÐZÑZˆØ	Œ_Ð/Ñ/Ñ/ˆØ�
‰
×Ñ˜Ÿ™ 'Ó*Õ+øði	Úús   È#"S ÓSc           
      ó,  — t        | j                  |dd«      «      }d}t        j                  j	                  |«      s| j                  dd«       y t        j                  |«      }|j                  d|f«      j                  «       }|j                  «        |s| j                  dd«       y |d   |d   |d	   xs d
|d   |d   xs d
dœ}|d   }ddddœj                  ||«      }ddddœj                  |d«      }	dt        j                  |d   d d «      z   dz   }
|
dt        z   dz   z  }
|
dz  }
|
dz  }
|
dt        j                  |d   «      z   d z   z  }
|
d!z  }
|d"   r'|
d#t        |d"   «      z   t!        |d"   «      z   d$z   z  }
n|
d%z  }
|
d&|	z   d'z   |z   d$z   z  }
|
d(t#        |d   «      z   d$z   z  }
|
d)z  }
|
d*t        j                  t%        j&                  d+d,|d-   xs d
«      «      z   d)z   z  }
|
d)t(        z   d.z   z  }
| j                  d/|
«       y )0Nr+   r   rÃ   r˜  ú	Not foundzCSELECT id, title, id_code, source, content FROM tsk_data WHERE id=?r   r›   rž   r   rm   ry  r  r—  r  r  r  r  r  r  r	  r&   z'<html><head><meta charset=utf-8><title>rw   rÍ  ú</title>a  <style>body{font-family:sans-serif;margin:20px;background:#f5f5f5}a{color:#1a73e8}.back{font-size:13px;color:#70757a;margin-bottom:12px;display:block}.card{background:#fff;border-radius:8px;padding:24px;margin-bottom:16px;box-shadow:0 1px 3px rgba(0,0,0,.08);max-width:780px;margin-left:auto;margin-right:auto}.card h1{font-size:22px;margin-bottom:8px}.meta{font-size:13px;color:#70757a;display:flex;gap:12px;margin-bottom:16px}.id_code{color:#c00;font-weight:bold}.src{display:inline-block;padding:2px 8px;border-radius:3px;font-size:11px}.src-p{background:#e8f5e9;color:#2e7d32}.src-c{background:#e3f2fd;color:#1565c0}.src-l{background:#fff3e0;color:#e65100}.content{font-size:14px;line-height:1.8;color:#333;white-space:pre-wrap;word-break:break-word;overflow-x:auto}r  u8   <a class=back href="/originals/">&larr; è¿”å›žåˆ—è¡¨</a>z<div class=card>ú<h1>ú</h1>r  rò   r  r²  r  r  r³  z
<span>ID: r´  z<div class=content>z\n{3,}rÿ  r  rû  r�  )r…  r  rÕ   rÖ   rÜ   rÕ  r   r€   r‚   r1  r„   r   ra  rb  r  rc  re  r�   r   r—   r  )rƒ  r=  rr  r  r‡   r£  r  r  r  r  rg  s              r	   rÏ  z%SearchHandler.handle_originals_detailb  sr  € Ü˜Ÿ™ v¨t°SÓ9Ó:ˆ	Ø+ˆÜ�w‰w�~‰~˜lÔ+Ø×#Ñ# C¨Ô5ØÜ�‰˜|Ó,ˆØ�l‰lÐ`ÐclÐbnÓo×xÑxÓzˆØ�
‰
ŒÙØ×#Ñ# C¨Ô5ØØ�q‘6 C¨¡F°s¸1±v²|ÀÈsÐSTÉvÐbeÐfgÑbhÒbnÐlnÑoˆØˆx‰[ˆØ!¨¸	ÑB×FÑFÀrÈ2ÓNˆØ"¨¸ÑA×EÑEÀbÈ#ÓNˆà5¼¿¹ÀAÀgÁJÈsÐPRÀOÓ8TÑTÐWaÑaˆØ	ð  Rô  Udñ  dð  g~ñ  ~ñ  	~ˆØ	ÐGÑGˆØ	ÐÑˆØ	ˆV”d—k‘k ! G¡*Ó-Ñ-°Ñ7Ñ7ˆØ	ÐÑˆØˆYŠ<ØÐ(Ô+<¸Q¸y¹\Ó+JÑJÜ   9¡Ó.ñ/Ø1:ñ;ñ <‰Að Ð/Ñ/ˆAØ	Ð  6Ñ)¨DÑ0°2Ñ5¸	ÑAÑAˆØ	ˆ\œC  $¡›LÑ(¨9Ñ4Ñ4ˆØ	ˆX‰ˆØ	Ð"¤T§[¡[´·±¸	À6È1ÈYÉ<ÒK]Ð[]Ó1^Ó%_Ñ_ÐbjÑjÑjˆØ	ˆXœÑ'Ð*:Ñ:Ñ:ˆØ×Ñ  QÕ'r   c                 ó‚
  — d}d}t        | j                  |dd«      «      }d}|dz
  |z  }| j                  |dd«      j                  «       }i }t        j                  j                  |«      r*	 t        |«      5 }	t        j                  |	«      }d	d	d	«       g }
d
}d
}|j                  dd
«      }d	}d
}t        j                  j                  |«      �r]t        j                  j                  |«      }	 t        j                  |«      }|j                  d«       |j                  «       }|rmd|z   dz   }|j                  d|||f«      j                  «       d
   }|j                  d||||f«      j                  «       d
   }|j                  d|||||f«       nZ|j                  d«      j                  «       d
   }|j                  d|f«      j                  «       d
   }|j                  d||f«       |j!                  «       D �cg c]  }|d
   |d   |d   |d   dœ‘Œ }
}|j#                  «        d}|dz  }|dz  }|dz  }|dz  }|dz  }|dz  }|dz  }|dz  }|d z  }|d!z  }|d"z  }|d#z  }|d$z  }|d%z  }|d&z  }|d'z  }|d(z  }|d)z  }|d*z  }|d+z  }|d,z  }|d-z  }|d.z  }|d/z  }|d0z  }|d1z  }|d2z  }|d3z  }|d4z  }|d5z  }|d6z  }|d7z  }|d8z  }|d9z  }|d:z  }|d;z  }|r|d<t'        |«      z   d=z   z  }�nÔ|d>z  }|rd?nd@}|dAt'        |«      z   d=z   |z   d=z   z  }|dBt'        |«      z   dCz   z  }|j                  dD«      xs dE}|dF|z   dGz   z  }|dHt'        |dIz  «      z   dJz   z  }|d=z  }|j)                  dKdL«      }|dMz  }|dN|z   dOz   z  }|dPz  }|dQz  }|dRz  }|sdSndT}|dU|z   dVz   z  }|d=z  }|r|dW|z   dXz   t'        |«      z   dYz   z  }|
rí|dZz  }|
D ]Y  }|d[t'        |d\   «      z   d]z   z  }|d^   xs dd	d_ }|d`   xs dd	da }|db|z   d]z   z  }|dc|z   d]z   z  }|dd|de   xs dz   dfz   z  }Œ[ |dgz  }t+        d||z   dz
  |z  «      }|dkD  rx|dhz  }t-        d|dz   «      D ]N  }dit'        |«      z   }|r|dj|z   z  }||k(  r|dkt'        |«      z   dlz   z  }Œ5|dm|z   dOz   t'        |«      z   dVz   z  }ŒP |d=z  }n|r|dnz  }n|doz  }|dpz  }|dqt'        |«      z   z  }|drz  }|dsz  }| j/                  da|«       y	# 1 sw Y   �ŒxxY w#  Y �Œ€xY wc c}w # t$        $ r}t'        |«      }Y d	}~�Œ	d	}~ww xY w)tz)Show temp_search.db contents with search.z/root/temp_search.dbz/root/.temp_sync_state.jsonr7  r´  rt  r›   r«   r   Nr   Úlast_synced_idzPRAGMA busy_timeout=3000r  zVSELECT COUNT(*) FROM gov_raw WHERE title LIKE ? OR site_name LIKE ? OR page_url LIKE ?zcSELECT COUNT(*) FROM gov_raw WHERE id > ? AND (title LIKE ? OR site_name LIKE ? OR page_url LIKE ?)z’SELECT id, site_name, title, publish_date FROM gov_raw WHERE title LIKE ? OR site_name LIKE ? OR page_url LIKE ? ORDER BY id DESC LIMIT ? OFFSET ?úSELECT COUNT(*) FROM gov_rawz)SELECT COUNT(*) FROM gov_raw WHERE id > ?zXSELECT id, site_name, title, publish_date FROM gov_raw ORDER BY id DESC LIMIT ? OFFSET ?rž   rm   )r+   r±  rw   r²  z(<!DOCTYPE html><html lang="zh-CN"><head>zY<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">u,   <title>Temp DB - ä¸´æ—¶æ•°æ�®</title><style>z+*{margin:0;padding:0;box-sizing:border-box}zZbody{font-family:-apple-system,"Microsoft YaHei",sans-serif;background:#f0f2f5;color:#333}z7.container{max-width:1000px;margin:0 auto;padding:20px}zY.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}z(.header h1{font-size:20px;color:#1a1a2e}z?.stats{display:flex;gap:12px;margin-bottom:16px;flex-wrap:wrap}zJ.stat{padding:12px 18px;border-radius:10px;font-size:13px;min-width:120px}z,.stat.blue{background:#e3f0ff;color:#1967d2}z-.stat.green{background:#e6f4ea;color:#137333}z..stat.orange{background:#fef7e0;color:#e37400}z*.stat .num{font-size:20px;font-weight:700}z4.search-bar{display:flex;gap:8px;margin-bottom:16px}zo.search-bar input{flex:1;padding:10px 14px;border:1px solid #dadce0;border-radius:8px;font-size:14px;outline:0}z-.search-bar input:focus{border-color:#1967d2}z.search-bar button{padding:10px 20px;background:#1967d2;color:#fff;border:none;border-radius:8px;cursor:pointer;font-size:14px}z]table{width:100%;border-collapse:collapse;background:#fff;border-radius:10px;overflow:hidden}zTth,td{padding:10px 14px;text-align:left;font-size:13px;border-bottom:1px solid #eee}z1th{background:#f8f9fa;font-weight:600;color:#555}ztr:hover{background:#f8f9ff}zPtd.sn{max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}zPtd.tl{max-width:400px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}zS.paging{display:flex;gap:8px;justify-content:center;flex-wrap:wrap;margin-top:16px}zx.paging a{padding:6px 14px;border:1px solid #dadce0;border-radius:6px;text-decoration:none;color:#1967d2;font-size:13px}z#.paging a:hover{background:#e8f0fe}zv.paging .cur{padding:6px 14px;border:1px solid #1967d2;border-radius:6px;background:#1967d2;color:#fff;font-size:13px}zg.btn{padding:8px 18px;border:none;border-radius:6px;cursor:pointer;font-size:13px;text-decoration:none}z+.btn.primary{background:#1967d2;color:#fff}zA.btn.outline{border:1px solid #dadce0;background:#fff;color:#333}zIcode{background:#f1f3f4;padding:2px 6px;border-radius:4px;font-size:12px}z/.hint{color:#888;font-size:12px;margin-top:4px}r  z<div class=container>u'   <div class=header><h1>ðŸ§Š Temp DB</h1>u8   <a href=/crawler/ class=btn.outline>â†� ä¸»åº“</a></div>z<div class=stat.red>r´  z<div class=stats>u   ç»“æžœu	   æ€»è¡Œæ•°z$<div class=stat.blue><div class=num>z&<div class=stat.orange><div class=num>u   </div>å¾…å�Œæ­¥</div>Ú	last_syncr»  z%<div class=stat.green><div class=num>u   </div>ä¸Šæ¬¡å�Œæ­¥</div>z<div class=stat><div class=num>rÀ  u   KB</div>æ–‡ä»¶å¤§å°�</div>rŽ   r�   z8<form class=search-bar method=get action=/crawler/temp/>uI   <input type=text name=q placeholder=æ�œç´¢æ ‡é¢˜/ç«™ç‚¹/é“¾æŽ¥... value="r³  u/   <button type=submit>ðŸ”� æ�œç´¢</button></form>z3<div style=margin-bottom:12px;display:flex;gap:8px>uB   <a href=/crawler/temp/sync class=btn.primary>ðŸ”„ ç«‹å�³å�Œæ­¥</a>u   ðŸ”„ åˆ·æ–°u   âœ– æ¸…é™¤æ�œç´¢z)<a href=/crawler/temp/ class=btn.outline>rè  u   <div class=hint>æ�œç´¢ "u   ", å…± u    æ�¡ç»“æžœ</div>u^   <table><thead><tr><th>ID</th><th>ç«™ç‚¹</th><th>æ ‡é¢˜</th><th>æ—¥æœŸ</th></tr></thead><tbody>z<tr><td>r+   z</td>r±  rÍ  rw   r�  z<td class=sn>z<td class=tl>z<td>r²  z
</td></tr>z</tbody></table>z<div class=paging>z/crawler/temp/?page=ú&q=z<span class=cur>r²  r›  u1   <div class=stat.green>æœªæ‰¾åˆ°åŒ¹é…�ç»“æžœ</div>u(   <div class=stat.green>æš‚æ— æ•°æ�®</div>z5<div style=margin-top:20px;font-size:12px;color:#888>z-<code>temp_search.db</code> | last_synced_id=u    | æ¯�æ—¥8:00è‡ªåŠ¨å�Œæ­¥</div>ú</div></body></html>)r…  r  r   rÕ   rÖ   rÜ   r  r  rØ  r   rÌ  r   r€   r‚   r.  r1  rÝ   r„   r…   r�   rr   r»  r¤   rÕ  )rƒ  r=  ÚTEMP_DBÚTRACKING_FILEr7  r�  rC  r«   Ú
sync_stater˜  ræ   rD  Ú	temp_sizeÚlast_syncedr§  Ú	un_syncedr‚  rµ   Úliker  rá  rg  r,   Úlast_svrh  Úclear_labelr±  rw   Útotal_pagesr    Úlinks                                  r	   rÞ  zSearchHandler.handle_temp_db…  s5  € à(ˆØ5ˆä�4—>‘> &¨&°#Ó6Ó7ˆØˆØ˜‘(˜cÑ!ˆØ�N‰N˜6 3¨Ó+×1Ñ1Ó3ˆàˆ
Ü�7‰7�>‰>˜-Ô(ðÜ˜-Ó(ð .¨AÜ!%§¡¨1£�J÷.ð
 ˆØˆØˆ	Ø —n‘nÐ%5°qÓ9ˆØˆØˆ	ä�7‰7�>‰>˜'Õ"ÜŸ™Ÿ™¨Ó0ˆIðÜ—_‘_ WÓ-�Ø—
‘
Ð5Ô6Ø—I‘I“K�áØ ™7 S™=�DØŸI™IØpØ˜t TÐ*ó÷ ‘h“j ñ$�Eð !"§	¡	Ø}Ø$ d¨D°$Ð7ó!÷ ‘h“j ñ!$�Ið —I‘Ið mØ˜t T¨3°Ð7õð
 ŸI™IÐ&DÓE×NÑNÓPÐQRÑS�EØ !§	¡	Ð*UÐXcÐWeÓ f× oÑ oÓ qÐrsÑ t�IØ—I‘IØrØ˜f˜ôð
 Z[×YcÑYcÓYeÖfÐTU˜q ™t¨Q¨q©T¸A¸a¹DÈ!ÈAÉ$ÓOÐf�ÐfØ—‘”
ð
 7ˆØ	ÐhÑhˆØ	Ð;Ñ;ˆØ	Ð:Ñ:ˆØ	ÐkÑkˆØ	ÐFÑFˆØ	ÐhÑhˆØ	Ð7Ñ7ˆØ	ÐNÑNˆØ	ÐYÑYˆØ	Ð;Ñ;ˆØ	Ð<Ñ<ˆØ	Ð=Ñ=ˆØ	Ð9Ñ9ˆØ	ÐCÑCˆØ	Ð~Ñ~ˆØ	Ð<Ñ<ˆØ	ð  Oñ  	OˆØ	ÐlÑlˆØ	ÐcÑcˆØ	Ð@Ñ@ˆØ	Ð+Ñ+ˆØ	Ð_Ñ_ˆØ	Ð_Ñ_ˆØ	ÐbÑbˆØ	ð  Hñ  	HˆØ	Ð2Ñ2ˆØ	ð  Fñ  	FˆØ	ÐvÑvˆØ	Ð:Ñ:ˆØ	ÐPÑPˆØ	ÐXÑXˆØ	Ð>Ñ>ˆØ	Ð$Ñ$ˆØ	Ð$Ñ$ˆØ	Ð6Ñ6ˆØ	ÐGÑGˆáØÐ'¬#¨e«*Ñ4°xÑ?Ñ?ŠAàÐ$Ñ$ˆAÙ !‘H {ˆEØÐ7¼#¸e»*ÑDÀxÑOÐRWÑWÐZbÑbÑbˆAØÐ9¼CÀ	»NÑJÐMdÑdÑdˆAØ —n‘n [Ó1Ò:°UˆGØÐ8¸7ÑBÐE_Ñ_Ñ_ˆAØÐ2´S¸ÀdÑ9JÓ5KÑKÐNjÑjÑjˆAØ�‰MˆAð —‘˜3 Ó)ˆBØÐKÑKˆAØÐ]Ð`bÑbÐejÑjÑjˆAØÐBÑBˆAð ÐFÑFˆAØÐUÑUˆAÙ/0™-Ð6HˆKØÐ<¸{ÑJÈVÑSÑSˆAØ�‰MˆAáØÐ/°!Ñ3°iÑ?Ä#ÀeÃ*ÑLÐOaÑaÑa�áØÐuÑu�Øò C�AØ˜¤c¨!¨D©'£lÑ2°WÑ<Ñ<�AØ˜f™IšO¨¨S¨bÐ1�DØ˜w™ZÒ-¨2¨t°Ð4�EØ˜¨4Ñ/°'Ñ9Ñ9�AØ˜¨5Ñ0°7Ñ:Ñ:�AØ˜ 1 V¡9¢?°Ñ3°lÑBÑB‘AðCð Ð'Ñ'�ä! ! e¨c¡k°A¡o¸#Ñ%=Ó>�Ø ’?ØÐ-Ñ-�AÜ" 1 k°A¡oÓ6ò O˜Ø5¼¸A»Ñ>˜ÙØ  E¨A¡IÑ-˜DØ š9ØÐ!3´c¸!³fÑ!<¸yÑ!HÑH™Aà °Ñ!4°uÑ!<¼sÀ1»vÑ!EÈÑ!NÑN™AðOð ˜‘M‘AáØÐLÑL‘AàÐCÑC�Aà	ÐDÑDˆØ	Ð<¼sÀ;Ó?OÑOÑOˆØ	Ð.Ñ.ˆØ	Ð#Ñ#ˆà×Ñ  QÕ'÷g.ñ .ûðÚüòL gøäò Ü˜A›–ûðúsO   Á.T Á9TÂT Ã3DT ÈTÈT ÔTÔ
T ÔTÔT Ô	T>Ô(T9Ô9T>c                 óÂ  — ddl }	  |j                  ddgddd¬«      }|j                  xs d}|j                  xs d}|r|d	|› �z  }|j                  dk7  r|d
|j                  › �z  }| j                  d«       | j                  dd«       | j                  «        | j                  j                  |j                  «       «       y# t
        $ r}d|› �}Y d}~Œpd}~ww xY w)z)Trigger immediate sync from temp to main.r   NÚpython3z/root/sync_temp_to_main.pyTrÎ   ©Úcapture_outputr   r~   r   z	
STDERR: z
Exit code: zError: r�  ru  rv  )Ú
subprocessÚrunÚstdoutÚstderrÚ
returncoder…   r|  r  r€  r�  r‚  ry  )rƒ  r4  r  ÚoutputÚerrrá  s         r	   rß  zSearchHandler.handle_temp_sync)  sÚ   € ãð		#Ø�
—‘ 	Ð+GÐHÐY]ÐdhÐrtÔuˆAØ—X‘X’^ ˆFØ—(‘(’.˜bˆCÙØ˜J s eÐ,Ñ,�Ø�|‰|˜qÒ Ø˜M¨!¯,©,¨Ð8Ñ8�ð 	×Ñ˜3ÔØ×Ñ˜Ð)DÔEØ×ÑÔØ�
‰
×Ñ˜Ÿ™›Õ)øô ò 	#Ø˜q˜c�]�Fûð	#ús   †A#C Ã	CÃCÃCc                 ó  — t        | j                  j                  dd«      «      }|r,| j                  j	                  |«      j                  dd¬«      nd}t        j                  j                  |«      }t        j                  j                  | j                  «      j                  }|dk(  �r|j                  d«      xs dgd   j                  «       }|t        v r´t        t        j                  «       «      }t!        j"                  t$        «      }|j'                  d	||f«       |j)                  «        |j+                  «        | j-                  d
«       | j/                  dd|› d�«       | j/                  dd«       | j1                  «        y | j-                  d
«       | j/                  dd«       | j1                  «        y |dk(  r}dd l}t5        «       }	| j-                  d«       | j/                  dd«       | j1                  «        | j6                  j9                   |j:                  |	d¬«      j=                  «       «       y |dk(  r}dd l}t?        «       }	| j-                  d«       | j/                  dd«       | j1                  «        | j6                  j9                   |j:                  |	d¬«      j=                  «       «       y | j-                  d«       | j1                  «        | j6                  j9                  d«       y )Nrt  r   rt  rr   ©Úerrorsr   r‘  r£  z>INSERT OR REPLACE INTO sessions (token, username) VALUES (?,?)r“  r”  úsession=z; Path=/; Max-Age=2592000r•  r>  z/login?error=1r»  r�  ru  r¼  Frö  r½  r˜  r™  ) r…  rr  r   Úrfiler  rz  rž  rŸ  rÊ  rÉ  rÖ   r   ÚALLOWED_USERSr�   ÚuuidÚuuid4r   r€   r¡  r‚   rƒ   r„   r|  r  r€  r  ræ  r�  r‚  r  ry  rç  )
rƒ  ÚlengthrŠ  r=  rÖ   r£  Útokenr‚  r  r»   s
             r	   Údo_POSTzSearchHandler.do_POST<  sZ  € ä�T—\‘\×%Ñ%Ð&6¸Ó:Ó;ˆáLRˆt�z‰z�‰˜vÓ&×-Ñ-¨g¸iÐ-ÔHÐXZˆä—‘×&Ñ& tÓ,ˆä�|‰|×$Ñ$ T§Y¡YÓ/×4Ñ4ˆà�8ÓàŸ
™
 :Ó.Ò6°2°$¸Ñ:×@Ñ@ÓBˆHàœ=Ñ(äœDŸJ™J›LÓ)�ä—_‘_¤ZÓ0�à—
‘
Ð[Ð^cÐemÐ]nÔoà—	‘	”˜RŸX™XœZà×"Ñ" 3Ô'à× Ñ  °¸%¸Ð@YÐ/ZÔ[à× Ñ  ¨SÔ1à× Ñ Õ"ð ×"Ñ" 3Ô'à× Ñ  Ð-=Ô>à× Ñ Õ"àÐ/Ò/ãä$Ó&ˆFà×Ñ˜sÔ#à×Ñ˜^Ð-NÔOà×ÑÔà�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMàÐ0Ò0ãä)Ó+ˆFà×Ñ˜sÔ#à×Ñ˜^Ð-NÔOà×ÑÔà�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMð ×Ñ˜sÔ# T×%5Ñ%5Ô%7¸¿¹×9IÑ9IÈ&Õ9Qr   c                 ó:   — |j                  ||g«      }|r|d   S |S rc   ©r   )rƒ  r=  r  ÚdefaultÚvalss        r	   r  zSearchHandler.get_param†  s%   € à�z‰z˜$  	Ó*ˆáˆt�A‰wÐ+ GÐ+r   c                 óÖ  — | j                   j                  dd«      }|j                  d«      D ]¤  }|j                  «       }|j	                  d«      sŒ%|dd  }t        j                  t        «      }	 |j                  d|f«      j                  «       }|r#|j                  d|f«       |j                  «        |r|d   nd 	 |j                  «        c S  y # |j                  «        w xY w)	Nrp  r   ú;r>  rÌ   z+SELECT username FROM sessions WHERE token=?zGUPDATE sessions SET last_seen=datetime("now","localtime") WHERE token=?r   )rr  r   r   r   rª   r   r€   r¡  r‚   r1  rƒ   r„   )rƒ  ÚcookieÚpartrD  r‚  r£  s         r	   rË  zSearchHandler._get_session_userŽ  sÍ   € à—‘×!Ñ! (¨BÓ/ˆà—L‘L Ó%ò 	ˆDà—:‘:“<ˆDà�‰˜zÕ*à˜Q˜R˜�ä—_‘_¤ZÓ0�ðàŸ*™*Ð%RÐUZÐT\Ó]×fÑfÓh�CáàŸ
™
Ð#lÐotÐnvÔwàŸ	™	œá%(˜3˜qš6¨dÐ2ð —H‘H—Jð1	ð4 øð —H‘H•Jús   Á2ACÃC(c           	      óì  — | j                   sy | j                  |dd«      }d}|rd}nF|j                  d«      s3|j                  d«      s"|j                  d«      s|j                  d«      rd	}t        j                  t
        «      }	 |j                  d
| j                   |||d d | j                  d   f«       |j                  «        |j                  «        y #  Y ŒxY w# |j                  «        w xY w)Nr«   r   Úviewr   r³  r±  r™  r£  rY  zLINSERT INTO usage_log (username, action, page, query, ip) VALUES (?,?,?,?,?)r�  r   )
r£  r  rª   r   r€   r¡  r‚   Úclient_addressrƒ   r„   )rƒ  rÖ   r=  r«   Úactionr‚  s         r	   rÑ  zSearchHandler._log_usage°  sé   € à�}Š}˜fà�N‰N˜6 3¨Ó+ˆàˆá�x‰fà�_‰_Ð.Ô/°4·?±?ÐCVÔ3WÐ[_×[jÑ[jÐkyÔ[zð  C÷  Nñ  Nð  O_ô  `àˆFä�_‰_œZÓ(ˆð
	à�J‰JÐeàŸ™ v¨t°Q°t¸°W¸d×>QÑ>QÐRSÑ>TÐUôWð �I‰IŒKð —‘•øð 	‘ûà—‘•ús   ÂAC ÃCÃC! Ã!C3c                 ót   — d|v }d}|dz  }|dz  }|r|dz  }|dz  }|dz  }|dz  }| j                  d	|«       y )
Nr§  u«   <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>ç™»å½• - é¡¹ç›®ä¿¡æ�¯æ£€ç´¢</title>a©  <style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,"Microsoft YaHei",sans-serif;background:#f0f2f5;display:flex;justify-content:center;align-items:center;min-height:100vh}.card{background:#fff;border-radius:16px;padding:40px;width:380px;box-shadow:0 4px 24px rgba(0,0,0,.08);text-align:center}h1{font-size:22px;color:#1a1a2e;margin-bottom:8px}.sub{color:#888;font-size:13px;margin-bottom:28px}.inp{width:100%;padding:12px 16px;border:1px solid #ddd;border-radius:10px;font-size:15px;outline:none;transition:border .2s;box-sizing:border-box}.inp:focus{border-color:#4361ee}.btn{width:100%;padding:12px;background:#4361ee;color:#fff;border:none;border-radius:10px;font-size:15px;cursor:pointer;margin-top:16px}.btn:hover{background:#3651d4}.warn{color:#e53935;font-size:13px;margin-top:16px;padding:10px;background:#fff0f0;border-radius:8px}.tip{color:#999;font-size:12px;margin-top:18px}</style></head><body>u]   <div class="card"><h1>ðŸ”� é¡¹ç›®ä¿¡æ�¯æ£€ç´¢</h1><p class="sub">è¯·è¾“å…¥ç”¨æˆ·å��ç™»å½•</p>u9   <div class="warn">ç”¨æˆ·å��æ— æ•ˆï¼Œè¯·é‡�æ–°è¾“å…¥</div>uo   <form method="post" action="/login"><input class="inp" name="username" placeholder="è¾“å…¥ç”¨æˆ·å��" autofocus>u8   <button class="btn" type="submit">ç™»å½•</button></form>uD   <div class="tip">æ•°æ�®æ— ä»· è¯·å‹¿å¤–ä¼ </div></div></body></html>r�  ©rÕ  )rƒ  r=  r§  rg  s       r	   rÌ  zSearchHandler.handle_login_pageÎ  sn   € à˜6Ð!ˆð zˆà	ð  yñ  	yˆà	ÐlÑlˆá�!ÐRÑR�!à	Ð~Ñ~ˆà	ÐGÑGˆà	ÐSÑSˆà×Ñ  QÕ'r   c                 ó  — 	 t        dd«      5 }|j                  «       }d d d «       | j                  d«       | j                  dd«       | j                  dt	        t        «      «      «       | j                  «        | j                  j                  |«       y # 1 sw Y   Œ|xY w# t        $ r]}| j                  d«       | j                  «        | j                  j                  t	        |«      j                  «       «       Y d }~y d }~ww xY w)Nz/root/preview_md.htmlr—  r�  ru  rŽ  rt  r¯  )r  r  r|  r  r�   r]   r€  r�  r‚  r…   ry  )rƒ  r˜  r³  rá  s       r	   rä  zSearchHandler.send_preview_mdä  sÖ   € ð	.äÐ-¨tÓ4ð  ¸à—v‘v“x�÷ ð ×Ñ˜sÔ#à×Ñ˜^Ð,FÔGà×ÑÐ-¬c´#°d³)«nÔ=à×ÑÔà�J‰J×Ñ˜TÕ"÷ ð  ûô ò 	.à×Ñ˜sÔ#à×ÑÔà�J‰J×ÑœS ›VŸ]™]›_×-Ñ-ûð	.ús/   ‚B& ŽBŸA:B& ÂB#ÂB& Â&	DÂ/ADÄDc                 ó
  —  |j                   «       }| j                  |«       | j                  dd«       | j                  dt        t	        |«      «      «       | j                  «        | j                  j                  |«       y )Nru  rŽ  rt  )ry  r|  r  r�   r]   r€  r�  r‚  )rƒ  rç   ra  r›  s       r	   rÕ  z SearchHandler.send_response_html   se   € àˆD�K‰K‹Mˆà×Ñ˜4Ô à×Ñ˜Ð(BÔCà×ÑÐ)¬#¬c°!«f«+Ô6à×ÑÔà�
‰
×Ñ˜Õr   c                 ó,  ‡#‡s‡t‡u‡v‡w‡x‡y— t        | j                  |dd«      «      }| j                  |dd«      j                  «       Šw| j                  |dd«      j                  «       Šx| j                  |dd«      j                  «       Šy| j                  |dd«      Šu| j                  |d	d«      Švd
}dddddœ}|j                  ||«      }d}|dk(  �rÃdg }	}t        j
                  j                  t        «      �r=t        «       }
|
j                  «       }|dz   }|dz
  |z  }g }d}d}g }	 t        t        «      5 }|j                  «       j                  «       }d d d «       rrt        j                  d|«      D �cg c]1  }|j                  «       sŒ|j                  «       j                  «       ‘Œ3 }}|r |}t!        |d«      \  }}t!        |d«      \  }}d}‰x�s‰y�sþd‰wxs dj                  «       v�rçd }‰wr„‰wj#                  d«      sst%        ‰w«      \  }}t'        |«      dk(  rW|sU|d   }t)        |«      rt'        |«      dk\  rd|f}n2t        j*                  dd|«      }dt'        |«      cxk  rdk  rn nd|f}|�r\	 ddg}|d   |d   g}‰ur"‰udk7  rddd d!œ‰u   }|j-                  d"|z  «       t/        d#‰v«      \  } }!| r"|j-                  | «       |j1                  |!«       |rb|j-                  d$d%j3                  d&„ |D «       «      z   d'z   «       |j1                  |D �"�cg c]  }"t5        d«      D ]  }d(|"› d(�‘Œ
 Œ c}}"«       |j7                  d)d*j3                  |«      z   |«       |j9                  «       d   }|dkD  rV|j7                  d+d*j3                  |«      z   d,z   |||gz   «       |j;                  «       D �#cg c]  }#t=        |#«      ‘Œ }$}#|$}	d-}‰w�râ|�sßt%        ‰w«      \  }%}&g }'|%D ]  }(|'j-                  |(«       Œ |&D ]  }(|'j-                  d|(z   «       Œ d*j3                  |'«      })g }*g }+‰xr*|*j-                  d.«       |+j1                  d(‰x› d(�gdz  «       ‰yr*|*j-                  d.«       |+j1                  d(‰y› d(�gdz  «       ‰ur#‰udk7  rddd d!œ‰u   },|*j-                  d/|,› d0�«       t/        d#‰v«      \  }-}.|-r(|*j-                  d$|-z   d'z   «       |+j1                  |.«       |*rd*d*j3                  |*«      z   nd}/|rd*|z   nd}0tC        |«      }1t)        ‰w«      �rAd}2|&sŽtE        d1„ |%D «       «      r|t'        ‰wj                  «       «      dk\  r`	 tG        ‰w«      }3|j7                  d2|/› |0› �|3g|+¢|1¢­«       |j9                  «       d   }|j7                  d3|/› |0› d,�|3g|+¢|1¢|‘|‘­«       d-}2|2�sf	 tI        «       }4|%D ]W  }5t'        |5«      dk\  sŒ|j7                  d4tG        |5«      f«       tI        d5„ |j;                  «       D «       «      }6|4r|4|6z  }4ŒV|6}4ŒY |4r-d6j3                  d7„ tC        |4«      d d8 D «       «      }7d9|7z   d'z   }8nd}8g }9g }:|%D ]9  }(|9j-                  d:«       |:j1                  d(|(z   d(z   d(|(z   d(z   d(|(z   d(z   g«       Œ; |&D ]9  }(|9j-                  d;«       |:j1                  d(|(z   d(z   d(|(z   d(z   d(|(z   d(z   g«       Œ; d*j3                  |9«      };|*r|;d*d*j3                  |*«      z   z  };|:|+z  }:|r
|;|0z  };|:|1z  }:|8r|;|8z  };d}<|%�r|8�stE        d<„ |%D «       «      �rï	 g }=|%D ]q  }5d }>tK        |5«      D ]B  }?|j7                  d=|?f«       tI        d>„ |j;                  «       D «       «      }@|>€@n|>@z  }>|>rŒB n |=j-                  |>xs
 tI        «       «       Œs |=rtI        jL                  |=Ž n	tI        «       }A|A�rU|rŒtI        «       }B|D ]x  }CtK        |C«      xs t'        C«      d?k(  rCgng }Dd }E|DD ]>  }?|j7                  d=|?f«       tI        d@„ |j;                  «       D «       «      }@E€@nE@z  }EŒ@ E€
tI        «       }EBEz  }BŒz ABz  }A|&D ]J  }5tK        |5«      D ]:  }?|j7                  d=|?f«       tI        dA„ |j;                  «       D «       «      }FA|Fz
  }AŒ< ŒL A�ru|%D �(cg c]  }(t'        tK        |(«      «      ‘Œ c}(Šsd*j3                  ˆsfdB„t5        t'        |%«      «      D «       «      }Gg }H|%D ]  }5Hj1                  tK        |5«      «       Œ g }ItO        |«      D ]z  \  Št}CtK        |C«      xs t'        C«      d?k(  rCgng }J|JsŒ)Ij-                  d$d*j3                  ˆtfdC„t5        t'        J«      «      D «       «      z   d'z   «       Hj1                  |J«       Œ| |&D ]I  }5tK        |5«      xs t'        |5«      d?k(  r|5gng D ]$  }?Ij-                  dD«       Hj-                  |?«       Œ& ŒK IrdEd%j3                  I«      z   d'z   }Knd}K|*rd*d*j3                  |*«      z   }Lnd}LdFG› K› L› �}M|j7                  |M|*rH|+z   nH«       |j9                  «       d   }|dkD  r½dGG› K› L› d,�}N|j7                  |N|*rH|+z   nH||gz   «       |j;                  «       D �#cg c]  }#|#d   ‘Œ	 }O}#t'        |O«      |kD  }|rOd | }OOrZd6j3                  dHt'        O«      z  «      }P|j7                  dI|P› d'�|O«       |j;                  «       D �#cg c]  }#t=        |#«      ‘Œ }	}#ng }	d-}<|<�sÿ|j7                  dF|;› �|:«       |j9                  «       d   }|j7                  dJ|;› d,�|:||gz   «       �nº	 tG        |)«      }3|j7                  d2|/› �|3g|+¢­«       |j9                  «       d   }|j7                  d3|/› d,�|3g|+¢|‘|‘­«       �nb‰w�s_g }Sg }T‰xr*Sj-                  dN«       Tj1                  d(‰x› d(�gdz  «       ‰yr*Sj-                  dN«       Tj1                  d(‰y› d(�gdz  «       ‰ur#‰udk7  rddd d!œ‰u   },Sj-                  dO|,› d0�«       t/        d	‰v«      \  }U}V|Ur"Sj-                  U«       Tj1                  V«       |r"Sj-                  |«       Tj1                  |«       SrdPd*j3                  S«      z   nd}W|r*|j7                  dQW› dR�T«       |j9                  «       d   }n(|j7                  dSW› �T«       |j9                  «       d   }|j7                  dTW› dU�T||gz   «       |j;                  «       D �#cg c]  }#t=        |#«      ‘Œ }	}#|r%|	D �#‡#cg c]  Š#tS        ˆ#fdV„|D «       «      sŒ‰#‘Œ }	}#t'        |	«      |kD  }|r|	d | }	|
jY                  «        �n¢|dWk(  �r]dg }	}t        j
                  j                  tZ        «      �rtt?        j\                  tZ        «      }
t>        j^                  |
_0        |
j                  «       }|dz   }|dz
  |z  }‰wr€t%        ‰w«      \  }%}&g }'|%D ]  }(|'j-                  |(«       Œ |&D ]  }(|'j-                  d|(z   «       Œ |'r8d*j3                  |'«      })|dz
  |z  }|j7                  dXtG        |)«      ||f«       ng }	n|dz
  |z  }|j7                  dY||f«       |j;                  «       D �#cg c]  }#t=        |#«      ‘Œ }	}#|
jY                  «        t'        |	«      |kD  }|rE|	d | }	n?|dZk(  rtb        ntd        }X‰w}Y‰xrY|Yrdndz   ‰xz   }Y‰yrY|Yrdndz   ‰yz   }Y XY||‰u«      \  }}	d}ˆuˆvˆwˆxˆyfd[„}Ztf        d\z   }[d]|z   d^z   }\|\d_|[z   d`z   z  }\|\daz  }\|\dbz  }\|\dcz  }\|\ddz  }\deD ]&  \  }]}^}_|]|k(  rdfnd}`\dg^z   dhz   |`z   diz   _z   djz   z  }\Œ( \dkz  }\|\ti        | jj                  «      z  }\|\dkz  }\|\dlz  }\dm|z   dmz   }a|\dn|az   doz   z  }\|\dptm        ‰w«      z   doz   z  }\|\dqz  }\drdsdtdudvœ}bdrdsdtdudvœ}b|\dwz  }\|\dxz  }\|bjo                  «       D ]v  \  }c}d‰u|ck(  rdyndz}e\d{|e› d|�d}j3                  d~„ d‰wfd‰xfd‰yffD «       «      z   cdk7  rdc› �ndz   ‰vr"d€tp        jr                  ju                  ‰v«      › �ndz   doz   dz   djz   z  }\Œx \dkz  }\|\d�z  }\|\d‚z  }\‰vsdyndz}e\d{|e› d|�d}j3                  dƒ„ d‰wfd‰xfd‰yffD «       «      z   ‰udk7  rd‰u› �ndz   d„z   z  }\tv        D ]Y  }f‰v|fd…   k(  rdyndz}e\d{|e› d|�d}j3                  d†„ d‰wfd‰xfd‰yffD «       «      z   ‰udk7  rd‰u› �ndz   d€fd…   › do�z   |fd‡   z   djz   z  }\Œ[ ‰vdˆk(  rdyndz}e\d{|e› d|�d}j3                  d‰„ d‰wfd‰xfd‰yffD «       «      z   ‰udk7  rd‰u› �ndz   dŠz   z  }\|\d‹z  }\|\dŒ|dkD  rd�ty        |«      z   dŽz   ndz   d�z   ty        |«      z   d�z   z  }\|\d‘z  }\tO        |	«      D �]m  \  }gŠ#ty        ‰#j                  d…«      xs( ‰#j                  d’«      xs ‰#j                  d“«      xs d«      }htm        ‰#j                  d”d«      xs* ‰#j                  d•d«      xs ‰#j                  d–d«      xs d«      }i\d—z  }\|\d˜ty        gdz   «      z   d™z   z  }\|\dšz  }\|\d›|z   dœz   hz   doz   |iz   d�z   z  }\|\džz  }\|\dŸtm        ‰#j                  d d«      xs d¡«      z   d™z   z  }\tm        ‰#j                  d¢d«      xs d«      }j|jr\d£jz   d™z   z  }\|dk(  rv‰#j                  d–«      ret{        ‰#j                  d–«      «      \  }k}l|krFt}        k«      \  }m}n|mr6nd¤k(  rd¥nd¦}ond¤k(  rd§nd¨}p\d©o› dª|p› dom› d«tm        ty        k«      «      › d™�	z  }\‰#j                  d¬«      r\d­tm        ‰#d¬   «      z   d™z   z  }\‰#j                  d®«      r\dŸtm        ‰#d®   «      z   d™z   z  }\n(‰#j                  d¯«      r\dŸtm        ‰#d¯   «      z   d™z   z  }\‰#j                  d°«      r<\dŸtm        ‰#d°   «      z   ‰#j                  d±«      rdmtm        ‰#d±   «      z   ndz   d™z   z  }\\dkz  }\|\d‹z  }\�Œp \dkz  }\||kD  r]t        d||z   dz
  |z  «      }qi }r‰wr‰wrd<   ‰xr‰xrd<   ‰yr‰yrd<   ‰udk7  r‰urd<   ‰vr‰vrd	<   \| j�                  |qdm|z   dmz   r||¬²«      z  }\\d³z  }\| jƒ                  d´|\«       y # 1 sw Y   �ŒdxY wc c}w #  Y �ŒýxY wc c}}"w c c}#w # t>        j@                  $ r Y �Œw xY w#  Y �ŒFxY w#  d}8Y �ŒµxY wc c}(w c c}#w c c}#w # tP        $ r d}<Y �
Œ	w xY w# t>        j@                  $ r½ d(‰wz   d(z   }Q|j7                  dK|Q|Q||f«       d}|j;                  «       D �#cg c]  }#t=        |#«      ‘Œ nc c}#w }	}#|r+|	D �#‡#cg c]  Š#tS        ˆ#fdL„|D «       «      sŒ‰#‘Œ nc c}#w }	}#tU        tW        «       «      }R|Rr+|	D �#‡#cg c]  Š#tS        ˆ#fdM„RD «       «      rŒ‰#‘Œ nc c}#w }	}#Y �ŒÚw xY wc c}#w c c}#w c c}#w )µNr7  r´  r«   r   r›  rœ  r¤   rô   r<  rt  õ   ä¸­èƒ½è�”å�ˆr*  ÚEIAõ   EIAé¡¹ç›®åº“)r  r/  r6  r*   r   r6  Fr›   r  r¡  r´   r&   rm   r  r  rø   r  r  úe.etype = ?úe.value = ?rÎ   rù   úv(r.publish_date GLOB '20[0-9][0-9]-[0-9][0-9]-[0-9][0-9]*' AND SUBSTR(r.publish_date,1,10) >= date('now', '-%d days'))rŸ  r±   rz  c              3   ó    K  — | ]  }d –— Œ y­w)r  Nrd   )r^   r  s     r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>g  s   è ø€ ò  =Vð  @AÔ=zñ  =Vùs   ‚r²   r  úJSELECT COUNT(*) FROM gov_entity e JOIN gov_raw r ON r.id = e.doc_id WHERE r  zESELECT r.* FROM gov_entity e JOIN gov_raw r ON r.id = e.doc_id WHERE r  Tz<(r.title LIKE ? OR r.source_url LIKE ? OR r.page_url LIKE ?)rý   rþ   c              3   ó8   K  — | ]  }t        |«      d k\  –— Œ y­wr  rÐ   r  s     r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>§  s   è ø€ Ò*D¸1¬3¨q«6°Q­;Ñ*Dùr  r,  zTSELECT r.* FROM gov_search s JOIN gov_raw r ON s.rowid=r.id WHERE gov_search MATCH ?z@SELECT rowid FROM gov_search WHERE gov_search MATCH ? LIMIT 5000c              3   ó&   K  — | ]	  }|d    –— Œ y­wr  rd   r  s     r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>¸  s   è ø€ Ò2N¸A°1°Qµ4Ñ2Nùr  r	  c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr\   ©r�   )r^   rŸ   s     r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>¾  s   è ø€ Ò7aÀ1¼¸A¿Ñ7aùó   ‚éˆ  z AND r.id IN (z:(r.title LIKE ? OR r.site_name LIKE ? OR r.summary LIKE ?)zH(r.title NOT LIKE ? AND r.site_name NOT LIKE ? AND r.summary NOT LIKE ?)c              3   ól   K  — | ],  }t        |«      d k\  xr t        |«      xr t        |«      –— Œ. y­wr�   r  r  s     r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>Ý  s3   è ø€ Ò+pÐgh¬C°«F°a©KÒ,bÔ<LÈQÓ<OÒ,bÔT_Ð`aÓTbÓ,bÑ+pùr  r  c              3   ó&   K  — | ]	  }|d    –— Œ y­wr  rd   r  s     r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>ä  s   è ø€ Ò4P¸a°Q°qµTÑ4Pùr  rž   c              3   ó&   K  — | ]	  }|d    –— Œ y­wr  rd   r  s     r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>ô  ó   è ø€ Ò<XÀa¸Q¸q½TÑ<Xùr  c              3   ó&   K  — | ]	  }|d    –— Œ y­wr  rd   r  s     r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>þ  rh  r  c              3   ól   •‡K  — | ]*  Šd j                  ˆfd„t        ‰‰   «      D «       «      –— Œ, y­w)r  c              3   óH   •K  — | ]  }d ‰› d|› d‰› d|› d‰› d|› d�–— Œ y­wr  rd   r!  s     €r	   ra   z9SearchHandler.handle_db_list.<locals>.<genexpr>.<genexpr>  su   øè ø€ ò =`ØABð @bÐbcÐadÐdeÐfgÐehÐhpÐqrÐpsÐstÐuvÐtwð  xIð  JKð  ILð  LMð  NOð  MPð  PXô  >Yñ =`ùr#  Nr$  )r^   rŸ   Ú_b_gram_countss    @€r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>  sC   ùè ø€ ò GJð 56ð 18·±ó =`ÜFKÈNÐ[\ÑL]ÓF^ô=`÷ 1`ñGJùr'  c              3   óH   •K  — | ]  }d ‰› d|› d‰› d|› d‰› d|› d�–— Œ y­w)z"EXISTS (SELECT 1 FROM gov_bigram wr  z WHERE wz.rowid=r.id AND wr   Nrd   )r^   r"  Ú_kis     €r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>  sv   øè ø€ ò ZZà<=ð ;]Ð]`Ð\aÐabÐcdÐbeÐemÐnqÐmrÐrsÐtuÐsvð  wHð  ILð  HMð  MNð  OPð  NQð  QYô  9ZñZZùr#  zJNOT EXISTS (SELECT 1 FROM gov_bigram e0 WHERE e0.rowid=r.id AND e0.gram=?)rö   r(  r+  r
  z)SELECT r.* FROM gov_raw r WHERE r.id IN (z,SELECT r.*, "" as rank FROM gov_raw r WHERE z‚SELECT COUNT(*) FROM gov_raw r WHERE (r.title LIKE ? OR r.summary LIKE ?) ORDER BY r.publish_date DESC, r.id DESC LIMIT ? OFFSET ?c              3   ó
  •K  — | ]z  }|‰j                  d d«      xs dj                  «       v xsN |‰j                  dd«      xs dj                  «       v xs& |‰j                  dd«      xs dj                  «       v –— Œ| y­w©rw   r   rœ  r™  N©r   r   ©r^   rZ   r  s     €r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>M  s÷   øè ø€ ò  ?`ð  IK¸rÀaÇeÁeÈGÐTVÓFWÒF]Ð[]×EdÑEdÓEfÐ?fò  @DÐjlÐqr×qvÑqvð  xCð  DFó  rGò  rMð  KM÷  qTñ  qTó  qVð  kVò  @Dð  Z\ð  ab÷  afñ  afð  gqð  rtó  auò  a{ð  y{÷  `Bñ  `Bó  `Dð  ZDó  @Dñ  ?`ùó   ƒB Bc              3   ó^  •K  — | ]¤  }|j                  «       ‰j                  d d«      xs dj                  «       v xsj |j                  «       ‰j                  dd«      xs dj                  «       v xs4 |j                  «       ‰j                  dd«      xs dj                  «       v –— Œ¦ y­wrp  )r   r   )r^   r…  r  s     €r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>S  s¡   øè ø€ ò C3ð )*ð %&§G¡G£I°!·%±%¸ÀÓ2CÒ2IÀr×1PÑ1PÓ1RÐ$Rò %YØ'(§w¡w£y°Q·U±U¸;ÀrÓ5JÒ5PÈb×4WÑ4WÓ4YÐ'Yò%Yà'(§w¡w£y°Q·U±U¸:ÀbÓ5IÒ5OÈR×4VÑ4VÓ4XÐ'Xó%YñC3ùs   ƒB*B-z6(title LIKE ? OR source_url LIKE ? OR page_url LIKE ?)r|  r¢  z,SELECT COUNT(*) FROM (SELECT id FROM gov_rawz0 ORDER BY publish_date DESC, id DESC LIMIT 5001)r!  zSELECT * FROM gov_rawz5 ORDER BY publish_date DESC, id DESC LIMIT ? OFFSET ?c              3   ó
  •K  — | ]z  }|‰j                  d d«      xs dj                  «       v xsN |‰j                  dd«      xs dj                  «       v xs& |‰j                  dd«      xs dj                  «       v –— Œ| y­wrp  rq  rr  s     €r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>Œ  s�   øè ø€ ò 3ð ð ˜qŸu™u W¨RÓ0Ò6°B×=Ñ=Ó?Ð?ò FØ !§%¡%¨°BÓ"7Ò"=¸2×!DÑ!DÓ!FÐFòFà !§%¡%¨
°2Ó"6Ò"<¸"×!CÑ!CÓ!EÐEóFñ3ùrs  r*   zzSELECT p.* FROM projects p JOIN projects_fts f ON p.id = f.rowid WHERE projects_fts MATCH ? ORDER BY rank LIMIT ? OFFSET ?zGSELECT * FROM projects ORDER BY pub_date DESC, id DESC LIMIT ? OFFSET ?r  c                  óô  •— g } ‰r1| j                  dt        j                  j                  ‰«      z   «       ‰r1| j                  dt        j                  j                  ‰«      z   «       ‰r1| j                  dt        j                  j                  ‰«      z   «       ‰dk7  r| j                  d‰z   «       ‰r1| j                  dt        j                  j                  ‰«      z   «       dj	                  | «      S )Núq=úq2=úq3=rô   úrange=z	industry=r‹   ©r   rž  rŸ  r   r   )r!   r;  Úindustry_filterr«   r›  rœ  s    €€€€€r	   Úqp_extraz.SearchHandler.handle_db_list.<locals>.qp_extraç  s¶   ø€ àˆEá�%—,‘,˜t¤F§L¡L×$6Ñ$6°qÓ$9Ñ9Ô:á�5—<‘< ¤f§l¡l×&8Ñ&8¸Ó&<Ñ <Ô=á�5—<‘< ¤f§l¡l×&8Ñ&8¸Ó&<Ñ <Ô=à˜EÒ! 5§<¡<°¸Ñ0BÔ#CÙ §¡¨[¼¿¹×9KÑ9KÈOÓ9\Ñ-\Ô ]à—8‘8˜E“?Ð"r   zA

.result-item .dl{font-size:13px;color:#5f6368;margin-top:2px}

úˆ<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>u    - BJIIRé¡¹ç›®åº“</title>ró  r  ú<div class="container">ú<div class="nav">ú&<a href="/" class="nav-logo">BJIIR</a>ú<div class="nav-links">©r.  r/  ©Úcceupr+  r,  r0  r1  ú class="act"r›  rŽ   r�   rè  r´  ú<div class="search-section">r>  z.<form class="search-box" method="get" action="r³  uV   <input name="q" placeholder="æ�œç´¢é¡¹ç›®ç¼–å�·ã€�å��ç§°ã€�è¡Œä¸šã€�åœ°åŒºâ€¦" value="õ$   <button>æ�œç´¢</button></form></div>õ   å…¨éƒ¨æ—¶é—´õ   è¿‡åŽ»24å°�æ—¶õ   è¿‡åŽ»ä¸€å‘¨õ   è¿‡åŽ»ä¸€ä¸ªæœˆ©rô   rú   rû   rü   z�<div class="search-tools"><div class="date-bar" style="display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:8px">uF   <span style="font-size:13px;color:#333;margin-right:4px">æ—¶é—´</span>údate-chip actú	date-chipú
<a class="z	" href="?r‹   c              3   ó‚   K  — | ]7  \  }}|sŒ	|› d t         j                  j                  t        |«      «      › �–— Œ9 y­w©ru  N©rž  rŸ  r   r�   rQ  s      r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>6  óF   è ø€ ò  9MÑaeÐabÐdeò  KL¸A¸3¸aÄÇÁ×@RÑ@RÔSVÐWXÓSYÓ@ZÐ?[Ô9\ñ  9Mùó   ‚
?�2?ú&range=z
&industry=zV<div style="display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:8px">uF   <span style="font-size:13px;color:#333;margin-right:4px">è¡Œä¸š</span>c              3   ó‚   K  — | ]7  \  }}|sŒ	|› d t         j                  j                  t        |«      «      › �–— Œ9 y­wr’  r“  rQ  s      r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>>  óD   è ø€ ò  5IÑ]aÐ]^Ð`aò  GH¸°s¸!¼F¿L¹L×<NÑ<NÌsÐSTËvÓ<VÐ;WÔ5Xñ  5Iùr•  u   ">å…¨è¡Œä¸š</a>r+   c              3   ó‚   K  — | ]7  \  }}|sŒ	|› d t         j                  j                  t        |«      «      › �–— Œ9 y­wr’  r“  rQ  s      r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>A  r”  r•  rë  rk   c              3   ó‚   K  — | ]7  \  }}|sŒ	|› d t         j                  j                  t        |«      «      › �–— Œ9 y­wr’  r“  rQ  s      r	   ra   z/SearchHandler.handle_db_list.<locals>.<genexpr>D  r˜  r•  u   &industry=other">å…¶ä»–</a>rO  ú<span class="total-count">õ   å…± õ    æ�¡ç»“æžœ Â· õ   ç¬¬ õ    é¡µ</span>z<div class="results">r  Úzidr  r  rw   ú<div class="result-item">ú<span class="num">r²  ú<div style="flex:1">z<h3><a href="/r®  r
  ú<div class="meta">ú<span>r-  õ   æ—¥æœŸæœªçŸ¥rœ  õ   <span class="source">æ�¥æº�ï¼šrâ   úorig-idúorig-id compõ&   originals é¡¹ç›®çº§åŒ¹é…� (Project ID)õ$   originals å…¬å�¸çº§åŒ¹é…� (Plant ID)ú<span class="ú	" title="ú: r9  ú<span class="bdg bdg-crawler">r;  r  r   r"  ©Útotal_itemsr�  ú</div></div></body></html>r�  )Br…  r  r   r   rÕ   rÖ   rÜ   r�   rÂ   r.  r  r  r  r   r   r   r¿  rª   r®   r]   r
   r—   r   r¾  r£   r   r¤   r‚   r1  rÝ   r2  r   r3  r5  rô   r½   r¸   r§   r4  Ú	enumerater…   ru   rÁ  rÂ  r„   ÚEIA_DB_PATHr€   rÀ   rÁ   r�  r•  Ú	CSS_STYLEr¹  r£  r“   r·  rž  rŸ  r   r   r�   rî   ró   r»  ÚpaginaterÕ  )zrƒ  re  r=  r7  r�  r  rw   rD  rL  ræ   r‚  rµ   rB  rC  Ú_include_kw_listÚ_include_cond_rÚ_include_cond_plainÚ_include_paramsÚ_efÚ_include_kwr…  Ú_include_listr  Ú	_ent_doneÚ_epÚ_inc0Ú_exc0Ú_t0Ú_dgÚ_ecÚ_evÚ_daysÚ_if1Ú_ip1rŸ  r  Ú	_ent_rowsr¬   r­   Ú	fts_partsro   Úfts_qÚextra_partsÚextra_paramsr@  Ú_if2Ú_ip2Ú	extra_sqlÚ_include_sql_rÚ_include_all_paramsÚ_fts_okrV  Ú_fts_rowidsrY  Ú_idsÚ_id_listÚ_where_extrar[  r\  Ú
like_whereÚ
_bigram_okÚ_b_setsÚ_g_srš  r¦  Ú_b_idsÚ	_kw_unionÚ_kwÚ	_kw_gramsÚ_kw_sÚ_exc_sÚ_b_ex_condsÚ_b_ex_paramsÚ_b_wl_condsÚ_b_kw_gramsÚ	_b_wl_sqlÚ_b_extra_joinÚ_b_count_sqlÚ_b_limit_sqlÚ_b_page_idsÚ_b_phrn  Ú_blkr>  Ú
sql_paramsÚ_if3Ú_ip3Ú	where_sqlÚ	search_fnÚ
combined_qr}  ÚCSSrg  Únav_idÚ	href_pathÚ	nav_labelÚactÚmain_form_actionÚsel_optsÚdvÚdlÚ_clsÚ_indÚidxri  r  ÚsnÚ_oidÚ_olevelÚ_olblÚ_otypeÚ_oclsÚ_otipr.  Ú
pag_paramsrl  rn  r;  r|  r«   r›  rœ  sz                                      `                                                                               @@@@@@@r	   rÓ  zSearchHandler.handle_db_list  s'  ÿ€ ä�4—>‘> &¨&°#Ó6Ó7ˆà�N‰N˜6 3¨Ó+×1Ñ1Ó3ˆà�^‰^˜F D¨"Ó-×3Ñ3Ó5ˆà�^‰^˜F D¨"Ó-×3Ñ3Ó5ˆà—N‘N 6¨7°EÓ:ˆ	ØŸ.™.¨°¸RÓ@ˆð ˆà&Ð,=ÈÐTbÑcˆà—	‘	˜' 7Ó+ˆàˆà�iÓà" B�dˆHä�w‰w�~‰~œgÕ&ä“X�à—I‘I“K�à  1™W�
à˜q™& #™�ð $&Ð Ø"$�Ø&(Ð#Ø"$�ðÜÔ0Ó1ð 9°SØ&)§h¡h£j×&6Ñ&6Ó&8˜÷9á"äDFÇHÁHÈ\Ð[fÓDgÖ(u¸qÐkl×krÑkrÕkt¨¯©«¯©Õ):Ð(u˜Ð(uÙ(Ø/<Ð,ä?SÐTaÐcgÓ?hÑ<˜O¨_Ü5IÈ-ÐY[Ó5\Ñ2Ð/°ð "�	Ú¢"¨°Q²W¸"·O±OÓ4EÒ)EØ�CÙ §¡¨cÔ!2Ü'9¸!Ó'<™˜˜uÜ˜u›:¨š?±5Ø"'¨¡(˜CÜ/°Ô4¼¸S»ÀQºØ'0°#Ð&6¡ä&(§f¡f¨U°B¸Ó&< Ø#$¬¨C«Ô#6°BÕ#6Ø+2°C¨. CÚð!Ø#0°-Ð"@˜CØ#& q¡6¨3¨q©6Ð"2˜CÙ(¨Y¸%Ò-?Ø/0¸À"Ñ(EÀiÑ(P Ø #§
¡
ð  ,dð  glñ  ,lô  !mÜ)7¸ÀoÓ)V™J˜D $Ù#Ø #§
¡
¨4Ô 0Ø #§
¡
¨4Ô 0Ù/Ø #§
¡
¨3°·±ñ  =Vð  EUô  =Vó  2Vñ  ,Vð  Y\ñ  ,\ô  !]Ø #§
¡
Ð@P×+c¸"ÔZ_Ð`aÓZbÒ+cÐUV¨a°¨t°1ªIÐ+c¨IÓ+cÔ dØŸI™IÐ&rÐu|÷  vBñ  vBð  CFó  vGñ  'Gð  ILô  MØ$%§J¡J£L°¡O˜EØ$ qšyØ !§	¡	Ð*qÐt{÷  uAñ  uAð  BEó  uFñ  +Fð  IDñ  +Dð  FIð  MWð  Y_ð  L`ñ  F`ô  !aØ>?¿j¹j»lÖ,K¸¬T°!­WÐ,K 	Ð,KØ'0 Ø,0 	ò šYä1°!Ó4‘H�C˜à "�Ià ò ,˜à!×(Ñ(¨Õ+ð,ð !ò 2˜à!×(Ñ(¨¨q©Õ1ð2ð $ŸL™L¨Ó3�Eà"$�Kà#%�Láà#×*Ñ*Ð+iÔjà$×+Ñ+¨q°°°A¨Y¨K¸©MÔ:áà#×*Ñ*Ð+iÔjà$×+Ñ+¨q°°°A¨Y¨K¸©MÔ:á  Y°%Ò%7à%&¨A°BÑ7¸	ÑB˜à#×*Ñ*ð  .Zð  [_ð  Z`ð  `hð  ,iô  jä!/°¸oÓ!N‘J�D˜$ÙØ#×*Ñ*¨3°©:¸Ñ+;Ô<Ø$×+Ñ+¨DÔ1ñ HS ¨'¯,©,°{Ó*CÒ CÐXZ�IÙDS g°Ò&?ÐY[�NÜ*.¨Ó*?Ð'ô
 (¨Õ*Ø"'˜Ù"¤sÑ*DÀÔ*DÔ'DÌÈQÏWÉWËYËÐ[\ÒI\ð%Ü);¸AÓ)> Ø !§	¡	ð  -Fð  GPð  FQð  R`ð  Qað  +bð  ekð  dQð  nzð  dQð  }Pñ  dQô  !RØ()¯
©
«°Q© Ø !§	¡	ð  -Að  BKð  ALð  M[ð  L\ð  \Uð  +Vð  Y_ð  XYð  bnð  XYð  qDð  XYð  FPð  XYð  RXñ  XYô  !ZØ*. ò  'ð2Ü.1«e Ø*-ò !? BÜ'*¨2£w°!£|Ø()¯	©	Ð2tô  xJð  KMó  xNð  wPô  )QÜ/2Ñ2NÀÇÁÃÔ2NÓ/N¨Ù+6Ø:EÈÑ:L©Kà:>©Kð!?ñ $/Ø/2¯x©xÑ7aÌÈ[ÓHYÐZ_Ð[_ÐH`Ô7aÓ/a HØ3CÀhÑ3NÐQTÑ3T¡Là35 Lð
 *,˜JØ*,˜KØ%(ò b Ø *× 1Ñ 1Ð2nÔ oØ +× 2Ñ 2°C¸!±G¸c±MÀ3ÈÁ7ÈSÁ=ÐRUÐXYÑRYÐ\_ÑR_Ð3`Õ aðbð &)ò b Ø *× 1Ñ 1Ð2|Ô }Ø +× 2Ñ 2°C¸!±G¸c±MÀ3ÈÁ7ÈSÁ=ÐRUÐXYÑRYÐ\_ÑR_Ð3`Õ aðbð *1¯©°jÓ)A˜JÙ*Ø *¨g¸¿¹À[Ó8QÑ.QÑ Q 
Ø +¨|Ñ ; Ù.Ø *¨nÑ < 
Ø +Ð/BÑ B Ù+Ø *¨lÑ : 
ð */˜Jâ #ªLÜ(+Ñ+pÐloÔ+pÕ(pðV!7Ø.0 GØ.1ò %F¨Ø/3¨Ü2=¸b³/ò )6¨BØ,-¯I©IÐ6cÐfhÐejÔ,kÜ14Ñ4PÀ1Ç:Á:Ã<Ô4PÓ1P¨BØ9=¸±2ÈDÐSUÉI¨DÚ37Ù05ð)6ð )0¯©°t²}¼s»uÕ(Eð%Fñ LS¬S×-=Ñ-=¸wÑ-GÔX[ÓX] FÚ'-ñ ,<Ü8;»¨IØ7Gò 	-C°Ü<GÈÓ<LÒ<pÔZ]Ð^aÓZbÐfgÒZgÐRUÑQVÐmo°	Ø8<°Ø:Cò 1b°BØ45·I±IÐ>kÐnpÐmrÔ4sÜ9<Ñ<XÈ1Ï:É:Ë<Ô<XÓ9X°BØBGÀ-¹BÐV[Ð^`ÑV`±Eð1bð 49°=Ü<?»E°EØ09¸UÑ0B±	ð	-Cð 6<¸iÑ5G¨Fà25ò )I¨BÜ6AÀ"³oò -I°Ø01·	±	Ð:gÐjlÐinÔ0oÜ9<Ñ<XÈ1Ï:É:Ë<Ô<XÓ9X°Ø9?À&¹±ñ-Ið)Iò
 ,2ð \_Ö=_ÐVW¼cÄ+ÈaÃ.Õ>QÒ=_¨NØ:A¿,¹,ó GJô :?¼sÀ3»x»ôGJó ;J¨Kð <>¨LØ69ò -U°Ø0<×0CÑ0CÄKÐPRÃOÕ0Tð-Uð ;=¨KÜ<EÐFVÓ<Wò -U±°°SÜ>IÈ#Ó>NÒ>rÔ\_Ð`cÓ\dÐhiÒ\iÐTWÑSXÐoq°Ú3>Ø4?×4FÑ4FÀsÈWÏ\É\ó ZZäAFÄsÈ;ÓGWÓAXôZZó NZñ HZà\_ñH`ô 5að 5A×4GÑ4GÈÕ4Tð-Uð 7:ò -L°Ü;FÀr»?Ò;lÔWZÐ[]ÓW^ÐbcÒWcÐPRÉtÐikò 1L°BØ4?×4FÑ4Fð  HTô  5UØ4@×4GÑ4GÈÕ4Kñ1Lð-Lñ 0;Ø<DÀvÇ{Á{ÐS^ÓG_Ñ<_ÐbeÑ<e±	à<>°	á/:Ø@GÈ'Ï,É,ÐWbÓJcÑ@c±à@B°Ø=bÐcnÐboÐpyÐozð  |Ið  {Jð  <K¨LØ,-¯I©I°lÑcnÀLÐS_ÒD_ð  uAô  -BØ45·J±J³LÀ±O¨EØ/4°qªyØAbÐcnÐboÐpyÐozð  |Ið  {Jð  JCð  @D°Ø01·	±	¸,ÑhsÈÐXdÒIdð  zFð  KUð  W]ð  J^ñ  I^ô  1_ØMNÏZÉZË\Ö>ZÈ¸qÀ»tÐ>Z°Ð>ZÜ;>¸{Ó;KÈcÑ;Q°Ù3;ØBMÈdÈsÐBS°KÙ3>Ø<?¿H¹HÀSÌ3È{ÓK[ÑE[Ó<\°EØ45·I±IÐ@iÐjoÐipÐpqÐ>rÐtô  5AØMNÏZÉZË\Ö;ZÈ¼DÀ½GÐ;Z°DÑ;Zà;=°DØ=A°
ò $.Ø !§	¡	Ð,QÐR\ÐQ]Ð*^Ð`kÔ lØ()¯
©
«°Q© Ø !§	¡	Ð,XÐYcÐXdð  e^ð  +_ð  alð  pzð  |Bð  oCñ  aCö  !Dð4ä%7¸Ó%>˜FØŸI™Ið  )Bð  CLð  BMð  'Nð  QWð  Pgð  Zfñ  Pgô  hØ$%§J¡J£L°¡O˜EØŸI™IÐ(|ð  ~Gð  }Hð  HAð  'Bð  EKð  Doð  NZð  Doð  \fð  Doð  hnñ  Doö  pò2 ð #%�Kà!#�Jáà#×*Ñ*Ð+cÔdà"×)Ñ)¨Q¨r¨d°!¨9¨+°a©-Ô8áà#×*Ñ*Ð+cÔdà"×)Ñ)¨Q¨r¨d°!¨9¨+°a©-Ô8á  Y°%Ò%7à%&¨A°BÑ7¸	ÑB˜à#×*Ñ*ð  .Vð  W[ð  V\ð  \dð  ,eô  fä!/°
¸OÓ!L‘J�D˜$ÙØ#×*Ñ*¨4Ô0Ø"×)Ñ)¨$Ô/á*Ø#×*Ñ*Ð+>Ô?Ø"×)Ñ)¨/Ô:ÙIT 	¨G¯L©L¸Ó,EÒ EÐZ\�Iñ
 (ØŸ	™	Ð$PÐQZÐP[ð  \Lð  #Mð  OYô  ZØ !§
¡
£¨Q¡™àŸ	™	Ð$@ÀÀÐ"LÈjÔYØ !§
¡
£¨Q¡˜Ø—I‘IÐ 5°i°[Ð@uÐvð  yCð  GQð  SYð  FZñ  yZô  [à)*¯©«Ö6 Aœ˜Q�Ð6�Ð6ñ $Ø'+÷  !¬só 3ð #3ô	3õ 0šAð �Dð ô ˜t›9 s™?�áà  ˜:�Dà—‘–
à˜Óà" B�dˆHä�w‰w�~‰~œkÕ*ä—_‘_¤[Ó1�ÄGÇKÁK°2´>à—I‘I“K�à  1™W�
à˜q™& #™�áä1°!Ó4‘H�C˜à "�Ià ò ,˜à!×(Ñ(¨Õ+ð,ð !ò 2˜à!×(Ñ(¨¨q©Õ1ð2ñ !à '§¡¨YÓ 7˜à"& q¡&¨#¡˜àŸ	™	ð  #_ô  btð  uzó  b{ð  }Gð  IOð  aPõ  Qð  "™ð # 1™f c™\�Fà—I‘IÐgÐjtÐv|Ði}Ô~à)*¯©«Ö6 Aœ˜Q�Ð6�Ð6¸¿¹¼
ä˜t›9 s™?�áà  ˜:‘Dð (/°&Ò'8�¼iˆIàˆJá 
±Z©cÀRÑ HÈ2Ñ M�:á 
±Z©cÀRÑ HÈ2Ñ M�:á# J°°c¸9ÓE‰KˆE�4ð ˆH÷	#ð 	#ô" ð ñ ˆð Wð  X]ñ  ]ð  ^yñ  yˆà	ˆY˜‰_Ð6Ñ6Ñ6ˆà	Ð&Ñ&ˆð 	
Ð Ñ ˆà	Ð5Ñ5ˆà	Ð&Ñ&ˆð -jò 	DÑ(ˆF�I˜yà$*¨gÒ$5‘.¸2ˆCà�˜YÑ& sÑ*¨3Ñ.¨sÑ2°9Ñ<¸VÑCÑC‰Að		Dð 	
ˆX‰ˆà	Œ^˜DŸM™MÓ*Ñ*ˆà	ˆX‰ˆð 	
Ð+Ñ+ˆà˜w™; s™?Ðà	Ð=Ð>NÑNÈtÑSÑSˆà	ð  Vô  WZð  [\ó  W]ñ  ]ð  ^bñ  bñ  	bˆà	Ð9Ñ9ˆð 6Ð=YÐa{ð  Eeñ  fˆð 6Ð=YÐa{ð  Eeñ  fˆð 	
ð  Qñ  	QˆØ	ÐUÑUˆØ—n‘nÓ&ò 	^‰FˆB�Ø&/°2¢o‘?¸;ˆDØ�:˜d˜V 9Ð-°·±ñ  9MÐknÐopÐjqÐswÐxzÐr{ð  ~Bð  CEð  }Fð  jGô  9Mó  1Mñ  Mð  ceð  inò  cnð  SZð  []ð  Z^ñ  Q_ð  tvñ  wñ  q@ð  }Gô  HN÷  HTñ  HT÷  HZñ  HZð  [jó  Hkð  Glñ  {mð  FHñ  Ið  LPñ  Pð  SUñ  Uð  X^ñ  ^ñ  ^‰Að	^ð 	
ˆX‰ˆð 	
ÐeÑeˆØ	ÐUÑUˆá&5‰¸;ˆØ	ˆz˜$˜˜yÐ)¨C¯H©Hñ  5IÐgjÐklÐfmÐosÐtvÐnwÐy}ð  Að  yBð  fCô  5Ió  -Iñ  Ið  foð  sxò  fxð  OVð  W`ð  Vañ  Mbð  ~@ñ  Að  DUñ  Uñ  	UˆÜò 	yˆDØ&5¸¸d¹Ò&C‘?ÈˆDØ�:˜d˜V 9Ð-°·±ñ  9MÐknÐopÐjqÐswÐxzÐr{ð  ~Bð  CEð  }Fð  jGô  9Mó  1Mñ  Mð  jsð  w|ò  j|ð  SZð  [dð  Zeñ  Qfð  BDñ  Eð  JTð  UYð  Z^ñ  U_ð  T`ð  `bð  Hcñ  cð  fjð  koñ  fpñ  pð  syñ  yñ  y‰Að	yð #2°WÒ"<‰À+ˆØ	ˆz˜$˜˜yÐ)¨C¯H©Hñ  5IÐgjÐklÐfmÐosÐtvÐnwÐy}ð  Að  yBð  fCô  5Ió  -Iñ  Ið  foð  sxò  fxð  OVð  W`ð  Vañ  Mbð  ~@ñ  Að  Dañ  añ  	aˆØ	ˆ^Ñˆð 	
Ð)ÐglÐopÒgp¨Y¼¸U»Ñ-CÐFcÒ-cÐvxÑyð  }Fñ  Fô  GJð  KOó  GPñ  Pð  Qañ  añ  	aˆð
 	
Ð$Ñ$ˆä “oó )	 ‰FˆC�ä�a—e‘e˜D“kÒN Q§U¡U¨<Ó%8ÒN¸A¿E¹EÀ%»LÒNÈBÓOˆCä�q—u‘u˜^¨BÓ/Òg°1·5±5¸ÈÓ3LÒgÐPQ×PUÑPUÐV]Ð^`ÓPaÒgÐegÓhˆDàÐ,Ñ,ˆAàÐ%¬¨C°©E«
Ñ2°YÑ>Ñ>ˆAàÐ'Ñ'ˆAàÐ! GÑ+¨kÑ9¸CÑ?À$ÑFÈÑMÐP[Ñ[Ñ[ˆAàÐ%Ñ%ˆAà�œC §¡ n°bÓ 9Ò K¸^ÓLÑLÈyÑXÑXˆAÜ�Q—U‘U˜;¨Ó+Ò1¨rÓ2ˆBÙØÐ5¸Ñ:¸YÑFÑF�à˜)Ò#¨¯©¨g¬Ü 1°!·%±%¸³.Ó A‘��gÙÜ$2°4Ó$8‘M�E˜6ÙØ-3°vÒ-=¡	À>˜ØLRÐV\ÒL\Ñ Hð  cI˜Ø˜}¨U¨G°9¸U¸GÀ2ÀeÀWÈBÌsÔSVÐW[ÓS\Ë~ÐN^Ð^eÐfÑf˜à�u‰u�WŒ~˜qÐ$DÄSÈÈ7ÉÃ_Ñ$TÐU^Ñ$^Ñ^˜qà�u‰uÐ'Ô(¨!¨x¼¸AÐ>PÑ<QÓ8RÑ/RÐS\Ñ/\Ñ*\©!à—‘�x” ! x´°A°h±KÓ0@Ñ'@ÀÑ'JÑ"J !à�u‰u�ZÔ  ! x´°A°j±MÓ0BÑ'BÐZ[×Z_ÑZ_Ð`fÔZgÀCÌÈAÈfÉIËÒDVÐmoÑ'pÐqzÑ'zÑ"z !à�‰MˆAð �ÑŠAðS)	 ðZ 	
ˆX‰ˆà�3Š;Ü˜a %¨#¡+°¡/°cÑ!9Ó:ˆKØˆJÙ A�*˜S‘/Ù b�:˜dÑ#Ù b�:˜dÑ#Ø˜EÒ!¸ :¨gÑ#6Ù¸ 
¨:Ñ 6Ø�—‘˜t [°#°g±+¸c±/À:Ð[`Ðfi�ÓjÑjˆAà	Ð)Ñ)ˆà×Ñ  QÕ'÷]9ñ 9üò )vøðÚüó< ,dùò
 -Løô  '×7Ñ7ò !Ú ð!ûð|%Ú $ûð(2Ø/1£üò~ >`ùòJ ?[ùò <[øô (1ò !7Ø16£Jð!7ûô  '×7Ñ7ò 4ð &)¨1¡W¨s¡]˜FàŸI™Ið  'kð  ntð  v|ð  ~Hð  JPð  mQô  RØ$%˜EØ56·Z±Z³\Ö#B°¤D¨¥GÑ#BùÒ#B˜DÐ#Bá/Ø37÷  (a¨a¼3ó  ?`ð  O_ô  ?`õ  <`ªñ  (aùò  (a ð  (aô $-¬^Ó-=Ó#>˜DÙ#Ø37÷ (4¨a¼só C3ð .2ô	C3õ @3ªñ (4ùò (4 ð (4úð#4üòL 7ùòùòB 7sw  Ä)AS Ä8AR9Å"AS Å9ASÆ ASÆ/$AS É>B$AS Ì"AS
Ì?BAS ÏASÏAS ÕAAS8 Ö;AT  ×A9AT  Ü0AAT ÞD'AT â-AT
ãBAT åEAT êATê'AAT ìATìAT í'AAT+ ô2AW>õAXõ'AXú=AXÁR9ASÁR>AS ÁSASÁSAS ÁSAS5ÁS4AS5ÁS8AS=ÁT ATÁT
AT ÁTAT(ÁT'AT(ÁT+AAW;ÁU0AVÁVAW;ÁVAV0ÁV+AV0ÁV/"AW;ÁWAW0ÁW+AW0ÁW/AW;ÁW:AW;c           	      óŒ  — |j                  d«      d   }t        | dd«      }	 t        j                  j	                  t        j                  j                  | j                  xs d«      j                  «      }|r|j                  d«      xs dgd   dk(  rt        ||t        | d	d
«      «       g }d}|r¤	 t        j                  t        «      }t        j                  |_        |j!                  d|t#        |«      f«      }	|	j%                  «       d   }|j!                  d|t#        |«      f«      }
|
D �cg c]  }t'        |«      ‘Œ }}|j)                  «        |dk(  rt+        |«      }ddi}n»|dk(  r˜d }t,        j                  j/                  t0        «      rat        j                  t0        «      }t        j                  |_        |j!                  d|f«      }	|	j%                  «       }|j)                  «        ddi}|r*t'        |«      }n|dk(  rt2        nt4        }dddœ} ||«      }|s| j7                  dd«       y t9        |j                  d«      xs% |j                  d«      xs |j                  ||«      «      }t        | dd«      xs d| j                  xs dv xs d|xs dv }t        | d	d«      xs d}d}|s?d|z   dz   }|dt:        z   t<        z   dz   z  }|dz  }|d |z   d!z   z  }|t?        |«      d"z   z  }|tA        ||||«      z  }|s|d#z  }| j7                  d$|«       y # t        $ r i }Y �Œ¾w xY wc c}w #  Y �ŒìxY w)%Nr>  rÆ   r×  Fr   rO  r   r´  r£  r¢  r¦  z€SELECT DISTINCT username, visited_at FROM project_visits WHERE project_type=? AND project_id=? ORDER BY visited_at DESC LIMIT 20r6  rX  r*   z!SELECT * FROM projects WHERE id=?rY  r  rW  r*  )r  r/  r˜  z&<html><body><h1>404</h1></body></html>r  rw   zfrag=1rò  r  ró  r  z<div class="wrap">z)<div class="bk-bar"><a class="bk" href="/u=   /" onclick="history.back();return false">â†� è¿”å›žåˆ—è¡¨</a>r´  r$  r�  )!r   rÒ  rž  rŸ  rÊ  rÉ  rÖ   r6  r…   r   r¤  r   r€   r¡  rÀ   rÁ   r‚   r�   r1  r2  r„   rŸ  rÕ   rÜ   r´  r‘  r—  rÕ  r“   ÚPAGE_SHELL_CSSr  r¹  rm  )rƒ  re  rÖ   ri  Ú_is_fragÚ_qpÚpv_all_visitorsrf  Údbtrµ   Úc2r  r    r  r‚  Ú	detail_fnrw   Ú_fragÚ_unamerg  s                       r	   rÔ  zSearchHandler.handle_db_detail‘  sD  € ð �j‰j˜‹o˜bÑ!ˆô ˜4 °Ó7ˆð	Ü—,‘,×'Ñ'¬¯©×(=Ñ(=¸d¿i¹iºoÈ2Ó(N×(TÑ(TÓUˆCñ ˜cŸg™g f›oÒ5°"°°qÑ9¸SÒ@Ü  ¨#¬w°t¸ZÈÓ/UÔVàˆàˆáðä—o‘o¤jÓ1�ä")§+¡+�”à—K‘KÐ kà!(¬#¨c«(Ð 3ó5�ð Ÿ:™:›<¨™?�à—[‘[ð  "dà")¬3¨s«8Ð!4ó6�ð 57Ö"7¨q¤4¨¥7Ð"7�Ð"7à—	‘	”ð �iÒä˜sÓ#ˆAà˜uÐ%‰Eà˜ÒàˆAä�w‰w�~‰~œkÔ*ä—_‘_¤[Ó1�ÄGÇKÁK°2´>à—J‘JÐBÀSÀFÓK�à—J‘J“L�à—‘”
à˜>Ð*ˆEá”d˜1“g‘!ð (/°&Ò'8�¼iˆIà*Ð0AÑBˆEá˜#“ˆAáà×#Ñ# CÐ)QÔRÐTZô
 �A—E‘E˜.Ó)ÒZ¨Q¯U©U°7«^ÒZ¸u¿y¹yÈÐRYÓ?ZÓ[ˆô ˜˜n¨eÓ4Òu¸ÀdÇiÁiÂoÐSUÐ9VÒuÐ\dÐimÒisÐqsÐ\tˆÜ˜˜z¨2Ó.Ò4°"ˆØˆÙðà"ñ#à%/ñ0ˆAð �œ^Ñ+¬jÑ8Ð;RÑRÑRˆAØÐ%Ñ%ˆAØÐ<¸wÑFð  JIñ  Iñ  IˆAØ” Ó'¨(Ñ2Ñ2ˆAØ	Ô'¨°°H¸fÓEÑEˆÙØÐ'Ñ'ˆAà×Ñ  QÕ'øô} ò 	Ø‹Cð	üò6 #8øðâús1   £AL' Â4A?L> Ä3L9ÅL> Ì'L6Ì5L6Ì9L> Ì>MNc           	      ó´  ‡‡‡— ‰dk  ryˆˆfd„}t         dz   }d|‰fz  }	|r+|xs d}
|dz
  |
z  dz   }t        ||
z  |«      }|	d|||fz  z  }	|d|	z   d	z   z  }|dkD  r|d
 ||dz
  «      › d�z  }d‰h}‰dkD  r|j                  ‰dz
  «       t        |dz
  |dz   «      D ]"  }d|cxk  r‰k  sŒn Œ|j                  |«       Œ$ t	        ˆfd„|D «       «      }d}|D ]/  }||z
  dkD  r|dz  }||k(  rdnd}|d
 ||«      › d|› d|› d�z  }|}Œ1 |‰k  r|d
 ||dz   «      › d�z  } |d«      }|j                  dd«      d   dz   }|d‰› d|› d|› d�z  }|dz  }|S )u  åˆ†é¡µæ�¡ï¼ˆ2026-09-10 è§†è§‰é‡�å�šï¼šç™½è‰²å�¡ç‰‡ + åº•éƒ¨ç•™ç™½ + é¡µç �ä¿¡æ�¯ï¼‰ã€‚

        params: æŸ¥è¯¢å�‚æ•°å­—å…¸ï¼ˆä¸�å�« pageï¼‰
        total_items: å�¯é€‰ï¼Œæ€»æ�¡æ•°ï¼ˆæ˜¾ç¤ºã€Œæ˜¾ç¤º X-Y Â· å…± N æ�¡ã€�ï¼‰
        per: å�¯é€‰ï¼Œæ¯�é¡µæ�¡æ•°
        r›   r   c                 óŠ   •— i ‰¥dt        | «      i¥}dj                  d„ |j                  «       D «       «      }|r‰dz   |z   S ‰S )Nr7  r‹   c              3   ó‚   K  — | ]7  \  }}|sŒ	|› d t         j                  j                  t        |«      «      › �–— Œ9 y­wr’  r“  rQ  s      r	   ra   z6SearchHandler.paginate.<locals>.url.<locals>.<genexpr>  s6   è ø€ ÒbÁ$À!ÀQÒ`a˜Q˜C˜q¤§¡×!3Ñ!3´C¸³FÓ!;Ð <Ô=Ñbùr•  r
  )r�   r   r·  )r    Ú
all_paramsrh  Úbase_urlr=  s      €€r	   r›  z#SearchHandler.paginate.<locals>.url  sK   ø€ Ø3˜FÐ3 F¬C°«FÑ3ˆJØ—‘ÑbÈ*×JZÑJZÓJ\ÔbÓbˆBÙ*,�8˜c‘> BÑ&Ð:°(Ð:r   ú<div class="pagination">u   ç¬¬ <b>%d</b> / %d é¡µr|   u    Â· æ˜¾ç¤º %d-%d Â· å…± %d æ�¡z<span class="page-info">r²  r›  u$   " class="page-btn">â€¹ ä¸Šä¸€é¡µ</a>rž   c              3   ó@   •K  — | ]  }d |cxk  r‰k  sŒn n|–— Œ y­w)r›   Nrd   )r^   r    r.  s     €r	   ra   z)SearchHandler.paginate.<locals>.<genexpr>"  s   øè ø€ ÒL A°a¸1Ô6KÀÖ6KœaÑLùrï  r   õ&   <span class="page-ellipsis">â€¦</span>ú activez" class="page-btnr³  rè  u$   " class="page-btn">ä¸‹ä¸€é¡µ â€º</a>zpage=z:<span class="page-jump"><input type="number" min="1" max="rõ  z" onchange="location.href='u   '+this.value"> é¡µ</span>r´  )Ú	PAGER_CSSr¼  rß   r¤   rœ  r„  )rƒ  r7  r.  r  r=  r±  r�  r›  ra  Ú_infoÚ_psÚ_fromÚ_toÚ	pages_setrŸ   Úsorted_pagesÚlastr    ÚactiveÚjump_urlÚ	jump_bases     ```                r	   r¶  zSearchHandler.paginate  s  ú€ ð ˜!ÒØõ	;ô
 Ð5Ñ5ˆØ(¨D°+Ð+>Ñ>ˆÙØ’)˜ˆCØ˜A‘X Ñ$ qÑ(ˆEÜ�d˜S‘j +Ó.ˆCØÐ5¸ÀÀ[Ð8QÑQÑQˆEØÐ*¨UÑ2°YÑ>Ñ>ˆØ�!Š8Ø�i¡ D¨¡F£˜}Ð,PÐQÑQˆDØ˜Ð$ˆ	Ø˜Š?Ø�M‰M˜+¨™/Ô*Ü�t˜a‘x ¨¡Ó*ò 	!ˆAØ�AÔ$˜Ö$Ø—‘˜aÕ ð	!ô ÓL¨ÔLÓLˆØˆØò 	ˆAØ�4‰x˜!Š|ØÐ@Ñ@�Ø"# t¢)‘Y°ˆFØ�i¡ A£˜xÐ'8¸¸ÀÀ1À#ÀTÐJÑJˆDØ‰Dð	ð �+ÒØ�i¡ D¨¡F£˜}Ð,PÐQÑQˆDÙ�q“6ˆØ—O‘O G¨QÓ/°Ñ2°WÑ<ˆ	ØÐLÈ[ÈMÐYbÐcgÐbhð  iEð  FOð  EPð  Pjð  kñ  	kˆØ�ÑˆØˆr   c                 óR  — | j                  |d«      }| j                  |dd«      j                  «       }| j                  |dd«      j                  «       }| j                  |dd«      }| j                  |dd«      }| j                  |dd«      }| j                  |d	d
«      }d}	t        | j                  |dd«      «      }
t        | j                  |dd«      «      }|dvrd}|dvrd}|}|r||rdndz   |z   }|r||rdndz   |z   }|�rj|dk(  �rt        t        t
        dœ}|r||v r ||   ||
|||	«      \  }}n‡g }d}dt        fdt        fdt
        ffD ]:  \  }} ||dd||	«      \  }}||xs dz  }|D ]  }||d<   Œ	 |j                  |«       Œ< |j                  d„ d¬«       t        |«      }|
dz
  |z  }||||z    }t        d||z   dz
  |z  «      }|
dz
  |z  }| j                  |||d|
|||||||||	xs |¬ «      }| j                  d!|«       y |}|s|d
k7  rt        ||
|||d ||	«      \  }}}ng dd}}}|
dz
  |z  }| j                  |||||
||||||||	«      }| j                  d!|«       y g }dx}x}}|s|d
k7  s	|	�r�|	dk7  �r{|xs dj                  «       } | j                  «       }!d }"t        |!«      dk(  rjd| vrf| j                  d"«      sU|!d   }#t!        |#«      rt        |#«      d#k\  rd$|#f}"n2t#        j$                  d%d|#«      }$d&t        |$«      cxk  rd'k  rn nd(|$f}"d}%|"r½	 t'        «       }&|&j)                  «       }'d)d*g}(|"d   |"d   g})|r"|d
k7  rdd&d+d,œ|   }*|(j+                  d-|*z  «       |	r'|	d
k7  r"|(j+                  d.«       |)j+                  |	«       |'j-                  d/d0j/                  |(«      z   |)«       |'j1                  «       d   }%|&j3                  «        |	r|	dk7  rdn|%r|%nd!}+t        |d|+dd d ||	«      \  },}}-|,D ]G  }d1|d<   |j7                  d2«      r|d2   d3k(  rt9        |j7                  d4d«      «      |d5<   Œ@|d2   |d5<   ŒI |j                  |,«       t        |dd!||	«      \  }}.|.D ]%  }d|d<   t9        |j7                  d6d«      «      |d5<   Œ' |j                  |.«       t        |dd!||	«      \  }}/|/D ]%  }d|d<   t9        |j7                  d6d«      «      |d5<   Œ' |j                  |/«       |j                  d7„ d¬«       t        |«      |kD  }|
dz
  |z  }||||z    }|s|dkD  r	d}
d}|d | }|xs d|xs dz   |xs dz   }0| j                  ||t        |«      ||
||dd|||||	|0¬ «      }| j                  d!|«       y # t4        $ r d}%Y �Œ¼w xY w)8Nr«   r›  r   rœ  rà   r  Útagr—   r¤   rô   r7  r´  r8  r   )r|   rt  r  éd   rt  )rÿ   r  Údate_ascr´   r‰   )r,  rW  r*  r   r,  rW  r*  r›   i'  Ú_sourcec                 ó.   — | j                  dd«      xs dS ©Nr-  r   rG  re   s    r	   rg   z2SearchHandler.handle_search_page.<locals>.<lambda>w  s   € °·±°nÀRÓ0HÒ0NÈB€ r   TrÒ   F)Ú
true_totalr�  r&   rm   r  r  rø   r  r  rZ  r[  rÎ   rù   r\  r÷   r^  r  rX  r<  rk   rw   Ú	_industryr  c                 ó.   — | j                  dd«      xs dS r+  rG  re   s    r	   rg   z2SearchHandler.handle_search_page.<locals>.<lambda>ñ  s   €  A§E¡E¨.¸Ó$<Ò$BÀ€ r   )r  r   r…  r‡  r�  r•  r£   rà   r]   r»  Úrender_main_pagerÕ  r   Úrender_gov_pager   rª   r
   r   r—   rÂ   r.  r   r‚   r   r1  r„   r…   r   rz   )1rƒ  r=  r«   r›  rœ  rà   r&  r—   r;  r<  r7  r8  rò  Úsub_sourcesrD  ræ   Úall_rowsÚ_sub_true_totalÚsrc_namerñ  ro   r  r¨  rC  r.  Ú	html_pager9  r  rL  Ú	gov_totalÚcceup_totalÚzc_totalÚ_gqÚ_gtermsÚ_proberY  rI  Ú_ecapÚ_dbpÚ_cpÚ_pcÚ_pprÆ  Ú
_gov_fetchÚgov_resultsr  Ú
cceup_rowsÚzc_rowsÚ_true_totals1                                                    r	   rÙ  z SearchHandler.handle_search_page3  s(  € à�N‰N˜6 3Ó'ˆà�^‰^˜F D¨"Ó-×3Ñ3Ó5ˆà�^‰^˜F D¨"Ó-×3Ñ3Ó5ˆà�~‰~˜f f¨kÓ:ˆà�n‰n˜V U¨BÓ/ˆà�n‰n˜V U¨BÓ/ˆà—N‘N 6¨7°EÓ:ˆ	ð ˆä�4—>‘> &¨&°#Ó6Ó7ˆä˜Ÿ™ v¨{¸DÓAÓBˆ	àÐ-Ñ-¸2¨yàÐ=Ñ=Àk¸tð ˆ
á˜J±©#ÀÑDÀrÑIˆzá˜J±©#ÀÑDÀrÑIˆzò à�nÓ$ä,8Ì+ÔjsÑt�á˜3 +Ñ-à"2 +¨cÑ"2°:¸tÀYÐPYÐ[cÓ"d‘K�E™4ð  "�HØ&'�Oà1<¼lÐ0KÈnÔ^iÐMjÐm~ô  AJð  mKð  0Lò 	+Ñ+˜ )á(¨°Q¸¸yÈ(ÓS™˜˜1Ø'¨AªF°Ñ3˜à"#ò 5˜Bà,4˜B˜yšMð5ð !Ÿ™¨Õ*ð	+ð —M‘MÑ&NÐX\�MÔ]ä ›M�Eà" Q™h¨)Ñ3�Fà# F¨6°)Ñ+;Ð<�Dä! ! e¨iÑ&7¸!Ñ&;À	Ñ%IÓJ�à ™( iÑ/�à ×1Ñ1°!°T¸5À%ÈÈyÐZ^Ð`cÐehÐjpÐr{Ð}ð  BDð  FNØ>MÒ>VÐQVð 2ó Y�	ð ×'Ñ'¨¨YÔ7àð ˆEá˜Y¨%Ò/ä+1°*¸dÀIÈtÐUZÐ\`ÐbkÐmuÓ+vÑ(�˜¡ð ,.¨q°% ˜�à˜Q‘h )Ñ+ˆFà×,Ñ,¨Q°¸ÀÈ$ÐPYÐ[_ÐadÐflÐnwÐy{Ð}ð  BJó  KˆIà×#Ñ# C¨Ô3àð ˆð ./Ð.ˆ	Ð.�K (Ù˜ eÒ+²¸XÈ»^ð
 Ò# ×*Ñ*Ó,ˆCØ—i‘i“kˆGØˆFÜ�7‹|˜qÒ  S°¡^¸C¿N¹NÈ3Ô<OØ˜Q‘Z�Ü# BÔ'¬C°«G°qªLØ'¨˜_‘FäŸ6™6 %¨¨RÓ0�DØœC ›IÔ+¨Õ+Ø")¨4 ˜ØˆEÙðÜ!›8�DØŸ+™+›-�CØ(¨-Ð8�CØ! !™9 f¨Q¡iÐ0�CÙ  Y°%Ò%7Ø'(°¸"Ñ =¸iÑ H˜ØŸ
™
ð  $\ð  _dñ  $dô  eÙ H°Ò$5ØŸ
™
Ð#3Ô4ØŸ
™
 8Ô,Ø—K‘KÐ lÐov×o{Ño{Ð|ó  pAñ  !Að  CFô  GØŸL™L›N¨1Ñ-�EØ—J‘J”Lñ $,°¸B²™ÉuÁeÐZ]ˆJÜ(.¨z¸1¸jÈ+ÐW[Ð]aÐclÐnvÓ(wÑ%ˆK˜ Aà!ò 5�à %��9‘ð —v‘v˜jÔ)¨R°
©^¸wÒ-FÜ&7¸¿¹¸wÀrÓ8JÓ&K�B�{’Oà&(¨¡n�B�{’Oð5ð �O‰O˜KÔ(ô '3°:¸qÀ#ÀyÐRZÓ&[Ñ#ˆK˜à ò O�à +��9‘ä"3°B·F±F¸>È"Ó4MÓ"N��;’ð	Oð �O‰O˜JÔ'ô !*¨*°a¸¸iÈÓ RÑˆH�gàò O�à 1��9‘ä"3°B·F±F¸>È"Ó4MÓ"N��;’ð	Oð �O‰O˜GÔ$ð 	�‰ÑBÈDˆÔQä�x“= 9Ñ,ˆà˜‘(˜iÑ'ˆà˜˜v iÑ/Ð0ˆá˜ š
ð ˆDàˆFà˜J˜YÐ'ˆDð !’~ A¨+Ò*:¸Ñ;¸xº}È1ÑMˆØ×)Ñ)¨!¨T´3°x³=À(ÈDÐR[Ð]aÐceÐgiÐkqÐs|ð  Að  CEð  GOØ5@ð *ó Bˆ	ð 	×Ñ  YÕ/øôG !ò Ø“Eðús   Ì-B<V ÖV&Ö%V&c                 ó¸  ‡‡‡‡‡‡
‡‡‡‡*— ˆ
ˆˆˆˆˆˆˆˆf	d„}d}t        |«      D �]ý  \  }}|j                  d«      rdt        |j                  dd«      «      › d�nd}t        |j                  dd«      xs |j                  dd«      xs d«      }|j                  d«      r+d	j                  d
„ |j                  d«      xs g D «       «      nd}|dz  }|d|	|z   dz   › d�z  }|d|j                  dd«      › dt        |j                  dd«      «      › d�z  }|d|z   z  }|r	|d|› d�z  }|dt        |j                  dd«      xs d«      › d�z  }t        |j                  dd«      xs d«      }|r|d|z   dz   z  }|j                  d«      ret	        |j                  d«      «      \  }}|rFt        |«      \  }}|r6|dk(  rdnd}|dk(  rdnd}|d |› d!|› d|› d"t        t        |«      «      › d�	z  }|d#t        |j                  d$d«      «      › d�z  }|d%|› d&�z  }|d'z  }�Œ  |s‰rd(}n|s‰sd)}‰
d*k(  rd+nd}‰
d,k(  rd+nd}‰
d-k(  rd+nd}‰
d.k(  rd+nd}d/d0d1d2d3œ} ˆ*fd4„}!‰‰‰xs d‰
‰‰d5œŠ*‰r‰‰*d6<   d7}"| j                  «       D ]#  \  }#}$‰
|#k(  rd8nd9}%|"d:|%› d; |!|#«      › d|$› d<�z  }"Œ% |"d'z  }"|dkD  rt        d|‰z   dz
  ‰z  «      nd}&| j                  ‰|&d=‰*|‰¬>«      }'d}(t        d?z   })d@‰rt        ‰«      ndAz   dBz   |)z   dCz   t        | j                  «      z   dDz   t        ‰«      z   dEz   |"z   dFz   t        |«      z   dGz   |(z   dHz   |z   dIz   |'z   dJz   S )KNc           
      ó*  •	— ‰
‰‰	‰‰xs d‰t        ‰«      t        ‰«      dœ}‰r‰|d<   |j                  | j                  «       D ��ci c]  \  }}|sŒ	|t        |«      “Œ c}}«       dj                  d„ |j                  «       D «       «      S c c}}w )Nr   )r«   r›  rœ  rà   r&  r¤   r7  r8  r<  r‹   c              3   óp   K  — | ].  \  }}|sŒ	|› d t         j                  j                  |«      › �–— Œ0 y­wr’  ©rž  rŸ  r   rQ  s      r	   ra   zESearchHandler.render_gov_page.<locals>.link_params.<locals>.<genexpr>  ó2   è ø€ ÒV¹t¸qÀ!ÒTU˜q˜c ¤6§<¡<×#5Ñ#5°aÓ#8Ð"9Ô:ÑVùó   ‚
6�)6©r�   r¬  r·  r   )Ú	overridesr    r…  r#   r;  r<  r7  r8  r›  rœ  r6  rà   r&  s       €€€€€€€€€r	   Úlink_paramsz2SearchHandler.render_gov_page.<locals>.link_params  s“   ø€ à 2¨R¸ÀcÂiÈRÐZcÔmpÐquÓmvô  FIð  JSó  FTñ  UˆAá¨˜˜:™à�H‰H¨I¯O©OÓ,=×C¡D A qÂ�aœ˜Q›‘iÓCÔDà—8‘8ÑVÀqÇwÁwÃyÔVÓVÐVùó Ds   Á
B
ÁB
r   r:  ú<span class="cat-badge">r²  r™  rš  r³  rH  c              3   óh   K  — | ]*  }t         j                  |i «      j                  d |«      –— Œ, y­w)r,   N)r/  r   r  s     r	   ra   z0SearchHandler.render_gov_page.<locals>.<genexpr>!  s(   è ø€ Ò#fÈ1¤I§M¡M°!°BÓ$7×$;Ñ$;¸GÀA×$FÑ#fùs   ‚02r¡  z<span class="result-num">r›   z<h3><a href="/detail?id=r+   r   r³  rw   r
  r¤  z<span class="tags">z<span class="date">r-  r¦  rœ  r§  râ   r¨  r©  rª  r«  r¬  r­  r®  u   <span class="invest">ðŸ’° r  r›  u5   " class="source-link" target="_blank">ðŸ”— åŽŸæ–‡</a>r´  u;   <div class="no-results">ðŸ˜• æ²¡æœ‰æ‰¾åˆ°ç›¸å…³ç»“æžœ</div>u9   <div class="no-results">è¾“å…¥å…³é”®è¯�å¼€å§‹æ�œç´¢</div>rô   z	 selectedrú   rû   rü   r‰  rŠ  r‹  rŒ  r�  c           	      óÖ   •— t        ‰«      }| dk7  r| nd|d<   d|d<   dt        j                  j                  |j	                  «       D ��ci c]  \  }}|sŒ	||“Œ c}}«      z   S c c}}w ©Nrô   r   r¤   r´  r7  z/?©r2  rž  rŸ  Ú	urlencoder·  ©rú  r    r…  r#   Úparams_dicts       €r	   Údate_chip_urlz4SearchHandler.render_gov_page.<locals>.date_chip_urlT  ó`   ø€ Ü�[Ó!ˆAØ! Uš{™°ˆAˆg‰JØˆAˆf‰IØœ&Ÿ,™,×0Ñ0À1Ç7Á7Ã9×1R¹4¸1¸aÒPQ°!°Q±$Ó1RÓSÑSÐSùÓ1Ró   Á
A%ÁA%©r«   rà   r&  r¤   r›  rœ  r<  õœ   <div style="display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:8px"><span style="font-size:13px;color:#333;margin-right:4px">æ—¶é—´</span>rŽ  r�  r�  ræ  rè  r>  r°  aÀ  

.pagination{text-align:center;margin:20px 0;display:flex;justify-content:center;gap:4px;flex-wrap:wrap}.page-btn{display:inline-block;padding:8px 14px;background:#fff;border:1px solid #dadce0;border-radius:6px;font-size:14px;color:#1a73e8;text-decoration:none;transition:all .15s}.page-btn:hover{background:#e8f0fe;border-color:#1a73e8}.page-btn.active{background:#1a73e8;color:#fff;border-color:#1a73e8}.page-ellipsis{padding:8px 4px;color:#999}.page-jump{display:inline-flex;align-items:center;gap:4px;margin-left:8px}.page-jump input{width:50px;padding:4px 6px;border:1px solid #dadce0;border-radius:4px;text-align:center;font-size:13px}
.meta .source{color:#0d652d;font-size:12px;margin-left:8px}

zœ<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>u   é¡¹ç›®ä¿¡æ�¯æ£€ç´¢z</title>
    <style>u  </style>
</head>
<body>
    <div class="container">
        <div class="nav">

            <a href="/" class="nav-logo">BJIIR</a>

            <div class="nav-links">

                <a href="/crawler/" class="act">çŽ¯è¯„å…¬ç¤º</a>

                <a href="/zc/">ä¸­ç­–å¤§æ•°æ�®</a>

                <a href="/ccpc">ä¸­é¡¹ç½‘</a>

                <a href="/contact">è�”ç³»äººDB</a>
                <a href="/originals/">åŽŸå§‹æ•°æ�®</a>

                <a href="/originals/">åŽŸå§‹æ•°æ�®</a>

            </div>

            uÞ   

        </div>

        <div class="search-section">
            <form action="/" method="get" class="search-box">
                <input type="text" name="q" placeholder="æ�œç´¢é¡¹ç›®å…³é”®è¯�ã€�æ ‡é¢˜ã€�URL..." value="u«   " autofocus>
                <button type="submit">æ�œç´¢</button>
            </form>
        </div>
        <div class="search-tools">
            <div class="date-bar">uŠ   </div>
        </div>
        
        <div class="toolbar"><div class="controls">
            
            <span class="total-count">å…± u0    æ�¡ç»“æžœ</span>
        </div></div>

        ú

        <div class="results">z</div>
        z
    </div>
</body>
</html>)r³  r   r“   r   rî   ró   r�   r)   r·  r»  r¶  rµ  r¹  r£  )+rƒ  r6  r  rD  rL  r7  r8  rà   r&  rC  r;  r›  rœ  r<  rN  Úresult_rowsrþ  r  Ú	cat_badgeÚsrc_urlÚ	tags_htmlrœ  r   r  r  r  r  r  Úsel_allÚsel_1dÚsel_7dÚsel_30drù  rW  Údate_barrú  rû  rü  r.  Ú
paginationÚrefine_htmlró  rV  s+    `   ```` ````                            @r	   r0  zSearchHandler.render_gov_page  sõ  ÿù€ ÷	Wô 	Wð ˆä Ó(ó %	$‰FˆC�àYZ×Y^ÑY^Ð_iÔYjÐ2´3°q·u±u¸ZÈÓ7KÓ3LÐ2MÈWÑUÐprˆIä˜!Ÿ%™% 
¨2Ó.ÒN°!·%±%¸ÀRÓ2HÒNÈBÓOˆGàjk×joÑjoÐpvÔjw˜Ÿ™Ñ#fÐQR×QVÑQVÐW]ÓQ^ÒQdÐbdÔ#fÔfÐ}ˆIàÐ6Ñ6ˆKàÐ6°vÀ±|ÀaÑ7GÐ6HÈÐPÑPˆKàÐ5°a·e±e¸DÀ³m°_ÀBÄsÈ1Ï5É5ÐQXÐY[ÓK\ÓG]ÐF^Ð^gÐhÑhˆKàÐ/°)Ñ;Ñ;ˆKñ ˜+Ð+>¸y¸kÈÐ)QÑQ˜+àÐ0´°Q·U±U¸>È"Ó5MÒ5_ÐQ_Ó1`Ð0aÐahÐiÑiˆKÜ˜AŸE™E +¨bÓ1Ò7°RÓ8ˆIÙØÐ!?À9ÑLÈyÑXÑX�à�u‰u�WŒ~Ü 1°!·%±%¸³.Ó A‘��gÙÜ$2°4Ó$8‘M�E˜6ÙØ-3°vÒ-=¡	À>˜ØLRÐV\ÒL\Ñ Hð  cI˜Ø#¨°u°g¸YÀuÀgÈRÐPUÈwÐVXÔY\Ô]`ÐaeÓ]fÓYgÐXhÐhoÐ'pÑp˜àÐ=Ô>PÐQR×QVÑQVÐW`ÐacÓQdÓ>eÐ=fÐfmÐnÑnˆKà˜Y w iÐ/pÐqÑqˆKà˜8Ñ#ŠKðK%	$ñP ™5ð  1L¡+á¡ð  7M¨ð "+¨eÒ!3‘+¸ˆà )¨TÒ 1‘°rˆà )¨TÒ 1‘°rˆà!*¨eÒ!3‘+¸ˆà)Ð1AÈÐ`qÑrˆô	Tð "¨4¸º	¸rÈIÐ]_ÐgiÑjˆá¨x�[ Ñ,ð rˆØ—n‘nÓ&ò 	Q‰FˆB�Ø&/°2¢o‘?¸;ˆDØ˜* T F¨(±=ÀÓ3DÐ2EÀRÈÀtÈ4ÐPÑP‰Hð	Qð 	�HÑˆð GLÈaÂi”c˜!˜e iÑ/°!Ñ3¸	ÑAÔBÐUVˆØ—]‘] 4¨°c¸;ÐTYÐ_h�]Óiˆ
ð ˆô ð ñ ˆð wñ  INô  {~ð  Dô  {Eð  Tzñ  {ð  ~Yñ  Yð  \_ñ  _ð bñ ô& ! §¡Ó/ñ'0ð&3sñ'sô. vyð  zó  v@ñ/@ð. Cñ/ð. BJñ/Jð. Mb	ñ/b	ô. e	h	ð  i	n	ó  e	o	ñ/o	ð.r	ñ/ð2 ñ3ð2!ñ3!ð6 $/ñ7/ð6 2Hñ7Hð6 KUñ7Uð6X ñ7 ð 	 r   c                 ó¬  ‡‡‡‡‡‡	‡‡‡‡‡&— ˆˆˆˆˆˆˆˆˆ	ˆf
d„}d}t        |«      D �]’  \  }}|j                  dd«      }|j                  d«      xs( |j                  d«      xs |j                  d«      xs d}t        |j                  dd«      xs* |j                  dd«      xs |j                  d	d«      xs d«      }|d
z  }|d|
|z   dz   › d�z  }|dk(  rd|› �}n|dk(  rd|› �}nd|› �}|d|› d|› d�z  }|dz  }|r|dt        |«      › d�z  }|j                  d«      r|dt        t        |d   «      «      › d�z  }|j                  d«      r9|dt        |d   «      › |j                  d«      rdt        |d   «      z   nd› d�z  }|dt        |j                  dd«      xs d «      › d�z  }|d!z  }�Œ• |sd"}d#d$d%d&d'œ}‰‰‰xs d‰‰‰d(œŠ&‰r‰‰&d)<   ˆ&fd*„}d+}|j	                  «       D ]#  \  }}‰|k(  rd,nd-}|d.|› d/ ||«      › d|› d0�z  }Œ% |d1z  }|d2kD  rt        d|‰z   dz
  ‰z  «      nd}| j                  ‰|d‰&|‰¬3«      }d} t        d4z   }!d5„ }"t        |xr ||kD  «      }#|#rHd6 |"|«      ›d7 |"|«      ›d8t        j                  j                  ‰xs d«      ›‰r
‰d9k7  rd:‰z   nd›d;�}$nd< |"|«      z  }$‰ xr ‰ xr ‰ xr ‰ }%|%r+d=|!› d>t        › d?t        | j                  d@«      › dAt        › dB�	S dCt        ‰«      › dD|!› d>t        › dEt        | j                  «      › dFt        ‰«      › dG|$› dH|› dI| › dJ|› dK|› dLt        › dB�S )MNc                 ó4  •
— ‰
‰‰	‰‰xs d‰xs d‰t        ‰«      t        ‰«      dœ	}‰r‰|d<   |j                  | j                  «       D ��ci c]  \  }}|sŒ	|t        |«      “Œ c}}«       dj                  d„ |j                  «       D «       «      S c c}}w )Nr   )	r«   r›  rœ  rà   r&  r—   r¤   r7  r8  r<  r‹   c              3   óp   K  — | ].  \  }}|sŒ	|› d t         j                  j                  |«      › �–— Œ0 y­wr’  rI  rQ  s      r	   ra   zFSearchHandler.render_main_page.<locals>.link_params.<locals>.<genexpr>¡  rJ  rK  rL  )rM  r    r…  r#   r;  r<  r7  r8  r›  rœ  r6  rà   r—   r&  s       €€€€€€€€€€r	   rN  z3SearchHandler.render_main_page.<locals>.link_params™  s¨   ø€ à 2¨R¸ÀcÂiÈRÐX[ÒXaÐ_aÐluô  @Cð  DHó  @Iô  X[ð  \eó  Xfñ  gˆAá¨˜˜:™à�H‰H¨I¯O©OÓ,=×C¡D A qÂ�aœ˜Q›‘iÓCÔDà—8‘8ÑVÀqÇwÁwÃyÔVÓVÐVùó Ds   Á
B
ÁB
r   r)  r+   r  r   r  r  rw   r¡  r¢  r›   r²  rX  r±  r*  r™  rš  z<h3><a href="r³  r
  r¤  r¯  r  z<span>&#x1f4b0; r   z<span>&#x1f4cd; r"  r>  z<span>&#x1f4c5; r-  r¦  rO  u@   <div class="no-results">&#x1f615; æ²¡æœ‰æ‰¾åˆ°ç›¸å…³ç»“æžœ</div>r‰  rŠ  r‹  rŒ  r�  rZ  r<  c           	      óÖ   •— t        ‰«      }| dk7  r| nd|d<   d|d<   dt        j                  j                  |j	                  «       D ��ci c]  \  }}|sŒ	||“Œ c}}«      z   S c c}}w rR  rS  rU  s       €r	   rW  z5SearchHandler.render_main_page.<locals>.date_chip_urlÚ  rX  rY  r[  rŽ  r�  r�  ræ  rè  r´  r   r°  a  

.pagination{text-align:center;margin:20px 0;display:flex;justify-content:center;gap:4px;flex-wrap:wrap}.page-btn{display:inline-block;padding:8px 14px;background:#fff;border:1px solid #dadce0;border-radius:6px;font-size:14px;color:#1a73e8;text-decoration:none;transition:all .15s}.page-btn:hover{background:#e8f0fe;border-color:#1a73e8}.page-btn.active{background:#1a73e8;color:#fff;border-color:#1a73e8}.page-ellipsis{padding:8px 4px;color:#999}.page-jump{display:inline-flex;align-items:center;gap:4px;margin-left:8px}.page-jump input{width:50px;padding:4px 6px;border:1px solid #dadce0;border-radius:4px;text-align:center;font-size:13px}
.total-count b{color:#1a73e8}
.cap-note{color:#b26a00}
.cap-more{color:#1a73e8;font-weight:500;margin-left:2px}
.cap-more:hover{text-decoration:underline}

c                 ó4   — t        t        | xs d«      d«      S )Nr   r	  )Úformatr…  )r�  s    r	   rg   z0SearchHandler.render_main_page.<locals>.<lambda>û  s   € œ¤ A¢F¨£¨SÓ1€ r   u   å…± <b>u<   </b> æ�¡ç»“æžœ <span class="cap-note">ï¼ˆä»…å±•ç¤ºæœ€æ–°çš„ u5    æ�¡ï¼‰</span> <a class="cap-more" href="/crawler/?q=rô   r–  u%   ">åœ¨çŽ¯è¯„å…¬ç¤ºé‡Œçœ‹å…¨éƒ¨ â†’</a>u   å…± <b>%s</b> æ�¡ç»“æžœuÄ   <!DOCTYPE html>

<html lang="zh-CN">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>BJIIRé¡¹ç›®åº“</title>

    <style>rú  zL

</head>

<body>

    <div class="container">

        <div class="topbar">Tu}  </div>

        <div class="home-wrap">

            <div class="home-logo">BJIIRé¡¹ç›®åº“</div>

            <div class="home-sub">çŽ¯ä¿�é¡¹ç›®ä¿¡æ�¯ç»¼å�ˆæ�œç´¢</div>

            <div class="home-search">

                <form action="/" method="get" class="search-box">

                    <input type="text" name="q" placeholder="æ�œç´¢é¡¹ç›®å…³é”®è¯�ã€�æ ‡é¢˜..." value="" autofocus>

                    <button type="submit">æ�œç´¢</button>

                </form>


            </div>

            <div class="home-btns">

                <a href="/crawler/">&#x1f50d; çŽ¯è¯„å…¬ç¤º</a>

                <a href="/zc/">&#x1f4ca; ä¸­ç­–å¤§æ•°æ�®</a>

                <a href="/ccpc">&#x1f4c4; ä¸­é¡¹ç½‘</a>

                <a href="/contact">&#x1f464; è�”ç³»äººDB</a>
                <a href="/originals/">&#x1f4cb; åŽŸå§‹æ•°æ�®</a>

            </div>

        </div>

    </div>

z

</body>

</html>z¡<!DOCTYPE html>

<html lang="zh-CN">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>u&    - BJIIRé¡¹ç›®åº“</title>

    <style>u  

    <style>
    /* æ�œç´¢ç»“æžœé¡µå®¹å™¨åŒ–ï¼ˆ2026-09-10 ç”¨æˆ·éœ€æ±‚ï¼šæ�œç´¢ç»“æžœé¡µéœ€è¦�å®¹å™¨ï¼‰ */
    body{background:#f1f3f5}
    .container{max-width:1040px}
    .results{background:#fff;border:1px solid #e9ecef;border-radius:14px;
      padding:6px 20px 14px;box-shadow:0 1px 3px rgba(0,0,0,.05);margin-top:12px}
    .result-item:last-child{border-bottom:none}
    </style>

</head>

<body>

    <div class="container">

        <div class="nav">

            <a href="/" class="nav-logo">BJIIR</a>

            <div class="nav-links">

                <a href="/crawler/">çŽ¯è¯„å…¬ç¤º</a>

                <a href="/zc/">ä¸­ç­–å¤§æ•°æ�®</a>

                <a href="/ccpc">ä¸­é¡¹ç½‘</a>

                <a href="/contact">è�”ç³»äººDB</a>

            </div>

            uÚ   

        </div>

        <div class="search-section">

            <form action="/" method="get" class="search-box">

                <input type="text" name="q" placeholder="æ�œç´¢é¡¹ç›®å…³é”®è¯�ã€�æ ‡é¢˜..." value="uÆ   " autofocus>

                <button type="submit">æ�œç´¢</button>

            </form>


        </div>

        <div class="toolbar"><div class="controls">

            <span class="total-count">z+</span>

            <div class="date-bar">z&</div>

        </div></div>

        r\  z</div>

        z

    </div>

)r³  r   r“   r�   r·  r»  r¶  rµ  r   rž  rŸ  r   ÚCMK_CSSr¹  r£  ÚCMK_TAIL)'rƒ  r6  ræ   rD  rL  r7  r8  rà   r&  r—   rC  r;  r›  rœ  r<  r,  rN  r]  rþ  r  rª  ri  r  Údetail_linkrù  rW  re  rú  rû  rü  r.  rf  Úindustry_chipsró  Ú_fmtÚ_cappedÚ_total_htmlÚis_homerV  s'    `   ````` ````                       @r	   r/  zSearchHandler.render_main_page–  s–  ÿú€ ÷	Wõ 	Wð ˆä “oó $	*‰FˆC�à—%‘%˜	 2Ó&ˆCà—%‘%˜“+ÒJ §¡ |Ó!4ÒJ¸¿¹¸e»ÒJÈˆCä�q—u‘u˜^¨BÓ/Òg°1·5±5¸ÈÓ3LÒgÐPQ×PUÑPUÐV]Ð^`ÓPaÒgÐegÓhˆDàÐ6Ñ6ˆKàÐ/°¸±¸qÑ0@Ð/AÀÐIÑIˆKà�eŠ|à 1°#°Ð7‘àÐ)Ò)à ,¨S¨EÐ2‘ð !/¨s¨eÐ4�à˜]¨;¨-°r¸$¸¸yÐIÑIˆKàÐ/Ñ/ˆKá�KÐ%CÄCÈÃHÀ:ÈWÐ#UÑU�Kà�u‰u�XŒ Ð1AÄ#ÄcÈ!ÈHÉ+ÓFVÓBWÐAXÐX_Ð/`Ñ ` à�u‰u�ZÔ  +Ð3CÄCÈÈ*ÉÓDVÐCWÐno×nsÑnsÐtzÔn{ÐX[Ô\_Ð`aÐbhÑ`iÓ\jÒXjð  BDð  XEð  ELð  2Mñ  #M +àÐ-¬c°!·%±%¸ÀrÓ2JÒ2\ÈnÓ.]Ð-^Ð^eÐfÑfˆKà˜>Ñ)ŠKðI$	*ñL à\ˆKð *Ð1AÈÐ`qÑrˆà!¨4¸º	¸rÈIÐ]_ÐgiÑjˆá¨x�[ Ñ,ô	Tð rˆØ—n‘nÓ&ò 	Q‰FˆB�Ø&/°2¢o‘?¸;ˆDØ˜* T F¨(±=ÀÓ3DÐ2EÀRÈÀtÈ4ÐPÑP‰Hð	Qð 	�HÑˆð GLÈaÂi”c˜!˜e iÑ/°!Ñ3¸	ÑAÔBÐUVˆØ—]‘] 4¨°c¸;ÐTYÐ_h�]Óiˆ
ð ˆäð ñ ˆñ 2ˆÜ�zÒ8 j°5Ñ&8Ó9ˆÚñ # :Õ.±°Uµ¼V¿\¹\×=OÑ=OÐPUÒP[ÐY[Ô=\Ù;DÈÐV[ÒI[ 	¨IÒ 5ÐbdÑdðg‰Kð
 4±d¸5³kÑAˆKà�)ÒB B ÒB¨r¨6ÒB¸(°lˆáðð ˆ5�œ˜	ð "ô ,¨D¯M©M¸4Ó@ÐAð &BôL 
€
ð ðu>ð >ðD
ô �‹Jˆ<ð àˆ5�œ˜	ð !"ôB ˜DŸM™MÓ*Ð+ð ,dô ehÐhmÓdnÐcoð p'ð (3 mð 4#à#+ *ð -	ð 
Ðð à)˜]ð +	à	ˆð ô 
€
ð ð]Rð Rr   c	           	      ó~  — t        d||z   dz
  |z  «      }	|r"dt        j                  j                  |«      z   nd}
d|z   dz   }|dz  }|dz  }dD ]  \  }}}|d	|z   d
z   |z   dz   z  }Œ |d| j                  z   dz   z  }|d| j                  z   dz   z  }|d|z   dz   z  }|dt        |«      z   dz   z  }|dt        |«      z   dz   z  }|D �]A  }t        |j                  d«      xs( |j                  d«      xs |j                  d«      xs d«      }t        |j                  dd«      xs* |j                  dd«      xs |j                  dd«      xs d«      }|d|z   dz   |z   dz   z  }|j                  d«      r|d t        |d   «      z   dz   z  }|j                  d!«      r<|d t        |d!   «      z   |j                  d"«      rd#t        |d"   «      z   ndz   dz   z  }|j                  d$«      r|d t        |d$   «      z   dz   z  }|d%z  }�ŒD |	dkD  r%d&d'i}|r||d(<   || j                  ||	d#|||¬)«      z  }|d*z  }|S )+Nr›   r#  r   r~  r  a&  <style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,"Microsoft YaHei",sans-serif;background:#f5f5f5;color:#333}.w{max-width:1000px;margin:0 auto;padding:18px 20px 56px}.nav{display:flex;gap:3px;margin-bottom:20px;white-space:nowrap;flex-wrap:nowrap;align-items:center}.nav a{flex:1;text-align:center;padding:6px 10px;background:#fff;border:1px solid #ddd;border-radius:6px;text-decoration:none;color:#555;font-size:13px;flex-shrink:0;min-width:0;font-weight:500}.nav a.act{background:#4361ee;color:#fff;border-color:#4361ee}h1{font-size:22px;margin-bottom:10px}.sb{display:flex;gap:10px;margin-bottom:20px}.sb input{flex:1;padding:10px 15px;border:1px solid #ddd;border-radius:6px;font-size:15px}.sb button{padding:10px 24px;background:#4361ee;color:#fff;border:none;border-radius:6px;cursor:pointer}.st{color:#666;font-size:14px;margin-bottom:15px}.cd{background:#fff;border-radius:8px;padding:16px 20px;margin-bottom:10px;box-shadow:0 1px 3px rgba(0,0,0,.08);cursor:pointer}.cd:hover{box-shadow:0 2px 8px rgba(0,0,0,.12)}.tt{font-size:16px;font-weight:600;color:#1a1a2e;margin-bottom:6px}.mt{font-size:13px;color:#666;display:flex;gap:16px;flex-wrap:wrap}.mt>*{margin-right:12px}.page-btn{display:inline-block;padding:6px 14px;background:#fff;border:1px solid #ddd;border-radius:6px;text-decoration:none;color:#333;font-size:14px;margin:0 2px}.page-btn.active{background:#4361ee;color:#fff;border-color:#4361ee}.page-ellipsis{display:inline-block;padding:6px 4px;color:#999;font-size:14px}.page-jump{display:inline-flex;align-items:center;gap:4px;margin-left:8px;font-size:13px;color:#666}.page-jump input{width:50px;padding:6px 8px;border:1px solid #ddd;border-radius:6px;font-size:13px;text-align:center;outline:none}.page-jump input:focus{border-color:#2563eb}</style></head><body><div class="w">r€  )r/  r„  r0  r1  )r*   r²  rY  )r6  r'  rX  z<a class="nav" href="r³  rè  zW<span style="flex:1"></span><span style="font-size:12px;color:#888;white-space:nowrap">r²  ud   <span style="flex:1"></span><span style="font-size:13px;color:#555;white-space:nowrap">ç™»å½•ç”¨æˆ· uy   </span><a href="/logout" style="font-size:13px;color:#e53935;text-decoration:none;margin-left:8px">é€€å‡º</a></div></div>r  r  u�   <form class="sb" method="get" action="/"><input type="hidden" name="category" value="ä¸­é¡¹ç½‘"><input name="q" placeholder="æ�œç´¢â€¦" value="u    "><button>æ�œç´¢</button></form>u   <div class="st">å…± u    ä¸ªé¡¹ç›®</div>r+   r  r   r  r  rw   z6<div class="cd" onclick="location.href='/ccpc/project/z'"><div class="tt">z</div><div class="mt">r  r¥  r   r"  r>  r-  rO  r:  r,  r«   r°  r²  )	r»  rž  rŸ  r   r£  r“   r�   r   r¶  )rƒ  rw   r:  r«   ræ   rD  r7  r8  rC  r  Úqprg  rô  rõ  rö  r  ri  r  r  s                      r	   Úrender_cceup_pagezSearchHandler.render_cceup_page¡  s  € ä��U˜9‘_ QÑ&¨Ñ2Ó3ˆá,-ˆU”6—<‘<×%Ñ% aÓ(Ò(°2ˆð Wð  X]ñ  ]ð  ^hñ  hˆà	ð  vñ  	vˆà	Ð"Ñ"ˆð -Jò 	IÑ(ˆF�I˜yàÐ(¨Ñ2°4Ñ7¸	ÑAÀ&ÑHÑH‰Að	Ið 	
ÐfÐgk×gtÑgtÑtÐu~Ñ~Ñ~ˆà	ÐsÐtx÷  uBñ  uBñ  Bð  C~ñ  ~ñ  	~ˆà	ˆV�E‰\˜'Ñ!Ñ!ˆà	ð  _ô  `cð  deó  `fñ  fð  gIñ  Iñ  	Iˆà	Ð#¤C¨£JÑ.Ð/AÑAÑAˆàó 	 ˆAä�a—e‘e˜D“kÒN Q§U¡U¨<Ó%8ÒN¸A¿E¹EÀ%»LÒNÈBÓOˆCä�q—u‘u˜^¨BÓ/Òg°1·5±5¸ÈÓ3LÒgÐPQ×PUÑPUÐV]Ð^`ÓPaÒgÐegÓhˆDàÐJÈ3ÑNÐOeÑeÐfjÑjð  lDñ  Dñ  DˆAð �u‰u�XŒ  X¬c°!°H±+Ó.>Ñ%>¸yÑ%HÑ H à�u‰u�ZÔ  ! x´°A°j±MÓ0BÑ'BÐZ[×Z_ÑZ_Ð`fÔZgÀCÌÈAÈfÉIËÒDVÐmoÑ'pÐqzÑ'zÑ"z !à�u‰u�^Ô$ a¨8´C¸¸.Ñ8IÓ4JÑ+JÈ9Ñ+TÑ&T aà�ÑŠAð!	 ð$ �Š6à$ kÐ2ˆJá A�*˜S‘/à�—‘˜t R¨¨jÀeÐQZ�Ó[Ñ[ˆAà	Ð)Ñ)ˆàˆr   c                 óD  — t        | j                  |dd«      «      }d}| j                  |dd«      j                  «       }t        j                  t
        «      }t        j                  |_        |j                  «       }|rj|j                  dd|› d�d|› d�d|› d�d|› d�f«       |j                  «       d   }|d	z
  |z  }|j                  d
d|› d�d|› d�d|› d�d|› d�||f«       n@|j                  d«       |j                  «       d   }|d	z
  |z  }|j                  d||f«       |j                  «       D �	cg c]  }	t        |	«      ‘Œ }
}	|j                  «        t        d	||z   d	z
  |z  «      }| j                  d| j!                  ||
|||||«      «       y c c}	w )Nr7  r´  r  r«   r   zoSELECT COUNT(*) FROM cceup_contacts WHERE company LIKE ? OR contact_name LIKE ? OR phone LIKE ? OR email LIKE ?r  r   r›   zŠSELECT * FROM cceup_contacts WHERE company LIKE ? OR contact_name LIKE ? OR phone LIKE ? OR email LIKE ? ORDER BY id DESC LIMIT ? OFFSET ?z#SELECT COUNT(*) FROM cceup_contactsz>SELECT * FROM cceup_contacts ORDER BY id DESC LIMIT ? OFFSET ?r�  )r…  r  r   r   r€   r~  rÀ   rÁ   r.  r‚   r1  rÝ   r2  r„   r»  rÕ  Úrender_contact_list©rƒ  r=  r7  r8  r«   r‡   rµ   rD  rC  r  ræ   r.  s               r	   rÛ  zSearchHandler.handle_cceup_pageß  sŠ  € ä�4—>‘> &¨&°#Ó6Ó7ˆàˆ	à�N‰N˜6 3¨Ó+×1Ñ1Ó3ˆä�‰œÓ/ˆä"Ÿ;™;ˆÔà�K‰K‹Mˆáà�I‰Ið  Hð  MNð  OPð  NQð  QRð  KSð  WXð  YZð  X[ð  [\ð  U]ð  abð  cdð  beð  efð  _gð  klð  mnð  loð  opð  iqð  Jrô  sà—J‘J“L ‘OˆEà˜Q‘h )Ñ+ˆFà�I‰Ið  cð  hið  jkð  ilð  lmð  fnð  rsð  tuð  svð  vwð  pxð  |}ð  ~ð  }@ð  @Að  zBð  FGð  HIð  GJð  JKð  DLð  NWð  Y_ð  e`õ  að �I‰IÐ;Ô<à—J‘J“L ‘OˆEà˜Q‘h )Ñ+ˆFà�I‰IÐVÐYbÐdjÐXkÔlà!"§¡£Ö.˜A”�Q•Ð.ˆÐ.à�
‰
Œä˜!˜e iÑ/°!Ñ3¸	ÑAÓBˆà×Ñ  T×%=Ñ%=¸aÀÀuÈdÐT]Ð_jÐlrÓ%sÕtùò /s   Ä<Fc                 ó¨  — t        | j                  |dd«      «      }d}| j                  |dd«      j                  «       }t        j                  t
        «      }t        j                  |_        |j                  «       }|rœ|j                  dd|› d�d|› d�d|› d�d|› d�d|› d�d|› d�d|› d�d|› d�d|› d�f	«       |j                  «       d   }|d	z
  |z  }|j                  d
d|› d�d|› d�d|› d�d|› d�d|› d�d|› d�d|› d�d|› d�d|› d�||f«       n@|j                  d«       |j                  «       d   }|d	z
  |z  }|j                  d||f«       |j                  «       D �	cg c]  }	t        |	«      ‘Œ }
}	|j                  «        t        d	||z   d	z
  |z  «      }| j                  d| j!                  ||
|||||«      «       y c c}	w )Nr7  r´  r  r«   r   zÅSELECT COUNT(*) FROM contacts WHERE company LIKE ? OR contact_name LIKE ? OR phone LIKE ? OR email LIKE ? OR role LIKE ? OR department LIKE ? OR position LIKE ? OR remarks LIKE ? OR landline LIKE ?r  r   r›   zàSELECT * FROM contacts WHERE company LIKE ? OR contact_name LIKE ? OR phone LIKE ? OR email LIKE ? OR role LIKE ? OR department LIKE ? OR position LIKE ? OR remarks LIKE ? OR landline LIKE ? ORDER BY id DESC LIMIT ? OFFSET ?zSELECT COUNT(*) FROM contactsz8SELECT * FROM contacts ORDER BY id DESC LIMIT ? OFFSET ?r�  )r…  r  r   r   r€   re  rÀ   rÁ   r.  r‚   r1  rÝ   r2  r„   r»  rÕ  rz  r{  s               r	   rÜ  z!SearchHandler.handle_contact_page  së  € ô �4—>‘> &¨&°#Ó6Ó7ˆàˆ	à�N‰N˜6 3¨Ó+×1Ñ1Ó3ˆä�‰Ô/Ó0ˆä"Ÿ;™;ˆÔà�K‰K‹Mˆáà�I‰Ið  ^ð  cdð  efð  dgð  ghð  aið  mnð  opð  nqð  qrð  ksð  wxð  yzð  x{ð  {|ð  u}ð  ABð  CDð  BEð  EFð  Gð  KLð  MNð  LOð  OPð  IQð  UVð  WXð  VYð  YZð  S[ð  _`ð  abð  `cð  cdð  ]eð  ijð  klð  jmð  mnð  goð  stð  uvð  twð  wxð  qyð  `zô  {à—J‘J“L ‘OˆEà˜Q‘h )Ñ+ˆFà�I‰Ið  yð  ~ð  @Að  Bð  BCð  |Dð  HIð  JKð  ILð  LMð  FNð  RSð  TUð  SVð  VWð  PXð  \]ð  ^_ð  ]`ð  `að  Zbð  fgð  hið  gjð  jkð  dlð  pqð  rsð  qtð  tuð  nvð  z{ð  |}ð  {~ð  ~ð  x@ð  DEð  FGð  EHð  HIð  BJð  NOð  PQð  ORð  RSð  LTð  V_ð  agð  {hõ  ið �I‰IÐ5Ô6à—J‘J“L ‘OˆEà˜Q‘h )Ñ+ˆFà�I‰IÐPÐS\Ð^dÐReÔfà!"§¡£Ö.˜A”�Q•Ð.ˆÐ.à�
‰
Œä˜!˜e iÑ/°!Ñ3¸	ÑAÓBˆà×Ñ  T×%=Ñ%=¸aÀÀuÈdÐT]Ð_jÐlrÓ%sÕtùò /s   Å.Gc           	      ó¢  — t         dz   }d|z   dz   }	|	dz  }	|	dz  }	|	dz  }	|	dz  }	dD ]&  \  }
}}|
d	k(  rd
nd}|	d|z   dz   |z   dz   |z   dz   z  }	Œ( |	dz  }	|	t        | j                  «      z  }	|	dz  }	|	dz  }	|	dz  }	|	dt        |«      z   dz   z  }	|	dz  }	|	dz  }	|	dt	        |«      z   dz   z  }	|	dz  }	t        |«      D �]ß  \  }}|	dz  }	|	dz  }	|	dt        |j                  dd«      xs d«      z   dz   z  }	|	dz  }	|	dt        |j                  d d«      xs d«      z   d!z   z  }	|	d"t        |j                  d#d«      xs d«      z   d!z   z  }	|j                  d$«      r|	d%t        |d$   «      z   d!z   z  }	t        |j                  d&«      «      }|r|	d't        |«      z   d!z   z  }	|j                  d(«      r|	d)t        |d(   «      z   d!z   z  }	|j                  d*«      r|	d+t        |d*   «      z   d!z   z  }	|j                  d,«      r|	d-t        |d,   «      z   d!z   z  }	|j                  d.«      r|	d/t        |d.   «      z   d!z   z  }	|j                  d0«      r|	d1t        |d0   «      z   d!z   z  }	|	dz  }	|j                  d#d«      }|r|	d2t        |«      z   d3z   z  }	|	dz  }	�Œâ |d4kD  r#i }|r||d5<   |	| j                  ||d6|||¬7«      z  }	|	d8z  }	|	S )9Na  

.contact-card{border:1px solid #e8e8e8;border-radius:8px;padding:16px;margin-bottom:12px;background:#fafafa;display:flex;align-items:flex-start;gap:16px}

.contact-body{flex:1;min-width:0}

.contact-dial{flex-shrink:0;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:8px}

.contact-dial a{display:flex;align-items:center;justify-content:center;width:48px;height:48px;border-radius:50%;background:#1a73e8;color:#fff;text-decoration:none;font-size:22px}

.contact-dial a:hover{background:#1557b0}

u³   <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>è�”ç³»äººDB - BJIIRé¡¹ç›®åº“</title><style>r  r  r€  r�  r‚  rƒ  r1  r†  r   r›  rŽ   r�   rè  r´  r‡  z8<form class="search-box" method="get" action="/contact">uP   <input name="q" placeholder="æ�œç´¢å…¬å�¸å��ã€�è�”ç³»äººã€�æ‰‹æœºå�·â€¦" value="r³  rˆ  ú+<div class="toolbar"><div class="controls">u   <span class="total-count">å…± u    æ�¡è�”ç³»äºº</span>rO  z<div class="contact-card">z<div class="contact-body">zL<div style="font-size:16px;font-weight:600;color:#1a1a2e;margin-bottom:6px">r  z`<div style="font-size:13px;color:#666;display:flex;flex-wrap:wrap;gap:4px 16px;line-height:1.6">uC   <span><span style="color:#888;margin-right:2px">è�”ç³»äººï¼š</span>r_  r²  u@   <span><span style="color:#888;margin-right:2px">æ‰‹æœºï¼š</span>r  rc  u@   <span><span style="color:#888;margin-right:2px">åº§æœºï¼š</span>rG  u@   <span><span style="color:#888;margin-right:2px">è§’è‰²ï¼š</span>r`  u@   <span><span style="color:#888;margin-right:2px">éƒ¨é—¨ï¼š</span>ra  u@   <span><span style="color:#888;margin-right:2px">è�ŒåŠ¡ï¼š</span>rc  u@   <span><span style="color:#888;margin-right:2px">å¤‡æ³¨ï¼š</span>rd  u@   <span><span style="color:#888;margin-right:2px">é‚®ç®±ï¼š</span>rb  u@   <span><span style="color:#888;margin-right:2px">åœ°å�€ï¼š</span>z'<div class="contact-dial"><a href="tel:u   ">â˜Ž</a></div>r›   r«   r-  r°  r²  )	rµ  r¹  r£  r“   r�   r³  r   r$   r¶  )rƒ  r«   ræ   rD  r7  r8  r.  rC  ró  rg  rô  rõ  rö  r÷  rþ  r  rI  r  r  s                      r	   rz  z!SearchHandler.render_contact_list8  sº  € äð ñ ˆð Bð  CFñ  Fð  G^ñ  ^ˆà	Ð&Ñ&ˆð 	
Ð Ñ ˆà	Ð5Ñ5ˆà	Ð&Ñ&ˆð -jò 	DÑ(ˆF�I˜yà$*¨iÒ$7‘.¸RˆCà�˜YÑ& sÑ*¨3Ñ.¨sÑ2°9Ñ<¸VÑCÑC‰Að		Dð 	
ˆX‰ˆà	Œ^˜DŸM™MÓ*Ñ*ˆà	ˆX‰ˆð 	
Ð+Ñ+ˆà	ÐGÑGˆà	ð  Jô  KNð  OPó  KQñ  Qð  RVñ  Vñ  	Vˆà	Ð9Ñ9ˆð 	
Ð:Ñ:ˆà	Ð0´°U³Ñ;Ð<^Ñ^Ñ^ˆà	ˆ^Ñˆô   “oó &	‰FˆC�àÐ-Ñ-ˆAàÐ-Ñ-ˆAàÐ_Ô`cÐde×diÑdiÐjsÐtvÓdwÒd}Ð{}Ó`~Ñ~ð  @Hñ  Hñ  HˆAàÐsÑsˆAàÐbÔcfÐgh×glÑglÐm{Ð|~Ógò  hFð  DFó  dGñ  Gð  HQñ  Qñ  QˆAàÐ\Ô]`Ðab×afÑafÐgnÐoqÓarÒaxÐvxÓ]yÑyð  {Dñ  Dñ  DˆAà�u‰u�ZÔ  !Ð'rÔsvÐwxð  zDñ  xEó  tFñ  (Fð  GPñ  (Pñ  #P !ä(¨¯©¨v«Ó7ˆEá�aÐfÔgjÐkpÓgqÑqÐr{Ñ{Ñ{�aà�u‰u�\Ô" AÐ)tÔuxÐyzð  |Hñ  zIó  vJñ  *Jð  KTñ  *Tñ  %T Aà�u‰u�ZÔ  !Ð'rÔsvÐwxð  zDñ  xEó  tFñ  (Fð  GPñ  (Pñ  #P !à�u‰u�YÔ Ð&qÔruÐvwð  yBñ  wCó  sDñ  'Dð  ENñ  'Nñ  "N à�u‰u�WŒ~˜qÐ$oÔpsÐtuÐv}Ñt~ÓpÑ$ð  AJñ  %Jñ   J˜qà�u‰u�YÔ Ð&qÔruÐvwð  yBñ  wCó  sDñ  'Dð  ENñ  'Nñ  "N à�ÑˆAà—E‘E˜' 2Ó&ˆEáàÐ>¼sÀ5»zÑIÐJ^Ñ^Ñ^�à�‰MŠAðM&	ðT ˜Š?àˆJá A�*˜S‘/à�—‘˜t [°*¸jÐV[Ðaj�ÓkÑkˆAà	Ð)Ñ)ˆàˆr   c           	      ó€  ‡‡‡— ddl m} t        | j                  |dd«      «      }| j                  |dd«      j	                  «       Š| j                  |dd«      j	                  «       Š| j                  |dd«      j	                  «       Š| j                  |d	d
«      }d}‰}‰r||rdndz   ‰z   }‰r||rdndz   ‰z   }t        ||||«      \  }}t        d||z   dz
  |z  «      }	t        dz   }
d|
z   dz   }|dz  }|dz  }|dz  }|dz  }dD ]&  \  }}}|dk(  rdnd}|d|z   dz   |z   dz   |z   dz   z  }Œ( |dz  }|t        | j                  «      z  }|dz  }|dz  }|dz  }|d |‰«      z   d z   z  }|d!z  }d"d#d$d%d&œ}ˆˆˆfd'„}|d(z  }|j                  «       D ]#  \  }}||k(  rd)nd*}|d+|› d, ||«      › d |› d�z  }Œ% |d-z  }|d.z  }|d/|dkD  rd0t        |«      z   d1z   ndz   d2z   t        |«      z   d3z   z  }|d-z  }t        |«      D �]X  \  }}t        |j                  d4«      xs( |j                  d5«      xs |j                  d6«      xs d«      } ||j                  d7d«      xs d«      }|d8z  }|d9t        |dz   «      z   d:z   z  }|d;z  }|d<|z   d z   |z   d=z   z  }|d>z  }|j                  d?«      r|d@ ||d?   «      z   d:z   z  }|j                  dA«      r|dB ||dA   «      z   d:z   z  }|j                  dC«      r6|dB ||dC   «      z   |j                  dD«      rdE ||dD   «      z   ndz   d:z   z  }|j                  dF«      r|dB ||dF   «      z   d:z   z  }|dGz  }�Œ[ |dz  }|	dkD  r;i }‰r‰|d<   ‰r‰|d<   ‰r‰|d<   |d
k7  r||d	<   || j                  ||	dH|||¬I«      z  }|dJz  }| j                  dK|«       y )LNr   ©rb  r7  r´  r«   r   r›  rœ  r¤   rô   r  r´   r›   rÿ  u±   <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>ä¸­é¡¹ç½‘ - BJIIRé¡¹ç›®åº“</title><style>r  r  r€  r�  r‚  rƒ  r…  r†  r›  rŽ   r�   rè  r´  r‡  z5<form class="search-box" method="get" action="/ccpc">u>   <input name="q" placeholder="æ�œç´¢ä¸­é¡¹ç½‘é¡¹ç›®â€¦" value="r³  rˆ  r‰  rŠ  r‹  rŒ  r�  c                 ó”  •— g }‰r1|j                  dt        j                  j                  ‰«      z   «       ‰r1|j                  dt        j                  j                  ‰«      z   «       ‰r1|j                  dt        j                  j                  ‰«      z   «       | dk7  r|j                  d| z   «       ddj	                  |«      z   S )Nrw  rx  ry  rô   rz  z/ccpc?r‹   r{  )rú  rß  r«   r›  rœ  s     €€€r	   Ú_date_chip_urlz;SearchHandler.handle_cceup_projects.<locals>._date_chip_urlû  s—   ø€ ØˆBÙ�"—)‘)˜D¤6§<¡<×#5Ñ#5°aÓ#8Ñ8Ô9Ù�2—9‘9˜U¤V§\¡\×%7Ñ%7¸Ó%;Ñ;Ô<Ù�2—9‘9˜U¤V§\¡\×%7Ñ%7¸Ó%;Ñ;Ô<Ø�UŠ{˜BŸI™I h°¡mÔ4Ø˜cŸh™h r›lÑ*Ð*r   uÇ   <div class="search-tools"><div class="date-bar" style="display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:8px"><span style="font-size:13px;color:#333;margin-right:4px">æ—¶é—´</span>rŽ  r�  r�  ræ  rO  r~  r›  rœ  r�  rž  rŸ  r+   r  r   r  r¡  r¢  r²  r£  z<h3><a href="/ccpc/project/r
  r¤  r9  r¯  r  r¥  r   r"  r>  r-  r5  r+  r°  r²  r�  )ra  rb  r…  r  r   r‡  r»  rµ  r¹  r£  r·  r�   r³  r   r¶  rÕ  )rƒ  r=  rb  r7  r;  r8  rò  rD  ræ   r.  ró  rg  rô  rõ  rö  r÷  rù  r‚  rú  rû  rü  rþ  r  ri  r  r  r«   r›  rœ  s                             @@@r	   rÝ  z#SearchHandler.handle_cceup_projects°  s(  ú€ åä�4—>‘> &¨&°#Ó6Ó7ˆà�N‰N˜6 3¨Ó+×1Ñ1Ó3ˆà�^‰^˜F D¨"Ó-×3Ñ3Ó5ˆà�^‰^˜F D¨"Ó-×3Ñ3Ó5ˆà—N‘N 6¨7°EÓ:ˆ	àˆ	àˆ
á˜J±©#ÀÑDÀrÑIˆzá˜J±©#ÀÑDÀrÑIˆzä" :¨t°YÀ	ÓJ‰ˆˆtä˜!˜e iÑ/°!Ñ3¸	ÑAÓBˆäð ñ ˆð @ð  ADñ  Dð  E\ñ  \ˆà	Ð&Ñ&ˆð 	
Ð Ñ ˆà	Ð5Ñ5ˆà	Ð&Ñ&ˆð -jò 	DÑ(ˆF�I˜yà$*¨gÒ$5‘.¸2ˆCà�˜YÑ& sÑ*¨3Ñ.¨sÑ2°9Ñ<¸VÑCÑC‰Að		Dð 	
ˆX‰ˆà	Œ^˜DŸM™MÓ*Ñ*ˆà	ˆX‰ˆð 	
Ð+Ñ+ˆà	ÐDÑDˆà	ÐeÑflÐmnÓfoÑoÐptÑtÑtˆà	Ð9Ñ9ˆð 6Ð=YÐa{ð  Eeñ  fˆö	+ð 	
ð  Wñ  	WˆØ—n‘nÓ&ò 	K‰FˆB�Ø&/°2¢o‘?¸;ˆDØ�:˜d˜V 8©N¸2Ó,>Ð+?¸rÀ"ÀÀTÐJÑJ‰Að	Kð 	
ˆ^Ñˆð 	
Ð:Ñ:ˆà	Ð)ÐglÐopÒgp¨Y¼¸U»Ñ-CÐFcÒ-cÐvxÑyð  }Fñ  Fô  GJð  KOó  GPñ  Pð  Qañ  añ  	aˆà	ˆ^Ñˆô   “oó 	&‰FˆC�ä�a—e‘e˜D“kÒN Q§U¡U¨<Ó%8ÒN¸A¿E¹EÀ%»LÒNÈBÓOˆCá˜!Ÿ%™% ¨rÓ2Ò8°bÓ9ˆDàÐ,Ñ,ˆAàÐ%¬¨C°©E«
Ñ2°YÑ>Ñ>ˆAàÐ'Ñ'ˆAàÐ.¨sÑ2°4Ñ7¸Ñ<¸[ÑHÑHˆAàÐ%Ñ%ˆAà�u‰u�WŒ~˜qÐ$DÁVÈAÈgÉJÓEWÑ$WÐXaÑ$aÑa˜qà�u‰u�XŒ  X©f°Q°x±[Ó.AÑ%AÀ)Ñ%KÑ K à�u‰u�ZÔ  ! x±°q¸±}Ó0EÑ'EÐ`a×`eÑ`eÐflÔ`mÀsÉ6ÐRSÐTZÑR[ÓK\ÒG\ÐsuÑ'vð  xAñ  (Añ  #A !à�u‰u�^Ô$ a¨8±F¸1¸^Ñ;LÓ4MÑ+MÈiÑ+WÑ&W aàÐ%Ñ%ŠAð1	&ð2 	
ˆX‰ˆà˜Š?àˆJá A�*˜S‘/á b�:˜dÑ#á b�:˜dÑ#à˜EÒ!¸ :¨gÑ#6à�—‘˜t [°'¸:ÐSXÐ^g�ÓhÑhˆAà	Ð)Ñ)ˆà×Ñ  QÕ'r   c                 óD  — 	 t        |xs dj                  d«      j                  d«      d   «      }t        j                  t        «      }t
        j                  |_	        	 |j                  d|f«      j                  «       }|s#| j	                  dd«       |j                  «        yt        |«      }|j                  d|f«      D �cg c]  }t        |«      ‘Œ }}|j                  «        t        | d	d«      xs d}d
t        |j!                  d«      xs d«      z   dz   t"        z   t$        z   dz   t'        |«      z   dz   }	|	t)        ||«      z  }	|	dz  }	| j	                  d|	«       y# t        $ r | j	                  dd«       Y yw xY wc c}w # |j                  «        w xY w)ué  ä¸­é¡¹ç½‘(CCPC)é¡¹ç›®ç‹¬ç«‹è¯¦æƒ…é¡µã€‚

        2026-09-11 ç»Ÿä¸€ï¼šåŽŸå®žçŽ°æ˜¯å�¦ä¸€å¥—è€�è®¾è®¡ï¼ˆ.detail-wrap/.detail-title/
        .detail-card/.detail-grid/.label/.value/.detail-text + è‡ªå¸¦ä¸€å¤§æ®µ <style>ï¼‰ï¼Œ
        ä¸Ž v2 è¯¦æƒ…é¡µ/æŠ½å±‰å®Œå…¨ä¸¤å¥—è§†è§‰ï¼Œä¸”æœ«å°¾å¤šå‡º 1 ä¸ªæ¸¸ç¦» </div>ã€‚
        çŽ°æ”¹ä¸º PAGE_SHELL_CSS + DETAIL_CSS + render_cceup_detail_body()ï¼Œ
        ä¸Ž /crawler/project/*ã€�/zc/project/* ä¸€è‡´ï¼Œå¹¶ä¿�ç•™è€�ç‰ˆçš„å…¨éƒ¨å­—æ®µã€‚
        r   r>  rÆ   r˜  r  Nrv  z;SELECT * FROM cceup_contacts WHERE project_id=? ORDER BY idr£  rò  r  u   ä¸­é¡¹ç½‘é¡¹ç›®u!    Â· BJIIRé¡¹ç›®åº“</title><style>u�   </style></head><body><div class="wrap"><div class="bk-bar"><a class="bk" href="/ccpc" onclick="history.back();return false">â†� è¿”å›žåˆ—è¡¨</a>r´  r$  r�  )r…  r{  r   Ú
ValueErrorrÕ  r   r€   r~  rÀ   rÁ   r‚   r1  r„   r2  rÒ  r“   r   r  r  r¹  rZ  )
rƒ  rÖ   ri  r‡   r  r    rf   r�  r  rg  s
             r	   rà  z)SearchHandler.handle_cceup_project_detailB  s²  € ð	>Ü�t’z˜r×)Ñ)¨#Ó.×4Ñ4°SÓ9¸"Ñ=Ó>ˆCô �‰œÓ/ˆÜ"Ÿ;™;ˆÔð	Ø—‘ÐFÈÈÓO×XÑXÓZˆAÙØ×'Ñ'¨¨[Ô9ð
 �J‰J�Lô	 �Q“ˆAØ)-¯©ØMÐPSÈvó*Wö X Aœ˜Q�ð XˆHð Xð �J‰JŒLÜ˜˜z¨2Ó.Ò4°"ˆðä˜QŸU™U >Ó2ÒGÐ6GÓHñIðLñô (ñ(ô +5ñ5ð8KñKô ˜fÓ%ñ&ð )1ñ1ˆð 	
Ô% a¨Ó2Ñ2ˆØ	Ð#Ñ#ˆØ×Ñ  QÕ'øô1 ò 	>Ø×#Ñ# C¨Ô5±vð	>üòXøð �J‰J�Lús5   ‚0E' Á!5F Â' F ÃFÃF Å'FÆFÆF ÆFc                 óz  — t        | j                  |dd«      «      }t        |«      }|s| j                  dd«       y ddlm}  ||j                  dd«      «      } ||j                  d	«      xs d
«      }|j                  d«      xs d
}|j                  d«      xs d
}|j                  dd«      }	|j                  dd
«      }
|j                  d«      xs d
}|j                  d«      xs d
}|j                  d«      xs d
}t        |t        «      r=|j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}|rd ||«      › d�nd
}d|› d|› d�}|
rt        |
«      nd
}t        |j                  dd
«      |j                  d«      «      }|rt        |«      dkD  rd|v sd|v r|}n1|rt        |«      dkD  rt        |«      }n|
rt        |
«      dkD  r|}nd}|rd|› d �nd
}| j                  |d!d
«      }| j                  |d"d#«      }| j                  |d$d
«      }| j                  |dd
«      }| j                  |d%d&«      }| j                  |d'd(«      }d)}d
j                  g d*‘|› ‘d+‘|› ‘d,‘t        j                   j#                  |«      › ‘d-‘|› ‘d.‘|› ‘d/‘|› ‘d0‘|› ‘d1‘|› ‘d2‘|› ‘d3‘|› ‘d4‘|› ‘d5‘|xs d6› ‘d7‘|	xs d› ‘d8‘|j                  d9d«      xs d› ‘d:‘|› ‘d;‘|xs |› ‘d<‘|xs |› ‘d=‘|› ‘d>‘|› ‘d?‘|› ‘d@‘«      }| j                  dA|«       y c c}w )BNr+   r   r˜  r  r   r€  rw   ÚUnknownr±  r   r:  r-  r}  u	   å·²é‡‡é›†r  r™  rš  r³  r	  rO  r²  z<a href="/detail?id=z">#rè  r  r[  r  z<p>z<tableue   <p class="no-summary">æ­£æ–‡å†…å®¹æœªé‡‡é›†å®Œæ•´ï¼Œè¯·ç‚¹å‡»ä¸‹æ–¹åŽŸæ–‡é“¾æŽ¥æŸ¥çœ‹å®Œæ•´ä¿¡æ�¯</p>uW   <p class="detail-source-item"><span class="detail-label">ðŸ“¡ æ�¥æº�ç½‘ç«™</span><span>z</span></p>r«   rà   r  r9  r7  r´  r8  r   a¿  body{font-family:-apple-system,"Microsoft YaHei",sans-serif;background:#f5f5f5;margin:0;padding:0;color:#333}

        .container{max-width:800px;margin:0 auto;padding:20px 20px 56px}

        .nav-bar{margin-bottom:12px}.nav-bar a{color:#4361ee;text-decoration:none;font-size:14px}

        .detail-card{background:#fff;border-radius:12px;box-shadow:0 1px 4px rgba(0,0,0,.08);padding:24px}

        .detail-title{font-size:24px;margin-bottom:16px;color:#1a1a2e}

        .detail-meta{display:flex;flex-wrap:wrap;gap:12px;margin-bottom:20px;font-size:13px;color:#666;align-items:center}

        .detail-meta span{background:#f0f0f0;padding:4px 10px;border-radius:4px}

        .detail-status{color:#2e7d32;background:#e8f5e9!important}

        .detail-visits{color:#e65100}

        .detail-body{font-family:-apple-system,BlinkMacSystemFont,"Microsoft YaHei","PingFang SC",sans-serif;font-size:15px;line-height:1.6;color:#333}

        .detail-body p{margin:6px 0}.detail-body table{border-collapse:collapse;width:100%;margin:14px 0;font-size:14px}.detail-body td,.detail-body th{border:1px solid #ddd;padding:8px 12px;text-align:left;vertical-align:top}.detail-body tr:nth-child(even){background:#f9f9f9}

        .detail-source{border-top:1px solid #e5e7eb;padding-top:16px;margin-top:20px;font-size:14px}

        .detail-source-item{margin:8px 0}

        .detail-label{color:#888;margin-right:8px}

        .detail-original-link{color:#4361ee;word-break:break-all}r~  z</title><style>zX</style></head><body><div class="container">

        <div class="nav-bar"><a href="/?q=z&sort=z&phase=z
&category=r  z&page_size=uw   " if search_q else '/'">&larr; è¿”å›žæ�œç´¢ç»“æžœ</a></div>

        <div class="detail-card"><h1 class="detail-title">z(</h1>

        <div class="detail-meta">r¥  u   </span><span>ðŸ“… r¦  z#</span><span class="detail-status">u(   </span><span class="detail-visits">ðŸ‘� Úvisitsu:    æ¬¡è®¿é—®</span></div>

        <div class="detail-body">u…   </div>

        <div class="detail-source"><p class="detail-source-item"><span class="detail-label">ðŸ”— åŽŸæ–‡é“¾æŽ¥</span><a href="z>" target="_blank" rel="noopener" class="detail-original-link">z</a></p>uH   <p class="detail-source-item"><span class="detail-label">æ•°æ�®ID</span>z7</p></div></div>

        <script>fetch('/api/visit?id=z');</script></body></html>r�  )r…  r  rs  rÕ  ra  rb  r   rÙ  r�   r   r   r™   r	  r]   r   rž  rŸ  r   )rƒ  r=  rr  Úrecordrb  rw   r±  r´  r²  r}  r  r™  rš  r³  ro   Úcat_htmlÚrecord_id_strÚsummary_htmlÚcontent_rawÚ	body_htmlÚshow_sourceÚsearch_qÚsearch_sortÚsearch_phaseÚsearch_categoryÚsearch_pageÚsearch_psizeró  rg  s                                r	   rÚ  zSearchHandler.handle_detaili  sE  € ä˜Ÿ™ v¨t°SÓ9Ó:ˆ	ä˜IÓ&ˆá�t×.Ñ.¨s°KÔ@À&åá�v—z‘z '¨9Ó5Ó6ˆá�f—j‘j Ó(Ò.¨BÓ/ˆà�j‰j˜Ó$Ò*¨ˆà�z‰z˜.Ó)Ò/¨Rˆà—‘˜H kÓ2ˆà—*‘*˜Y¨Ó+ˆà—:‘:˜jÓ)Ò/¨Rˆà—Z‘Z Ó-Ò3°ˆ
à�z‰z˜&Ó!Ò' Rˆä�dœCÔ ¸T¿Z¹ZÈ»_Ö)Z¸ÐPQ×PWÑPWÕPY¨!¯'©'­)Ð)Z $Ð)ZáFIÐ-©f°S«k¨]¸'ÑBÈrˆà.¨y¨k¸¸Y¸KÀtÐLˆá-4”y Ô)¸"ˆÜ" 6§:¡:¨i¸Ó#<¸f¿j¹jÈÓ>WÓXˆáœ3˜{Ó+¨bÒ0°e¸{Ñ6JÈhÐZeÑNeØ#‰IÙœS Ó-°Ò2ä! +Ó.‰IÙœ˜W›¨Ò*Ø$‰IàˆIñ FJÐoÐptÐouð  vAñ  Bð  PRˆà—>‘> &¨#¨rÓ2ˆà—n‘n V¨V°[ÓAˆà—~‘~ f¨g°rÓ:ˆàŸ.™.¨°¸RÓ@ˆà—n‘n V¨V°SÓ9ˆà—~‘~ f¨k¸4Ó@ˆðEˆ÷<Nó Nð  Yð Nð  Z_ð  Y`ð Nð  `oð Nð  psð  otð Nð t+ð Nä+1¯<©<×+=Ñ+=¸hÓ+GÐ*HðNàHNðNàOZÈmðNà[bðNàcoÐbpðNàpzðNð |Kð  {LðNð LRðNð S^ð  R_ðNð _jðNð kwð  jxðNðx;ðNð <A¸'ð	NðB"ð	Nð #+ ðNð ,2ðNð 37°ðNð 8JðNð KOÒJ`ÐR`ÐIaðNð bEðNð FLò  F[ð  P[ð  E\ðNð \DðNð EK÷  EOñ  EOð  PXð  YZó  E[ò  E`ð  _`ð  DaðNða"ðNð #, ðNð-~ðNð Gò  Uð  KUð  ~VðNð VTðNð U]ò  Ukð  akð  TlðNð ltðNð u@ð  tAðNð AIðNð JWð  IXðNðX&ðNð '0 [ðNð 1KôNˆð 	×Ñ  QÕ'ùò_ *[s   Ä&L8Ä<L8c                 óÞ   — t        | j                  |dd«      «      }|r=t        «       }|j                  d|f«       |j	                  «        |j                  «        | j                  dd«       y )Nr+   r   z1UPDATE gov_raw SET visits = visits + 1 WHERE id=?r�  r¦  )r…  r  rÂ   r‚   rƒ   r„   rÕ  )rƒ  r=  rr  r‡   s       r	   rã  zSearchHandler.handle_visitØ  sU   € ä˜Ÿ™ v¨t°SÓ9Ó:ˆ	áä“8ˆDà�L‰LÐLÈyÈlÔ[à�K‰KŒM˜4Ÿ:™:œ<à×Ñ  TÕ*r   c                 ó(   — | j                  dd«       y )Nr�  z><html><body><h1>Dashboard</h1><p>Coming soon</p></body></html>rS  ©rƒ  s    r	   rá  zSearchHandler.handle_dashboardè  s   € à×Ñ Ð%eÕfr   c                 ó*   — | j                  dg i«       y )NÚsources)rÖ  r—  s    r	   râ  z SearchHandler.handle_sources_apiî  s   € à�‰˜	 2�Õ'r   c                 ó2  — t        j                  |d¬«      j                  «       }| j                  d«       | j	                  dd«       | j	                  dt        t        |«      «      «       | j                  «        | j                  j                  |«       y )NFrö  r�  ru  r¼  rt  )
r  r  ry  r|  r  r�   r]   r€  r�  r‚  )rƒ  r³  r›  s      r	   rÖ  zSearchHandler.send_jsonô  sq   € ä�J‰J�t¨%Ô0×7Ñ7Ó9ˆà×Ñ˜3Ôà×Ñ˜Ð)JÔKà×ÑÐ)¬3¬s°1«v«;Ô7à×ÑÔà�
‰
×Ñ˜Õr   c                  ó   — y r\   rd   )rƒ  rm  rl  s      r	   Úlog_messagezSearchHandler.log_message  s   � r   ©r   rë   )r   r   r   )r   r   r   N)#Ú__name__Ú
__module__Ú__qualname__r‹  r�  rþ  rÐ  rÏ  rÞ  rß  rE  r  rË  rÑ  rÌ  rä  rÕ  rÓ  rÔ  r¶  rÙ  r0  r/  rx  rÛ  rÜ  rz  rÝ  rà  rÚ  rã  rá  râ  rÖ  rœ  rd   r   r	   rm  rm  é  sÑ   „ ò!òF0ò _RòF^,òB!(òF`(òH*ò&FRóT,òòDò<(ò,.ò8ò(y	(òzh(ód-ò`V0ópI ðV IKØ$(óGòV6ò|(uòX)uòZtòpN(òd#(òNk(ò^+ò gò(òó  /r   rm  ú)/root/gov_crawler/daily_crawl_config.jsonr–  z,/root/gov_crawler/admin_exclude_keywords.txtz*/root/gov_crawler/admin_block_keywords.txtÚPower)r+   rë  ÚenÚ	TerminalszPort & HarborÚTransmissionÚ
ProductionzAlternative Fuelz%HPI (Hydrocarbon Processing Industry)z"CPI (Chemical Processing Industry)zMetals & MineralszPulp, Paper & WoodzFood & BeverageÚ	LogisticszIndustrial ManufacturingzPharmaceutical & Biotechc                  ó8   — dd l } | j                  t        d¬«      S )Nr   Frö  )r  r  r   )Ú_js    r	   Úget_industries_jsonrª  &  s   € ÛØ�8‰8”J¨Uˆ8Ó3Ð3r   rë  c                 ó4   — | syt         j                  | | «      S )uK   è¡Œä¸š id â†’ ä¸­æ–‡å��ï¼ˆè¯¦æƒ…é¡µæ˜¾ç¤ºç”¨ï¼‰ï¼›æœªçŸ¥/other ä¿�æŒ�åŽŸæ ·r   )ÚINDUSTRY_CN_MAPr   )Úindustry_ids    r	   rd  rd  -  s   € áØÜ×Ñ˜{¨KÓ8Ð8r   c                 óÞ  — | sydD ]#  }| j                  |«      sŒ| t        |«      d }  n | t        v rt        j                  | d«      S t        j
                  j                  t        | «      }t        j
                  j                  |«      s
dt        | <   y	 t        |dd¬«      5 }|j                  d«      }ddd«       t        j                  dt        j                  «      }|s%t        j                  d	|t        j                  «      }|s%t        j                  d
|t        j                  «      }|r|j                  d«      nd}|t        | <   |S # 1 sw Y   ŒœxY w#  dt        | <   Y yxY w)z9Extract SITE_NAME constant from script source to match DBr   ©znode zbash zpython3 Nr  rr   r<  rd  z$^SITE_NAME\s*=\s*[\"']([^\"']+)[\"']z^NAME\s*=\s*[\"']([^\"']+)[\"']z^SITE\s*=\s*[\"']([^\"']+)[\"']r›   )rª   r]   Ú_SCRIPT_SITE_CACHEr   rÕ   rÖ   r   ÚGOV_CRAWLER_DIRrô  r  r  r   r   Ú	MULTILINEr'   )r[  ÚprefixÚscript_pathr˜  Úheadr(   rÿ  s          r	   Úextract_script_sitenamer¶  8  s?  € áØØ0ò ˆØ×!Ñ! &Õ)Ø%¤c¨&£k lÐ3ˆKÙðð Ô(Ñ(Ü!×%Ñ% k°2Ó6Ð6Ü—'‘'—,‘,œ°Ó<€KÜ�7‰7�>‰>˜+Ô&Ø*,Ô˜;Ñ'ØðÜ�+˜s¨9Ô5ð 	 ¸Ø—6‘6˜$“<ˆD÷	 ô
 	�	‰	Ð>ÀÄbÇlÁlÓS€AÙÜ�I‰IÐ=¸tÄRÇ\Á\ÓRˆÙÜ�I‰IÐ=¸tÄRÇ\Á\ÓRˆÙˆ�‰�Œ˜b€BØ&(Ô�{Ñ#Ø€I÷	 ð 	 ûðØ*,Ô˜;Ñ'Ùús$   ÂE Â&EÂ8E ÅEÅE ÅE,c                 ó  — | sydD ]#  }| j                  |«      sŒ| t        |«      d  }  n | t        v rt        j                  | d«      S t        j
                  j                  t        | «      }t        j
                  j                  |«      s
dt        | <   y	 t        |dd¬«      5 }|j                  d«      }d d d «       t        j                  d«      }|st        j                  d|«      }|st        j                  d	|«      }|st        j                  d
|«      }|st        j                  d|«      }|r |j                  d«      j                  d«      nd}|t        | <   |S # 1 sw Y   Œ®xY w#  dt        | <   Y yxY w)Nr   r¯  r  rr   r<  rd  zB(?m)^(?:LIST_URL|list_url|listUrl)\s*=\s*["'](https?://[^"']+)["']z?(?m)^(?:API_URL|api_url|apiUrl)\s*=\s*["'](https?://[^"']+)["']zP(?m)^(?:PAGE_URL|SEARCH_URL|search_url|BASE_URL)\s*=\s*["'](https?://[^"']+)["']zY(?m)^(?:BASE|base_url|DOMAIN)\s*=\s*["'](https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}[^"']*)["']z'(https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})r›   r>  )rª   r]   Ú_SCRIPT_URL_CACHEr   rÕ   rÖ   r   r±  rô  r  r  r   r   r'   r{  )r[  r³  r´  r˜  rµ  r(   r›  s          r	   Úextract_script_urlr¹  U  sk  € ÙØØ0ò ˆØ×!Ñ! &Õ)Ø%¤c¨&£k lÐ3ˆKÙðð Ô'Ñ'Ü ×$Ñ$ [°"Ó5Ð5Ü—'‘'—,‘,œ°Ó<€KÜ�7‰7�>‰>˜+Ô&Ø)+Ô˜+Ñ&ØðÜ�+˜s¨9Ô5ð 	 ¸Ø—6‘6˜$“<ˆD÷	 ô 	�	‰	Ð^Ð`dÓe€AáÜ�I‰IÐ_ÐaeÓfˆáÜ�I‰IÐpÐrvÓwˆáÜ�I‰IÐzð  }Aó  BˆáÜ�I‰IÐ@À$ÓGˆÙ$%ˆ!�'‰'�!‹*×
Ñ
˜CÔ
 ¨2€CØ%(Ô�kÑ"Ø€J÷+	 ð 	 ûðØ)+Ô˜+Ñ&Ùús$   ÂE1 Â&E%Â8E1 Å%E.Å*E1 Å1E>c                 ób  — t        j                  t        t        «      «      }t	        |t
        «      rd|i}|r|t        vrdd|› �dœS |d   D ]W  }|d   | k(  sŒ|r||d<   n|j                  dd«       t        j                  |t        t        d«      dd	¬
«       d| |xs ddœc S  dd| › d�dœS )z$Set industry for a crawler in configÚcrawlersFzUnknown industry: rÀ  r  r<  Nrk  rž   ©r÷  ÚindentTr   )r¿  r  r<  ú	Crawler "ú" not found)	r  rØ  r  ÚCONFIG_PATHrÙ  r5  ÚINDUSTRY_IDSÚpopÚdump)r  r­  Úcfgrµ   s       r	   rè  rè  z  sÂ   € ä
�)‰)”DœÓ%Ó
&€CÜ�#”tÔØ˜3ÐˆÙ�{¬,Ñ6Ø Ð-?À¸}Ð+MÑNÐNØ�‰_ò RˆØˆV‰9˜ÓÙØ +��*’à—‘�j $Ô'Ü�I‰I�cœ4¤¨SÓ1ÀÈaÕPØ#¨T¸{Ò?PÈbÑQÒQðRð ¨°D°6¸Ð'FÑGÐGr   c                  ó¬  ‡Q‡R— t        j                  t        t        «      «      } t	        | t
        «      rd| i} | d   }t        j                  t        «      }t        j                  |_
        |j                  d«      j                  «       }|D �ci c]  }|d   t        |«      “Œ }}d„ }|j                  «       D ��ci c]  \  }} ||«      |“Œ }	}}t        «       }
i }	 t!        d«      j                  t        «      }|j                  d«      j                  «       D ]E  }|
j#                  |d   «       |j%                  |d   t        «       «      j#                  |d   «       ŒG |j'                  «        |j'                  «        i }i }d	}	 t!        d«      j                  t        «      }t!        d«      j                  |_
        t!        d
«      j(                  j+                  «       j-                  d«      }|j                  d|f«      j                  «       D ]9  }t        |«      }|d   xs d|d   xs dfD ]  }|sŒ|j%                  ||«       Œ Œ; |j                  d|f«      j                  «       D ]]  }|d   |d   |d   dœ}|d   xs d|d   xs dfD ]7  }|sŒ|j%                  |g «      }t/        |«      dk  sŒ'|j1                  |«       Œ9 Œ_ |j'                  «        g }|D �]‚  }|j5                  d|j5                  d|j5                  dd«      «      «      }|j5                  d|j5                  dd«      «      }|j5                  dd«      }|sƒ|j5                  dd«      }t	        |t
        «      rdj7                  d„ |D «       «      }|rt9        j:                  d|«      nd}|s|rt9        j:                  d|«      nd}|r|j=                  d«      }|s|}|}|}d D ]#  } |j?                  | «      sŒ|t/        | «      d } n |r$t@        jB                  j7                  tD        |«      nd}!|!rt@        jB                  jG                  |!«      nd	}"d}#d}$|rMt@        jB                  jI                  |«      jK                  d!d«      }%|%d!z   }$|%j?                  d"«      r|%d#d }#n|%}#i }&|r||k7  rg }'n6t        t        jM                  |$|#fD �cg c]  }|sŒ||
v sŒ|‘Œ c}«      «      }'|'r¢	 t        «       }(|'D ]  }|(|j5                  |t        «       «      z  }(Œ! d})d$}*d$}+d},d}-|(D ]W  }.|j5                  |.«      }|sŒ|)|d%   z  })|d&   r|d&   |*kD  r|d&   }*|d'   r|+d$k(  s|d'   |+k  r|d'   }+|,|d(   z  },|-|d)   z  }-ŒY |)dkD  r|)|*|+|,|-d*œ}&|&s|j5                  |i «      }&|&s|	j5                   ||«      i «      }&|&s( ||«      }/|	j                  «       D ]  \  ŠR}‰R|/v sŒ|}& n |&s |	j                  «       D ]  \  ŠR}/‰Rv sŒ|}& n |&si|	j                  «       D ]V  \  ŠR}tO        t/        /«      t/        ‰R«      «      }0|0d#k\  sŒ*d}1tQ        |0«      D ]  }2|/|2   ‰R|2   k(  r|1dz  }1Œ n |1d+k\  sŒT|}& n |&sj/jS                  d$«      d   jS                  d,«      d   jS                  d-«      d   }3t/        |3«      d.k\  r$|	j                  «       D ]  \  ŠR}|3‰Rv s‰R|3v sŒ|}& n |&sbg d/¢}4/}3|4D ]$  }5|3jU                  |5«      sŒ|3dt/        |5«        }3 n t/        |3«      d.k\  r%|3|/k7  r |	j                  «       D ]  \  ŠR}|3‰Rv sŒ|}& n |&stW        |«      }6|6r	|6|v r||6   }&|&sŽ|rŒt@        jB                  jI                  |«      jK                  d!d«      }%|%j?                  d"«      rL|%d#d ŠQ|j                  «       D ]4  \  ŠR}‰QsŒ	‰Q‰Rv s%t/        ‰Q«      d+k\  sŒtY        ˆQˆRfd0„d1D «       «      sŒ2|}& n |&j5                  d%d«      }7|&j5                  d&d$«      }8|&j5                  d'd$«      }9|&j5                  d(d«      }:|&j5                  d)d«      };d	x}<x}=x}>}?|8rh|8d$k7  rc	 dd2lm}@m-}A  |@j\                  |8dd3 d«      }B |@j*                  «       |Bz
  }C|C |Ad+¬4«      k  }<|C |Ad5¬4«      k  }=|C |Ad6¬4«      k  }>|C |Ad7¬4«      k  }?d8}Dd}Eg }F	 |rt_        d9«      ‚|r|j5                  |«      nd}G|Gs||k7  r|j5                  |«      }GGs|j5                  |«      }GGr3Gj5                  d«      }H|Gj5                  d«      }I|Hd:k(  rd;I› d<�}Dnd=H› �}Dt        «       }Jg }Kt        jM                  |||g«      D ]u  }|j5                  |«      xs g D ][  }|j5                  d«      |j5                  d«      |j5                  d«      f}L|LJv rŒ:Jj#                  L«       Kj1                  |«       Œ] Œw Kja                  d>„ d¬?«       |Kdd }F|j1                  i d|“d|“dC|j5                  dCdD«      “dE|j5                  dEd«      “dF|j5                  dFd«      “d%|7“dG|8“dH|9“d(|:“d)|;“dI|<“dJ|<“dK|=“dL|>“dM|?“dN|"“dOD“EFdPœ¥«       �Œ… || fS c c}w c c}}w #  t        «       }
i }Y �	ŒxY w# t2        $ r
 d}i }i }Y �Œ¿w xY wc c}w #  Y �Œ&xY w#  Y �ŒxY w#  	 t        d@«      5 }Mt!        dA«      j                  |M«      }Nddd«       n# 1 sw Y   nxY wNj5                  |«      }O|OsNj5                  |«      }OOr(Oj5                  dBd«      }E|Oj5                  dd«      }P|PrP}Dn#  Y nxY wY �ŒaxY w)Qu!   èŽ·å�–æ‰€æœ‰çˆ¬è™«çš„çŠ¶æ€�æ•°æ�®r»  aÍ  
        SELECT site_name,
               COUNT(*) as total,
               MAX(SUBSTR(publish_date,1,10)) as latest_date,
               MIN(SUBSTR(publish_date,1,10)) as oldest_date,
               SUM(CASE WHEN SUBSTR(publish_date,1,10) >= date('now', '-7 days') THEN 1 ELSE 0 END) as week_new,
               SUM(CASE WHEN SUBSTR(publish_date,1,10) >= date('now', '-1 days') THEN 1 ELSE 0 END) as day_new
        FROM gov_raw
        GROUP BY site_name
    rœ  c                 óæ   — | j                  dd«      j                  dd«      j                  dd«      j                  dd«      j                  dd	«      j                  d
d«      j                  dd«      S ©Nr´   r   r»  r&   u   â€“u   ï¼ˆr±   u   ï¼‰r²   u   ã€€õ   Â rž  r‘   s    r	   Ú	normalizez$get_crawler_stats.<locals>.normalizeŸ  s„   € Ø�y‰y˜˜bÓ!×)Ñ)¨%°Ó5×=Ñ=¸eÀSÓI×QÑQÐRWÐY\Ó]×eÑeÐfkÐmpÓq×yÑyÐzð  BDó  E÷  Mñ  Mð  NRð  TVó  Wð  	Wr   r   zgSELECT DISTINCT script_name, site_name FROM gov_raw WHERE script_name IS NOT NULL AND script_name != ''r   r›   FÚdatetimer  zzSELECT script_name, config_name, status, new_count, elapsed_seconds, error_detail, run_time FROM run_logs WHERE run_date=?r[  r   Úconfig_namezsSELECT script_name, config_name, run_date, status, new_count FROM run_logs WHERE run_date<=? ORDER BY run_date DESCÚrun_dater}  Ú	new_count)rÌ  r}  rÍ  rË   Tr  r  Úcommandrl  r´   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr\   rb  r  s     r	   ra   z$get_crawler_stats.<locals>.<genexpr>Ù  s   è ø€ Ò1¨œc !ŸfÑ1ùrc  z--script-name=(\S+)Nz--script-name\s+(\S+)r¯  rÝ  Úcrawl_rw  r&   rD  Úlatest_dateÚoldest_dateÚweek_newÚday_new)rD  rÑ  rÒ  rÓ  rÔ  rm   r»  rl   rž   )õ   é€šçŸ¥å…¬å‘Šõ   å…¬ç¤ºå…¬å‘Šõ   çŽ¯å¢ƒä¿�æŠ¤õ   çŽ¯è¯„ä¿¡æ�¯õ   çŽ¯è¯„å…¬å‘Šõ   çŽ¯å¢ƒä¿¡æ�¯õ   æ”¿ç­–æ–‡ä»¶u   æ–°é—»ä¸“åŒºõ   çŽ¯è¯„å®¡æ‰¹õ   çŽ¯å¢ƒå½±å“�è¯„ä»·u   é«˜æ–°åŒºåŠ¨æ€�õ   å…¬å‘Šå…¬ç¤ºu   ç”Ÿæ€�çŽ¯å¢ƒä¿�æŠ¤c              3   ó,   •K  — | ]  }‰d | ‰v –— Œ y ­wr\   rd   )r^   rŸ   Úslugrÿ  s     €€r	   ra   z$get_crawler_stats.<locals>.<genexpr>W  s   øè ø€ ÒJkÐ^_È4ÐPRÐQRÈ8ÐWYÌ>ÑJkùs   ƒ)ry  rw  rÌ   )rÊ  Ú	timedeltar|   ©r@  rø   rÎ   r¨  u   â�³ ä»Šæ—¥å¾…è¿�è¡Œu$   run_logs é¢„è½½å¤±è´¥ -> é™�çº§ jsonõ   æˆ�åŠŸu   âœ…ä»Šæ—¥æˆ�åŠŸ +õ   æ�¡u	   â�Œä»Šæ—¥c                 ó,   — | j                  d«      xs dS )NrÌ  r   rG  )Ú_hs    r	   rg   z#get_crawler_stats.<locals>.<lambda>‰  s   € ¨¯©°
Ó);Ò)A¸r€ r   rÒ   ú!/root/gov_crawler/run_status.jsonr  Útsr'   u	   æœªåˆ†ç»„ÚenabledÚnoterµ  Úoldestr"  Ú	active_3dÚ	active_7dÚ
active_30dÚactive_180dÚscript_existsÚlast_run_status)Úlast_run_tsÚrun_logs_history)1r  rØ  r  rÀ  rÙ  r5  r   r€   rr  rÀ   rÁ   r‚   rÝ   r2  r·  r¸   Ú
__import__rß   r�  r„   rÊ  Únowr  r]   r   r…   r   r   r   r   r'   rª   rÕ   rÖ   r±  rô  rõ  rr   Úfromkeysr¼  r¤   r   rt   r¶  ru   rá  ÚstrptimeÚRuntimeErrorrà   )SrÄ  r»  r‚  ræ   r  Údb_statsrÉ  r…  r#   Údb_stats_normÚ_sn_setÚ_sn_to_sitesÚ_db_snÚ_rÚ	_rl_todayÚ_rl_histÚ_rl_load_failedÚ_connÚ_today_sÚ_drŸ  ræ  Ú_lstr»   rµ   r  r  rˆ  Ú_aÚ_mÚckeyÚscript_filer³  r´  rð  Úscript_name_keyÚscript_name_fullÚscript_baseÚstatsÚ_keys_to_tryÚ_sitesÚ_totalÚ_latestÚ_oldestÚ	_week_newÚ_day_newÚ_siteÚ	name_normÚmin_lenÚcommonrŸ   rç  Úcommon_suffixesÚsfxÚsite_name_from_scriptrD  rµ  rë  rÓ  rÔ  rì  rí  rî  rï  rÊ  rá  ÚldÚdeltarñ  rò  ró  Ú_rowÚ_stÚ_ncÚ_seenÚ_mergedÚ_sigrÞ  Ú_status_mapÚstatus_entryÚ
status_strrà  rÿ  sS                                                                                    @@r	   Úget_crawler_statsr'  ‹  sª  ù€ ä
�)‰)”DœÓ%Ó
&€CÜ�#”tÔØ˜3ÐˆØ�:‰€HÜ	�‰œÓ	#€BÜ—[‘[€B„Nà�:‰:ð 	ó 		÷ 
‰‹ð 	ð 26Ö6¨A��+‘¤ Q£Ñ'Ð6€HÐ6òWà19·±Ó1A×B©¨¨A‘Y˜q“\ 1‘_ÐB€MÑBô ‹e€GØ€LðÜ˜IÓ&×.Ñ.¬yÓ9ˆØ—.‘.ð  "Kó  L÷  Uñ  Uó  Wò 	=ˆBØ�K‰K˜˜1™ÔØ×#Ñ# B q¡E¬3«5Ó1×5Ñ5°b¸±eÕ<ð	=ð 	�‰Œð ‡H�H„Jð €IØ€HØ€OðÜ˜9Ó%×-Ñ-¬iÓ8ˆÜ& yÓ1×5Ñ5ˆÔÜ˜jÓ)×2Ñ2×6Ñ6Ó8×AÑAÀ*ÓMˆØ—-‘-ð1Ø3;°+ó?ç?G¹x»zò	1ˆBô �b“ˆBØ˜-Ñ(Ò.¨B°°=Ñ0AÒ0GÀRÐHò 1�ÚØ×(Ñ(¨¨RÕ0ñ1ð		1ð —-‘-ðIØKSÈ+óWçW_ÑW_ÓWaò	(ˆBð ! ™n¸¸8¹ÐSUÐVaÑSbÑcˆBØ˜-Ñ(Ò.¨B°°=Ñ0AÒ0GÀRÐHò (�ÚØ#×.Ñ.¨r°2Ó6�DÜ˜4“y 1“}ØŸ™ B�ñ	(ð		(ð 	�‰Œð €FØó SˆØ�u‰u�V˜QŸU™U ;°·±°hÀÓ0CÓDÓEˆØ—‘�x §¡ y°"Ó!5Ó6ˆà�e‰e�M 2Ó&ˆÙØ—‘�v˜rÓ"ˆBÜ˜"œdÔ#Ø—X‘XÑ1¨bÔ1Ó1�Ù:<”—‘Ð1°2Ô6À$ˆBÙÙ@B”R—Y‘YÐ7¸Ô<È�ÙØ—h‘h˜q“k�ÙØˆCØˆàˆØ4ò 	ˆFØ× Ñ  Õ(Ø$¤S¨£[ \Ð2�Ùð	ñ EP”b—g‘g—l‘l¤?°KÔ@ÐUWˆÙ7BœŸ™Ÿ™ {Ô3ÈˆØˆØÐÙÜŸ'™'×*Ñ*¨6Ó2×:Ñ:¸5À"ÓEˆKØ*¨UÑ2ÐØ×%Ñ% hÔ/Ø"-¨a¨b /‘à"-�ð ˆÙ�D˜F’NØ‰Lä¤§¡Ð;KÈ_Ð:]Ö.t°QÒabÐghÐlsÒgsªqÒ.tÓ uÓvˆLÙðÜ›�Ø&ò :�BØ˜l×.Ñ.¨r´3³5Ó9Ñ9‘Fð:à�Ø�Ø�Ø�	Ø�Ø#ò 	2�EØ!Ÿ™ eÓ,�BÚØ " W¡+Ñ-˜Ø˜mÒ,°°MÑ1BÀWÒ1LØ&(¨Ñ&7˜GØ˜mÒ,°'¸S².ÀBÀ}ÑDUÐX_ÒD_Ø&(¨Ñ&7˜GØ! R¨
¡^Ñ3˜	Ø  B y¡MÑ1™ð	2ð ˜A’:Ø&,¸WÐU\Ðjsð  AIñ  J�Eñ à—L‘L  rÓ*ˆEÙà!×%Ñ%¡i°£o°rÓ:ˆEÙá! $›ˆIØ&×,Ñ,Ó.ò ‘��AØ˜’?Ø�EÙðñ à&×,Ñ,Ó.ò ‘��AØ ’?Ø�EÙðñ à&×,Ñ,Ó.ò ‘��AÜœc )›n¬c°"«gÓ6�Ø˜a“<Ø�FÜ" 7›^ò "˜Ø$ Q™<¨2¨a©5Ò0Ø" a™K™Fá!ð	"ð
  “{Ø !˜Ùðñ à—?‘? 3Ó'¨Ñ*×0Ñ0°Ó7¸Ñ:×@Ñ@ÀÓFÀqÑIˆDÜ�4‹y˜AŠ~Ø*×0Ñ0Ó2ò ‘E�B˜Ø˜r‘z R¨4¢ZØ !˜Ùðñ òXˆOð ˆDØ&ò �Ø—=‘= Õ%Ø 
¤# c£( Ð+�DÙðô �4‹y˜AŠ~ $¨)Ò"3Ø*×0Ñ0Ó2ò ‘E�B˜Ø˜r’zØ !˜Ùðñ ä$;¸KÓ$HÐ!Ù$Ð)>À(Ñ)JØ Ð!6Ñ7�ÙáÜ Ÿg™g×.Ñ.¨vÓ6×>Ñ>¸uÀbÓI�Ø×)Ñ)¨(Ô3Ø& q r˜?�DØ!)§¡Ó!1ò "™˜˜AÚ T¨R¡Z´C¸³IÀ³NÄsÔJkÐcjÔJkÕGkØ$%˜EÙ!ð"ð —	‘	˜' 1Ó%ˆØ—‘˜=¨#Ó.ˆØ—‘˜=¨#Ó.ˆØ—9‘9˜Z¨Ó+ˆØ—)‘)˜I qÓ)ˆØ;@Ð@ˆ	Ð@�IÐ@ 
¨[Ù�f ’mð	ß8Ø&�X×&Ñ& v¨c¨r {°JÓ?�Ø$˜Ÿ™›¨Ñ+�Ø!¡Y°AÔ%6Ñ6�	Ø!¡Y°AÔ%6Ñ6�	Ø"¡i°RÔ&8Ñ8�
Ø#¡y°cÔ':Ñ:�ð 0ˆØˆØÐð*	ÙÜ"Ð#IÓJÐJá*.�9—=‘= Ô&°DˆDÙ˜D FšNØ —}‘} VÓ,�ÙØ —}‘} TÓ*�ÙØ—h‘h˜xÓ(�Ø—h‘h˜{Ó+�Ø˜(’?Ø(9¸#¸¸cÐ&B‘Oà(1°#°Ð&7�Oä“EˆEØˆGÜ—m‘m T¨6°4Ð$8Ó9ò '�Ø#Ÿ<™<¨Ó+Ò1¨rò '�BØŸF™F :Ó.°·±°xÓ0@À"Ç&Á&ÈÓBUÐV�DØ˜u‘}Ø Ø—I‘I˜d”OØ—N‘N 2Õ&ñ'ð'ð �L‰LÑBÈDˆLÔQØ& r¨˜{Ðð  	�‰ð 

Ø�Dð

Ø" Fð

Ø,3°Q·U±U¸7ÀKÓ5Pð

à�q—u‘u˜Y¨Ó-ð

à/5°q·u±u¸VÀRÓ7Hð

ð �Uð

ð % fð

ð /7¸ð

ð ˜ð	

ð #,¨Wð	

ð
 �ið

ð
 "-¨ið

ð
 :EÀið

ð ˜*ð

ð '4°[ð

ð ˜]ð

ð ˜ð

ð @KØ 0ò

ö 
	ðSSðh �3ˆ;ÐùòO 7ùó CøðÜ“%ˆØ‹ûô: ò ØˆØˆ	Ø‹ðüò^ /uøð.ÚûðnÚûðB	ðÜÐ=Ó>ð >À"Ü",¨VÓ"4×"9Ñ"9¸"Ó"=�K÷>÷ >ñ >úà*Ÿ™¨vÓ6�Ù#Ø#.§?¡?°4Ó#8�LÙØ".×"2Ñ"2°4¸Ó";�KØ!-×!1Ñ!1°(¸BÓ!?�JÙ!Ø*4˜ùðÙÿøs°   Âi2Â=i7Ã Bi= ÆB0j È=A j Ê j Ê?%j Ój'Ój'Ój'Ó*Aj,Ô;Aj,áA"j4â;D7j<é=jêj$ê#j$ê,j1ê4j9ê<mê?m	ë
k.ë%	m	ë.k7ë3Am	ímí	mímc                 óf  — ddl }ddl}ddl}ddlm} t        j                  t        «      }t
        j                  |_	        g }	g }
g }d}i }|j                  d«      j                  «       }|D ]  }|d   sŒ	|d   sŒ|d   ||d   <   Œ i }|j                  j                  |«      �r	 |j                  t        |«      «      }t!        |t"        «      rd|i}|j%                  dg «      }d	„ }|D �ci c]  } ||«      |“Œ }}|D �]½  }|j%                  d
d«      }|j%                  dd«      }|r|sŒ-d} ||«      }d|v r1t!        |d   t"        «      r|d   D ]  }||v sŒ||   }|�||k  sŒ|}Œ |€	||v r||   }|€||v r|||      }|€9ddl}|j)                  dd|«      j+                  «       } ||«      }||v r|||      }|€,|j-                  «       D ]  \  } }|| v sŒ||   }|�||k  sŒ|}Œ |€,|j-                  «       D ]  \  } }| |v sŒ||   }|�||k  sŒ|}Œ |€u|j-                  «       D ]b  \  } }t/        t1        |«      t1        | «      «      }!|!dk\  sŒ*d}"t3        |!«      D ]  }#||#   | |#   k(  r|"dz  }"Œ n |"dk\  sŒT||   }|�||k  sŒa|}Œd |€`|j5                  d«      d   j5                  d«      d   }$t1        |$«      dk\  r,|j-                  «       D ]  \  } }|$| v sŒ||   }|�||k  sŒ|}Œ |€rg d¢}%|}$|%D ]$  }&|$j7                  |&«      sŒ|$dt1        |&«        }$ n t1        |$«      dk\  r5|$|k7  r0|j-                  «       D ]  \  } }|$| v s| |$v sŒ||   }|�||k  sŒ|}Œ |||<   |��Œr	 |j                  j9                  d|z   «      }'|j                  j;                  |'«      j=                  d«      ||<   �ŒÀ 	 d})|dkD  r	|)d|› d�z  })| dk(  rd}*d}+n| dk(  rd}*d }+nd!}*d"}+d#|*› d$|+› d%|)› d&�},|j                  |,«      j                  «       }-|-D �cg c]  }|d'   ‘Œ	 }.}|-D �cg c]  }|d(   ‘Œ	 }/}i }0|j-                  «       D �]#  \  }1}|€I	 |j                  j9                  d|1› �«      }'|j                  j;                  |'«      j=                  d«      }|dkD  rB|j                  jC                  «       |jE                  |¬)«      z
  j=                  d«      }2||2k  rŒ™| dk(  r|}3n|| dk(  r_|j                  jG                  |d«      jI                  «       }4|4|jE                  |4jK                  «       ¬)«      z
  }5|5j=                  d*«      }3n|dd+ jM                  dd,«      d-z   }3||3f|0|1<   �Œ&  |tN        «      }6tQ        |0j-                  «       d.„ ¬/«      D ]  \  }1\  }}3|6|3xx   dz  cc<   Œ tQ        |6jS                  «       «      }7|7D �8cg c]  }8|6|8   ‘Œ	 }9}8tQ        tU        |.|7z   «      «      }:tW        tY        |.|/«      «      };tW        tY        |7|9«      «      }<|d0k(  rA|:}|:D �8cg c]  }8|;j%                  |8d«      ‘Œ }	}8|:D �8cg c]  }8|<j%                  |8d«      ‘Œ }
}8nZ|:}d1\  }=}>|:D ]N  }8|=|;j%                  |8d«      z  }=|>|<j%                  |8d«      z  }>|	j[                  |=«       |
j[                  |>«       ŒP |j]                  «        ||	|
r|
nd| |||d2œ}?|?S c c}w #  Y �ŒèxY w# t>        $ r}(tA        d|(› �«       Y d}(~(�ŒFd}(~(ww xY wc c}w c c}w #  Y �ŒÔxY wc c}8w c c}8w c c}8w )3uO  
    èŽ·å�–åˆ†æž�æ•°æ�®
    period: day/week/month
    mode: incremental / cumulative
    metric: records (æ•°æ�®é‡�) / è„šæœ¬æ•° (è„šæœ¬æ•°) / both (å�ŒæŒ‡æ ‡)
    days: å›žæº¯å¤©æ•° (0=å…¨éƒ¨)

    è„šæœ¬æ•°æŒ‰å”¯ä¸€è„šæœ¬æ–‡ä»¶(.py)ç»Ÿè®¡ï¼Œè„šæœ¬çš„æ–°å¢žæ—¥æœŸå�–è¯¥è„šæœ¬æ•°æ�®
    åœ¨ search.db ä¸­æœ€æ—©çš„ publish_dateã€‚
    r   N)Údefaultdictr¡  a  
        SELECT site_name, MIN(date(publish_date)) as d
        FROM gov_raw WHERE publish_date IS NOT NULL AND SUBSTR(publish_date,1,10) != ''
          AND date(publish_date) IS NOT NULL AND date(publish_date) != '1970-01-01'
        GROUP BY site_name
    rœ  rž  r»  c                 óæ   — | j                  dd«      j                  dd«      j                  dd«      j                  dd«      j                  dd	«      j                  d
d«      j                  dd«      S rÇ  rž  r‘   s    r	   rÉ  z$get_analysis_data.<locals>.normalizeÓ  sa   € Ø—y‘y  bÓ)×1Ñ1°%¸Ó=×EÑEÀeÈSÓQß‘W˜U CÓ(¯©°¸Ó)<¿W¹WÀUÈBÓ=O×PWÑPWÐX^Ð`bÓPcðdr   r  r   r  Ú
site_namesz\(#\d+\)rw  r›   rm   r&   r»  rž   )rÕ  rÖ  r×  rØ  rÙ  rÚ  rÛ  rÜ  rÝ  rÞ  u   è¡Œæ”¿è®¸å�¯å…¬ç¤ºz/root/gov_crawler/r  z get_analysis_data config error: zeWHERE publish_date IS NOT NULL AND SUBSTR(publish_date,1,10) != '' AND date(publish_date) IS NOT NULLz) AND date(publish_date) >= date('now', '-z days')rÃ  zdate(publish_date)Úweekz*date(publish_date, 'weekday 1', '-7 days')u%   strftime('%Y-ç¬¬%Wå‘¨', publish_date)z"strftime('%Y-%m-01', publish_date)u$   strftime('%Yå¹´%mæœˆ', publish_date)z
        SELECT z  as period_date,
               zN as period_label,
               COUNT(*) as cnt
        FROM gov_raw
        zC
        GROUP BY period_date
        ORDER BY period_date ASC
    Úperiod_labelrÏ  râ  u   %Y-ç¬¬%Wå‘¨rø   u   å¹´u   æœˆc                 ó   — | d   d   S )Nr›   r   rd   re   s    r	   rg   z#get_analysis_data.<locals>.<lambda>x  s   € ÈÈ1ÉÈaÉ€ r   rh   rÅ  rÄ  )ÚlabelsÚrecord_countsÚspider_countsrÂ  rÄ  rÆ  r@  )/r  rÕ   rÊ  Úcollectionsr)  r   r€   rr  rÀ   rÁ   r‚   rÝ   rÖ   rÜ   rØ  r  rÙ  r5  r   r   r—   r   r·  r¼  r]   r¤   r   rt   r×   Úfromtimestampr  r…   Úprintrõ  rá  r÷  r²  Úweekdayrr   r…  rœ  Úkeysr¸   r2  r!  r   r„   )@rÂ  rÄ  rÆ  r@  Ú_jsonrì  Ú_dtÚ_ddr‚  Úrecords_dataÚspiders_datar/  Úcfg_pathÚdb_site_datesræ   r  Úscripts_maprÄ  r»  rÉ  r…  Údb_normrµ   r  r  Úearliestr  rÿ  rž  rÜ  ÚcleanÚ
clean_normÚsn_normr  r  rŸ   rç  r  r  Úmtimerá  Ú	rec_whereÚrec_date_exprÚrec_label_exprÚq_recÚrec_rowsÚ
rec_labelsÚrec_incÚfiltered_scriptsr’   ÚcutoffÚplabelÚddÚmondayÚspi_period_cntÚ
spi_labelsÚlÚspi_incÚ
all_labelsÚrec_inc_dictÚspi_inc_dictÚr_carryÚs_carryr»   s@                                                                   r	   rÁ  rÁ  ¦  so  € ó ÛÛÝ.ä	�‰œÓ	#€BÜ—[‘[€B„NØ€LØ€LØ€FØ:€Hð €MØ�:‰:ð ó 	÷
 
‰‹ð 	ð ò 3ˆØˆ[‹>˜a ›fØ,-¨c©FˆM˜!˜K™.Ò)ð3ð
 €KØ
‡x�x‡��xÕ ðr	:Ø—*‘*œT (›^Ó,ˆCÜ˜#œtÔ$Ø! 3Ð'�Ø—w‘w˜z¨2Ó.ˆHòdð
 1>Ö>¨1‘y “| Q‘Ð>ˆGÐ>àó c�ØŸ™˜x¨Ó,�Ø—u‘u˜V RÓ(�Ù¡TØà�Ù% d›O�	ð   1Ñ$¬°A°l±OÄTÔ)JØ ™oò -˜Ø Ò.Ø -¨bÑ 1˜AØ'Ð/°1°x³<Ø+,¡ð	-ð Ð#¨°Ñ(=Ø,¨TÑ2�Hð Ð#¨	°WÑ(<Ø,¨W°YÑ-?Ñ@�Hð Ð#Û$ØŸG™G K°°TÓ:×@Ñ@ÓB�EÙ!*¨5Ó!1�JØ! WÑ,Ø#0°¸Ñ1DÑ#E˜ð Ð#Ø'.§}¡}£ò -™˜ Ø$¨Ò/Ø -¨bÑ 1˜AØ'Ð/°1°x³<Ø+,¡ð	-ð Ð#Ø'.§}¡}£ò -™˜ Ø" iÒ/Ø -¨bÑ 1˜AØ'Ð/°1°x³<Ø+,¡ð	-ð Ð#Ø'.§}¡}£ò 1™˜ Ü"%¤c¨)£n´c¸'³lÓ"C˜Ø" a›<Ø%&˜FÜ%*¨7£^ò * Ø#,¨Q¡<°7¸1±:Ò#=Ø$*¨a¡K¡Fá$)ð	*ð
  &¨›{Ø$1°"Ñ$5 Ø#+Ð#3°q¸8³|Ø/0¡Hð1ð Ð#Ø$Ÿ?™?¨3Ó/°Ñ2×8Ñ8¸Ó?ÀÑB�DÜ˜4“y A’~Ø+2¯=©=«?ò 1™K˜G RØ# wšØ$1°"Ñ$5 Ø#+Ð#3°q¸8³|Ø/0¡Hð	1ð Ð#ò'S�Oà$�DØ.ò "˜ØŸ=™=¨Õ-Ø#'¨
¬#¨c«(¨Ð#3˜DÙ!ð"ô ˜4“y A’~¨$°)Ò*;Ø+2¯=©=«?ò 1™K˜G RØ# w™°'¸T²/Ø$1°"Ñ$5 Ø#+Ð#3°q¸8³|Ø/0¡Hð	1ð '/�˜FÑ#àÒ#ðØ #§¡× 1Ñ 1Ð2FÈÑ2OÓ P˜Ø.1¯l©l×.HÑ.HÈÓ.O×.XÑ.XÐYcÓ.d˜ FÓ+ñCcðN x€IØˆa‚xØÐ@ÀÀÀgÐNÑNˆ	à�‚Ø,ˆØ-‰Ø	�6Ò	ØDˆØ@‰à<ˆØ?ˆðØˆð ØÐð  	ð 
ˆð ð€Eð �z‰z˜%Ó ×)Ñ)Ó+€HØ-5Ö6¨�!�NÓ#Ð6€JÐ6Ø!)Ö*˜Aˆq�‹xÐ*€GÐ*ð ÐØ×!Ñ!Ó#ó *‰ˆˆ1Øˆ9ðØŸ™×)Ñ)Ð,>¸q¸cÐ*BÓC�Ø—L‘L×.Ñ.¨uÓ5×>Ñ>¸zÓJ�ð �!Š8Ø—l‘l×&Ñ&Ó(¨3¯=©=¸d¨=Ó+CÑC×MÑMÈjÓYˆFØ�6ŠzØà�UŠ?Ø‰FØ�vÒØ—‘×&Ñ& q¨*Ó5×:Ñ:Ó<ˆBØ˜#Ÿ-™-¨R¯Z©Z«\˜-Ó:Ñ:ˆFØ—_‘_ ]Ó3‰Fà�r˜�U—]‘] 3¨Ó.°Ñ6ˆFØ  &˜kÐ˜Óð+*ñ0 œ“X€NÜ Ð!1×!7Ñ!7Ó!9Ñ?PÔQò $‰ˆ‰;ˆAˆvØ�vÓ !Ñ#Ôð$ä˜×+Ñ+Ó-Ó.€JØ*4Ö5 Qˆ~˜aÓ Ð5€GÐ5ô œ˜J¨Ñ3Ó4Ó5€JÜœ˜J¨Ó0Ó1€LÜœ˜J¨Ó0Ó1€Làˆ}ÒØˆØ8BÖC°1˜×(Ñ(¨¨AÕ.ÐCˆÐCØ8BÖC°1˜×(Ñ(¨¨AÕ.ÐCˆÑCàˆØÑˆ�Øò 	)ˆAØ�|×'Ñ'¨¨1Ó-Ñ-ˆGØ�|×'Ñ'¨¨1Ó-Ñ-ˆGØ×Ñ Ô(Ø×Ñ Õ(ð		)ð ‡H�H„Jð Ø%Ù)5™¸4ØØØØñ€Fð €MùòE ?øðHÚûÜò 	:ÜÐ4°Q°CÐ8×9Ò9ûð	:üò6 7ùÚ*øðÚüò* 6ùò DùÚCsÇ   Â'A[- Ã.[ Ã>A[- Å[- Å*A4[- Ç[- Ç, [- È[- È?[- É)[- Ê[- ÊA[- Ë&[- Ë3"[- ÌA[- Í[- Í'[- Í5A[%Ï [- Ð\Ð-\ÑA\×\$Ø+\)Ù
\.Û [- Û%[*Û'[- Û-	\Û6\
Ü
\Ü\!c                 óÈ   — | j                  d«      xs d}| j                  dd«      sy|j                  d«      ryd|v ry	d
|v ry|j                  d«      sd|v sd|v sd|v ryy)uZ   è„šæœ¬è¡ŒçŠ¶æ€�åˆ†ç±»ï¼ˆæœ�åŠ¡ç«¯ç­›é€‰ç”¨ï¼›ä¸Žè¡¨æ ¼ã€Œæ—¥è·‘çŠ¶æ€�ã€�åˆ—å�Œä¸€å�£å¾„ï¼‰rñ  r   ré  TÚdisabledõ   âœ…r¿  õ   è¶…æ—¶r~   õ	   ä¸�å�¯è¾¾Úunreachableõ   â�Œõ   å¤±è´¥õ   å¼‚å¸¸õ   ðŸ�›ÚfailÚpending)r   rª   )rµ   Ú
run_statuss     r	   Úcrawler_row_statusrg  ›  sy   € à—‘Ð(Ó)Ò/¨R€JØ�5‰5�˜DÔ!ØØ×Ñ˜UÔ#ØØ�:ÑØØ�jÑ ØØ×Ñ˜UÔ# x°:Ñ'=ÀÈZÑAWÐ[aÐeoÑ[oØØr   c                 óÜ  ‡ ‡‡‡‡‡:‡;‡<‡=‡>— t        «       \  }}	t        |«      }
ddl} |j                  t        «      j                  d«      j                  «       d   } |j                  t        «      j                  «        t        d„ |D «       «      }t        d„ |D «       «      }t        d„ |D «       «      }t        d„ |D «       «      }t        d„ |D «       «      }i }|D ]M  }|d	   }||vr	dddd
œ||<   ||   dxx   dz  cc<   ||   dxx   |d   z  cc<   |d   sŒ>||   dxx   dz  cc<   ŒO ddl	m	}  |j                  «       j                  d«      }t        d„ |D «       «      }t        d„ |D «       «      }|}‰r‰dk7  r|D �cg c]  }|d	   ‰k(  sŒ|‘Œ }}‰r#‰dk7  r|D �cg c]  }t        |«      ‰k(  sŒ|‘Œ }}‰r‡‰j                  «       j                  «       }|rg|D �cg c]\  }||j                  d«      xs ddz   |j                  d«      xs dz   dz   |j                  d«      xs dz   j                  «       v sŒ[|‘Œ^ }}d„ d„ d„ d„ d„ d„ d„ d „ d!„ d"œ	}‰|vrd#Š|d$k(  rd$nd%Š;	 t!        ||‰   ‰;d%k(  ¬&«      }t        |«      Š<	 t%        dt'        |«      «      }t%        d‰<|z   dz
  |z  «      Š>	 t'        ‰ «      Š t%        dt)        ‰ ‰>«      «      Š |‰ dz
  |z  ‰ |z   Š=ˆ;ˆˆˆˆ ˆfd(„Š:d ˆ:ˆ;ˆfd)„	}ˆ:ˆ<ˆ ˆ=ˆ>fd*„}g d+¢}d}|D ]+  \  } }!| ‰xs dk(  rd,nd}"|d-| ›|"›d. ‰:| d¬/«      ›d0|!›d1�z  }Œ- g }#d}$	 t+        t,        «      5 }%|%j/                  «       j                  «       }$ddd«       d}&	 t+        t0        «      5 }%|%j/                  «       j                  «       }&ddd«       |#j3                  dj5                  g d2‘t7        j8                  |$«      › ‘d3‘t7        j8                  |&«      › ‘d4‘t;        |«      › ‘d5‘|› ‘d6‘|
› ‘d7‘|› ‘d8‘|
r||
z  d9z  ndd:›‘d;‘|› ‘d<‘|
r||
z  d9z  ndd:›‘d;‘|› ‘d=‘|
r||
z  d9z  ndd:›‘d;‘|› ‘d>‘|
r||
z  d9z  ndd:›‘d;‘|› ‘d?‘|› ‘d@‘|› ‘dA‘|› ‘dB‘‰dk(  rd,nd› ‘d.‘ ‰:dd¬C«      › ‘dD‘|
› ‘dE‘«      «       t!        |j=                  «       «      D ]7  \  }'}(‰|'k(  rd,nd})|#j3                  dF|)› d. ‰:|'d¬C«      › d0|'› dG|(d   › dE�	«       Œ9 |#j3                  dH«       |#j3                  dI|z   dHz   «       |#j3                  dJ |dKdL«      z    |ddM«      z    |ddNdO«      z    |d#dPdQ«      z    |dRdSdT«      z    |ddUdV«      z    |d	dW«      z    |ddX«      z   dYz   dZz   «       ‰=D �]Ÿ  }|d   rd[n|d\   dkD  rd]nd^}*|d   }+|d_   s
d`|d   › da�}+n|j                  dbdc«      s	dd|d   › da�}+|j                  dd«      xs |j                  ded«      },|df   }-g }.|j                  dgg «      D ]D  }/|/dh   dd' }0|/dK   dik(  rdjndk}1|/dl   r	dm|/dl   › dn�nd}2|.j3                  |0› d|1› |/dK   › d|2› �«       ŒF |.rdoj5                  |.ddp «      nd}3|-j?                  dq«      r#|.r!dr|.d   › �t        |.«      dkD  rds|.d   › �ndz   }3|-j?                  dj«      rdtn4du|-v sdv|-v rdwn*dx|-v sdy|-v rdzn |-j?                  dk«      sd{|-v sd||-v sd}|-v rd~nd}4|d   dz   |d   z   dz   |,xs dz   j                  «       jA                  d€d«      }5t        |«      }6|j                  dbdc«      sd�nd}7|j                  dbdc«      }8d‚|8rdƒnd„›d…tC        |d   «      jA                  d†d‡«      ›dˆ|8rd‰ndŠ›d0|8rd‹ndŒ›d��	}9|#j3                  dj5                  g dŽ‘|5› ‘d�‘|6› ‘d�‘|7› ‘d‘‘|*› ‘d’‘|d   › ‘d0‘|d   › ‘d“‘|d   › ‘d”‘|d#   xs dd•k7  r|d#   xs ddd' nd•› ‘d“‘|d\   › ‘d–‘|d   rdjndk› ‘d—‘|d	   › ‘d˜‘|+› ‘d™‘|4› ‘dš‘|3› ‘d0‘|-› ‘d›‘|9› ‘dœ‘«      «       �Œ¢ |#j3                  d�«       |#j3                   |«       «       |#j3                  dž«       |#j3                  dŸ«       dj5                  |#«      S c c}w c c}w c c}w # t"        $ r Y �Œw xY w# t"        $ r d'}Y �Œw xY w# t"        $ r dŠ Y �Œýw xY w# 1 sw Y   �Œ[xY w#  Y �ŒcxY w# 1 sw Y   �Œ7xY w#  Y �Œ?xY w)¡uì   æ¸²æŸ“çˆ¬è™«ç®¡ç�†HTMLé¡µé�¢

    2026-09-10: è„šæœ¬è¡¨æ”¹ä¸º**æœ�åŠ¡ç«¯åˆ†é¡µ**ï¼ˆé»˜è®¤æ¯�é¡µ 10 è¡Œï¼‰+ æœ�åŠ¡ç«¯ç­›é€‰/æŽ’åº�ã€‚
    åŽŸå®žçŽ°ä¸€æ¬¡æ€§æ¸²æŸ“ 2086 è¡Œ â†’ 2.7MB HTMLã€�é¡µé�¢åŠ è½½ 22sï¼›çŽ°åœ¨ â‰ˆ 60KB / <4sã€‚
    r   Nr!  c              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­w)rì  r›   Nrd   ©r^   rµ   s     r	   ra   z$render_admin_page.<locals>.<genexpr>µ  ó   è ø€ Ò:˜!¨1¨[«>”AÑ:ùó   ‚
�c              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­w)rí  r›   Nrd   rj  s     r	   ra   z$render_admin_page.<locals>.<genexpr>¶  rk  rl  c              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­w)rî  r›   Nrd   rj  s     r	   ra   z$render_admin_page.<locals>.<genexpr>·  s   è ø€ Ò<˜1¨A¨l«O”QÑ<ùrl  c              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­w)rï  r›   Nrd   rj  s     r	   ra   z$render_admin_page.<locals>.<genexpr>¸  s   è ø€ Ò>˜A¨Q¨}Ó-=”aÑ>ùrl  c              3   óF   K  — | ]  }|j                  d d«      sŒd–— Œ y­w)ré  Tr›   NrG  rj  s     r	   ra   z$render_admin_page.<locals>.<genexpr>¹  s   è ø€ ÒB˜!¨1¯5©5°¸DÕ+A”AÑBùs   ‚!š!r'   )rD  Úrecordsr"  rD  r›   rq  r"  )rÊ  z%Y-%m-%d %H:%Mc              3   ó&   K  — | ]	  }|d    –— Œ y­w)rÓ  Nrd   rj  s     r	   ra   z$render_admin_page.<locals>.<genexpr>Ç  s   è ø€ Ò5 q�Q�z•]Ñ5ùr  c              3   ó&   K  — | ]	  }|d    –— Œ y­w)rÔ  Nrd   rj  s     r	   ra   z$render_admin_page.<locals>.<genexpr>È  s   è ø€ Ò3 Q�A�i•LÑ3ùr  rô   r  r   r´   r  r›  c                 óB   — | d   rdS | j                  dd«      dkD  rdS dS )Nr"  rž   rÓ  r   r›   rG  ©rµ   s    r	   rg   z#render_admin_page.<locals>.<lambda>Õ  s(   €  ! H¢+˜Q€ ¸¿¹¸zÈ1Ó9MÐPQÒ9Q°A€ ÐWX€ r   c                 ó,   — | j                  d«      xs dS )Nr  r   rG  ru  s    r	   rg   z#render_admin_page.<locals>.<lambda>Ö  s   € ˜QŸU™U 6›]Ò0¨b€ r   c                 ó,   — | j                  d«      xs dS )NrD  r   rG  ru  s    r	   rg   z#render_admin_page.<locals>.<lambda>×  s   € ˜QŸU™U 7›^Ò0¨q€ r   c                 ó2   — | j                  d«      xs dd d S )Nrµ  r&   r|   rG  ru  s    r	   rg   z#render_admin_page.<locals>.<lambda>Ø  s   € ˜aŸe™e H›oÒ4°°c°rÐ:€ r   c                 ó,   — | j                  d«      xs dS )NrÓ  r   rG  ru  s    r	   rg   z#render_admin_page.<locals>.<lambda>Ù  s   € ˜QŸU™U :Ó.Ò3°!€ r   c                 ó   — | d   rdS dS )Nr"  r›   r   rd   ru  s    r	   rg   z#render_admin_page.<locals>.<lambda>Ú  s   €  ! H¢+˜Q€ °1€ r   c                 ó,   — | j                  d«      xs dS )Nr'   r   rG  ru  s    r	   rg   z#render_admin_page.<locals>.<lambda>Û  s   € ˜QŸU™U 7›^Ò1¨r€ r   c                 ó,   — | j                  d«      xs dS )Nr  r   rG  ru  s    r	   rg   z#render_admin_page.<locals>.<lambda>Ü  s   € ˜QŸU™U 8›_Ò2°€ r   c                 ó   — t        | «      S r\   )rg  ru  s    r	   rg   z#render_admin_page.<locals>.<lambda>Ý  s   € Ô.¨qÓ1€ r   )	r}  r  rD  rµ  r,  r"  r'   r  r5  rµ  Úascr¶  rÒ   r|   c                  óâ   •— ‰‰‰‰	‰‰dœ}|j                  | «       |j                  «       D ��ci c]  \  }}|dvs|dk(  sŒ||“Œ }}}dt        j                  j	                  |«      z   S c c}}w )u(   æž„é€ ä¿�ç•™ç­›é€‰/æŽ’åº�çŠ¶æ€�çš„é“¾æŽ¥)r_  r’   rZ   rà   r©  r    )r   rô   Nr_  z/crawler/admin?)r¬  r·  rž  rŸ  rT  )
Úoverrž  r…  r#   Ú_sdirr·  r¹  r¸  r7  rà   s
       €€€€€€r	   Ú
_admin_urlz%render_admin_page.<locals>._admin_urló  sq   ø€ à˜w¨c¸4ÈÐTXÑYˆØ	�‰�ŒØŸg™g›i×T‘d�a˜¨AÐ5FÑ,FÈ1ÐPSË8ˆQ�‰TÐTˆÑTØ ¤6§<¡<×#9Ñ#9¸!Ó#<Ñ<Ð<ùó Us   ¯A+ÁA+c                 ó°   •— ‰| k(  r‰dk(  rdnd}dj                  ‰| k(  rd‰z  nd|fD �cg c]  }|sŒ|‘Œ	 c}«      }d|›d ‰| |d¬	«      ›d
|›d�S c c}w )u²   å�¯æŽ’åº�è¡¨å¤´ï¼ˆæœ�åŠ¡ç«¯æŽ’åº�ï¼Œæ›¿æ�¢åŽŸ client-side sortTableï¼‰ã€‚
        2026-09-11 ç¾ŽåŒ–ï¼šåˆ—å®½ç”±å†…è�” style æ”¹ä¸ºç±»å��ï¼›è¡¨å¤´é“¾æŽ¥é£Žæ ¼ä¸‹æ²‰åˆ° .th-sortã€‚r~  r¶  r´   zsort-%sr   z<th class="z"><a class="th-sort" href="r›   )rà   r©  r    r³  z	</a></th>)r   )	ri   r,   r¸  Ú_nextrf   Ú_allr‚  r�  rà   s	         €€€r	   Ú
_sort_linkz%render_admin_page.<locals>._sort_linkú  si   ø€ ð   3š;¨5°Eª>‘ÀˆØ�x‰x¸DÀCºK i°%Ò&7ÈRÐQTÐ$UÖ[˜qÒYZšÒ[Ó\‰â™¨°%¸1Ö=ºuðFð 	Gùò \s
   «A³Ac                  ó´  •— ‰
dk  ryt         dz   } | d‰‰
t        ‰	«      ‰fz  z  } ‰dkD  r| d ‰‰dz
  ¬«      z  z  } d‰
h}t        t        d‰dz
  «      t	        ‰
‰dz   «      dz   «      D ]  }|j                  |«       Œ d}t        |«      D ],  }||z
  dkD  r| d	z  } |‰k(  rd
nd}| d| ‰|¬«      |fz  z  } |}Œ. ‰‰
k  r| d ‰‰dz   ¬«      z  z  } | dz  } | S )u;   è„šæœ¬è¡¨åˆ†é¡µæ�¡ï¼ˆå¤�ç”¨ç»Ÿä¸€ PAGER_CSS å�¡ç‰‡æ ·å¼�ï¼‰r›   r   r  uZ   <span class="page-info">ç¬¬ <b>%d</b> / %d é¡µ Â· æœ¬é¡µ %d æ�¡ Â· å…± %d ä¸ªè„šæœ¬</span>u/   <a class="page-btn" href="%s">â€¹ ä¸Šä¸€é¡µ</a>)r    rž   r   r  r  z&<a class="page-btn%s" href="%s">%d</a>u/   <a class="page-btn" href="%s">ä¸‹ä¸€é¡µ â€º</a>r´  )r  r]   r¤   r»  r¼  rß   rœ  )ra  Ú_psetÚ_iÚ_lastrß  Ú_actr‚  Úfiltered_totalr7  Ú	page_rowsr.  s         €€€€€r	   Ú_pager_htmlz&render_admin_page.<locals>._pager_html  s:  ø€ à˜!ÒØÜÐ5Ñ5ˆØÐlØ�+œs 9›~¨~ðp?ñ ?ñ 	?ˆà�!Š8ØÐEÉ
ÐUYÐ\]ÑU]ÔH^Ñ^Ñ^ˆDØ�KÐ ˆÜœ˜A˜t a™xÓ(¬#¨k¸4À!¹8Ó*DÀqÑ*HÓIò 	ˆBØ�I‰I�b�Mð	àˆÜ˜“-ò 	ˆBØ�E‰z˜AŠ~ØÐ@Ñ@�Ø " d¢
‘9°ˆDØÐ<ÀÁjÐSUÔFVÐXZÐ?[Ñ[Ñ[ˆDØ‰Eð	ð �+ÒØÐEÉ
ÐUYÐ\]ÑU]ÔH^Ñ^Ñ^ˆDØ�ÑˆØˆr   )rã  )r¿  u
   âœ… æˆ�åŠŸ)r~   u
   â�° è¶…æ—¶)rd  u
   â�Œ å¤±è´¥)r_  u   ðŸš« ä¸�å�¯è¾¾)re  u   â�³ å¾…è¿�è¡Œ)r[  õ   â�¹ï¸� ç¦�ç”¨r  z<a class="sf-chip sf-ræ  )r’   r    r³  rè  u  <!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>çˆ¬è™«ç®¡ç�†é�¢æ�¿</title>
<script src="/static/chart.umd.min.js"></script>
    <script>var savedExcludeKeywords = z;
    var savedBlockKeywords = u?)  ;</script>
<style>
* { margin:0; padding:0; box-sizing:border-box; }
body { font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei","PingFang SC",sans-serif; background:#f1f3f5; color:#202124; }
.wrap { max-width:1400px; margin:0 auto; padding:18px 20px 56px; }
/* â”€â”€ é¡¶éƒ¨æ ‡é¢˜æ�¡ â”€â”€ */
.page-head { display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap; margin-bottom:14px; }
.ph-left { display:flex; align-items:baseline; gap:10px; }
.ph-logo { font-weight:700; color:#1a73e8; font-size:17px; letter-spacing:-.4px; }
.ph-title { font-size:19px; font-weight:600; color:#1a1a2e; }
/* â”€â”€ é¡µç­¾ï¼ˆåˆ†æ®µæŽ§ä»¶ï¼‰â”€â”€ */
.tabs { display:inline-flex; gap:4px; padding:4px; background:#fff; border:1px solid #e9ecef; border-radius:12px; margin-bottom:14px; box-shadow:0 1px 3px rgba(0,0,0,.05); }
.tab-btn { padding:7px 18px; border:none; background:transparent; border-radius:9px; cursor:pointer; font-size:13.5px; font-weight:500; color:#3c4043; font-family:inherit; }
.tab-btn.active { background:#1a73e8; color:#fff; }
.tab-btn:hover:not(.active) { background:#eef4ff; color:#1a73e8; }
.tab-content { display:none; }
.tab-content.active { display:block; }
/* â”€â”€ ç»Ÿè®¡å�¡ â”€â”€ */
.stats-row { display:flex; gap:12px; flex-wrap:wrap; margin-bottom:12px; }
.stat-card { background:#fff; border:1px solid #e9ecef; border-radius:12px; padding:14px 18px; flex:1; min-width:130px; box-shadow:0 1px 3px rgba(0,0,0,.05); }
.stat-card .num { font-size:26px; font-weight:700; color:#202124; font-variant-numeric:tabular-nums; line-height:1.15; }
.stat-card .label { font-size:12.5px; color:#5f6368; margin-top:5px; }
.stat-card .label .sub { color:#8a9099; }
.stat-card.green .num { color:#1e7d45; }
.stat-card.blue .num { color:#1a73e8; }
.stat-card.red .num { color:#d93025; }
.active-card { flex:2; min-width:250px; }
.active-rows { display:flex; flex-direction:column; gap:7px; margin-top:8px; }
.active-row { display:flex; align-items:center; gap:8px; font-size:12.5px; }
.active-row .period { width:44px; color:#5f6368; text-align:right; flex-shrink:0; }
.active-row .bar { flex:1; height:6px; background:#eef1f4; border-radius:3px; overflow:hidden; }
.active-row .bar .fill { height:100%; border-radius:3px; transition:width .5s; }
.active-row .count { min-width:40px; font-weight:700; text-align:right; flex-shrink:0; font-variant-numeric:tabular-nums; }
.active-row:nth-child(1) .bar .fill { background:#d93025; } .active-row:nth-child(1) .count { color:#d93025; }
.active-row:nth-child(2) .bar .fill { background:#e37400; } .active-row:nth-child(2) .count { color:#e37400; }
.active-row:nth-child(3) .bar .fill { background:#1a73e8; } .active-row:nth-child(3) .count { color:#1a73e8; }
.active-row:nth-child(4) .bar .fill { background:#1e7d45; } .active-row:nth-child(4) .count { color:#1e7d45; }
/* â”€â”€ ä¸‰å�—å·¥å…·åŒºï¼ˆå�¡ç‰‡åŒ–ï¼‰â”€â”€ */
.groups-box,.status-filters,.exclude-row { background:#fff; border:1px solid #e9ecef; border-radius:12px; padding:11px 14px; margin-bottom:12px; box-shadow:0 1px 3px rgba(0,0,0,.05); display:flex; gap:7px; flex-wrap:wrap; align-items:center; }
.groups-box { max-height:104px; overflow-y:auto; }
.hint { font-size:12.5px; color:#5f6368; }
/* â”€â”€ èƒ¶å›Šï¼šåˆ†ç»„ç­›é€‰ â”€â”€ */
.filter-btn { padding:5px 12px; border:1px solid #dfe3e8; border-radius:999px; background:#fff; cursor:pointer; font-size:12.5px; color:#3c4043; text-decoration:none; display:inline-block; }
.filter-btn:hover { background:#eef4ff; border-color:#1a73e8; color:#1a73e8; text-decoration:none; }
.filter-btn.active { background:#1a73e8; color:#fff; border-color:#1a73e8; font-weight:600; }
/* â”€â”€ èƒ¶å›Šï¼šçŠ¶æ€�ç­›é€‰ï¼ˆæŒ‰çŠ¶æ€�ç�€è‰²ï¼ŒåŽŸå…ˆæ˜¯å†…è�”é¢œè‰²ï¼‰â”€â”€ */
.sf-chip { padding:4px 12px; border:1px solid #d7dbe0; border-radius:999px; background:#fff; font-size:12px; text-decoration:none; display:inline-block; color:#5f6368; }
.sf-chip.sf-all { border-color:#c8ccd2; color:#3c4043; }
.sf-chip.sf-all.active { background:#3c4043; color:#fff; }
.sf-chip.sf-success { border-color:#1e7d45; color:#1e7d45; }
.sf-chip.sf-success.active { background:#1e7d45; color:#fff; }
.sf-chip.sf-timeout { border-color:#b26a00; color:#b26a00; }
.sf-chip.sf-timeout.active { background:#b26a00; color:#fff; }
.sf-chip.sf-fail { border-color:#d93025; color:#d93025; }
.sf-chip.sf-fail.active { background:#d93025; color:#fff; }
.sf-chip.sf-unreachable { border-color:#7b3fa0; color:#7b3fa0; }
.sf-chip.sf-unreachable.active { background:#7b3fa0; color:#fff; }
.sf-chip.sf-pending { border-color:#8a9099; }
.sf-chip.sf-pending.active { background:#8a9099; color:#fff; }
.sf-chip.sf-disabled { border-color:#c8ccd2; color:#8a9099; }
.sf-chip.sf-disabled.active { background:#8a9099; color:#fff; }
/* â”€â”€ å…³é”®è¯�ä¿�å­˜ â”€â”€ */
.exclude-row input { padding:6px 12px; border:1px solid #dfe3e8; border-radius:9px; font-size:13px; outline:none; width:260px; font-family:inherit; }
.exclude-row input:focus { border-color:#1a73e8; box-shadow:0 0 0 3px rgba(26,115,232,.12); }
.btn-save { padding:6px 14px; border:1px solid #b26a00; border-radius:999px; background:#fff; color:#b26a00; cursor:pointer; font-size:13px; font-family:inherit; }
.btn-save:hover { background:#fff7ec; }
.save-status { font-size:12.5px; color:#5f6368; }
.updated { font-size:12.5px; color:#8a9099; margin:0 0 12px 2px; }
/* â”€â”€ æ‰‹åŠ¨æ—¥è·‘ â”€â”€ */
.run-card { cursor:pointer; background:#f4fbf6; border:1px dashed #1e7d45; text-align:center; }
.run-card:hover { background:#eaf7ee; }
.run-card .num { font-size:22px; color:#1e7d45; }
.run-log { display:none; background:#1e1e1e; color:#7ee787; padding:12px 14px; border-radius:12px; margin:0 0 14px; max-height:300px; overflow-y:auto; font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:11.5px; white-space:pre-wrap; }
/* â”€â”€ è¡¨æ ¼ â”€â”€ */
.table-wrap { background:#fff; border:1px solid #e9ecef; border-radius:12px; box-shadow:0 1px 3px rgba(0,0,0,.05); overflow:auto; }
table { width:100%; border-collapse:collapse; font-size:13px; }
th { position:sticky; top:0; z-index:2; background:#f8f9fb; color:#3c4043; padding:10px 12px; text-align:left; font-weight:600; font-size:12.5px; white-space:nowrap; border-bottom:1px solid #e9ecef; cursor:pointer; user-select:none; }
th:hover { color:#1a73e8; }
th a, a.th-sort { color:inherit; text-decoration:none; display:block; cursor:pointer; }
th.sort-asc::after { content:" â–²"; font-size:10px; color:#1a73e8; }
th.sort-desc::after { content:" â–¼"; font-size:10px; color:#1a73e8; }
td { padding:9px 12px; border-bottom:1px solid #f1f3f5; vertical-align:middle; }
tbody tr:last-child td { border-bottom:none; }
tbody tr:hover { background:#f7faff; }
tbody tr.row-off { opacity:.5; }
.ta-r { text-align:right; font-variant-numeric:tabular-nums; }
.tc { text-align:center; }
.active-col { text-align:center; }
.ell { max-width:220px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ell.mono { font-size:11.5px; font-family:ui-monospace,SFMono-Regular,Menlo,monospace; max-width:190px; }
.nowrap { white-space:nowrap; }
.dash { color:#c8ccd2; font-size:11.5px; }
.url-link { color:#1a73e8; font-size:11.5px; text-decoration:none; }
.url-link:hover { text-decoration:underline; }
.muted { color:#8a9099; }
.missing-script { color:#d93025; font-weight:600; }
.run-state { font-size:12px; text-align:center; cursor:default; white-space:nowrap; }
.run-ok { color:#1e7d45; } .run-warn { color:#b26a00; } .run-block { color:#7b3fa0; } .run-bad { color:#d93025; } .run-idle { color:#8a9099; }
.btn-toggle { padding:3px 11px; border-radius:999px; border:1px solid #dddfe3; cursor:pointer; font-size:12px; font-family:inherit; }
.btn-toggle.on { background:#1e7d45; color:#fff; border-color:#1e7d45; }
.btn-toggle.off { background:#f5f6f8; color:#8a9099; }
.badge { display:inline-block; padding:1px 8px; border-radius:999px; font-size:11px; font-weight:500; }
.badge-green { background:#e6f4ea; color:#1e7d45; }
.badge-red { background:#fce8e6; color:#c5221f; }
.badge-gray { background:#f1f3f4; color:#5f6368; }
.w-num { width:64px; } .w-date { width:92px; } .w-week { width:74px; } .w-act { width:60px; }
.w-run { width:96px; } .w-toggle { width:76px; }
/* â”€â”€ åˆ†æž�è§†å›¾ â”€â”€ */
.analysis-controls { display:flex; gap:12px; flex-wrap:wrap; margin-bottom:12px; align-items:center; background:#fff; border:1px solid #e9ecef; border-radius:12px; padding:11px 14px; box-shadow:0 1px 3px rgba(0,0,0,.05); }
.control-group { display:flex; gap:6px; align-items:center; }
.control-group label { font-size:12.5px; color:#5f6368; }
.control-group select, .control-group button { padding:6px 12px; border:1px solid #dfe3e8; border-radius:9px; background:#fff; font-size:13px; cursor:pointer; font-family:inherit; color:#3c4043; }
.control-group button.active-ctrl { background:#1a73e8; color:#fff; border-color:#1a73e8; }
.chart-container { background:#fff; border:1px solid #e9ecef; border-radius:12px; padding:18px; box-shadow:0 1px 3px rgba(0,0,0,.05); margin-bottom:16px; min-height:350px; }
.chart-summary { display:flex; gap:16px; flex-wrap:wrap; margin-top:12px; }
.chart-stat { font-size:13.5px; color:#3c4043; }
.chart-stat span { font-weight:700; color:#1a73e8; }
.cs-sep { border-right:1px solid #e9ecef; padding-right:16px; }
.cs-sepl { border-left:1px solid #e9ecef; padding-left:16px; color:#5f6368; }
.cs-b { color:#1a73e8; } .cs-g { color:#1e7d45; } .cs-err { color:#d93025; }
.legend { font-size:12.5px; color:#5f6368; margin-bottom:10px; display:flex; gap:14px; flex-wrap:wrap; align-items:center; }
.legend i { display:inline-block; width:12px; height:3px; margin-right:5px; vertical-align:middle; border-radius:2px; }
.legend i.b { background:#1a73e8; } .legend i.g { background:#1e7d45; }
/* â”€â”€ æ‰‹æœºç«¯ â”€â”€ */
@media(max-width:760px) {
  .wrap { padding:12px 12px 44px; }
  .page-head { flex-direction:column; align-items:flex-start; }
  .tabs { width:100%; }
  .tab-btn { flex:1; padding:8px 6px; font-size:12.5px; }
  .stat-card { min-width:calc(50% - 6px); padding:12px 14px; }
  .stat-card .num { font-size:22px; }
  .active-card { min-width:100%; }
  .groups-box { max-height:88px; }
  .exclude-row input { width:100%; }
  table { font-size:12px; }
  th, td { padding:7px 8px; }
  .ell, .ell.mono { max-width:150px; }
}
</style>
</head>
<body>
<div class="wrap">
<div class="page-head">
  <div class="ph-left"><span class="ph-logo">BJIIR</span><span class="ph-title">çˆ¬è™«ç®¡ç�†é�¢æ�¿</span></div>
  <div class="ph-right">uÚ  </div>
</div>
<div class="tabs">
  <button class="tab-btn active" onclick="switchTab(event,'tab-manage')">ðŸ“‹ ç®¡ç�†è§†å›¾</button>
  <button class="tab-btn" onclick="switchTab(event,'tab-analysis')">ðŸ“Š åˆ†æž�è§†å›¾</button>
  <button class="tab-btn" onclick="window.location.href='/'">ðŸ”™ è¿”å›žæ�œç´¢</button>
</div>

<!-- TAB 1: ç®¡ç�†è§†å›¾ -->
<div id="tab-manage" class="tab-content active">
<div class="stats-row">
  <div class="stat-card green"><div class="num">ud   </div><div class="label">æ€»æ•°æ�®æ�¡æ•°</div></div>
  <div class="stat-card blue"><div class="num">u_   </div><div class="label">çˆ¬è™«æ•°</div></div>
  <div class="stat-card green"><div class="num">uF  </div><div class="label">å�¯ç”¨ä¸­</div></div>
  <div class="stat-card active-card">
    <div class="label">ç«™ç‚¹æ´»è·ƒåº¦ <span class="sub">ï¼ˆæœ‰æ–°å¢žçš„ç«™ç‚¹æ•°ï¼‰</span></div>
    <div class="active-rows">
      <div class="active-row"><span class="period">è¿‘3æ—¥</span><div class="bar"><div class="fill" style="width:r'  z.0fz#%"></div></div><span class="count">u   </span></div>
      <div class="active-row"><span class="period">è¿‘7æ—¥</span><div class="bar"><div class="fill" style="width:u   </span></div>
      <div class="active-row"><span class="period">è¿‘1æœˆ</span><div class="bar"><div class="fill" style="width:u�   </span></div>
      <div class="active-row"><span class="period">è¿‘å�Šå¹´</span><div class="bar"><div class="fill" style="width:zS</span></div>
    </div>
  </div>
  <div class="stat-card green"><div class="num">+ub   </div><div class="label">ä»Šæ—¥æ–°å¢ž</div></div>
  <div class="stat-card blue"><div class="num">+uV  </div><div class="label">è¿‘7æ—¥æ–°å¢ž</div></div>
  <div class="stat-card run-card" id="daily-run-card" onclick="runDaily()">
    <div class="num" id="daily-run-icon">â–¶ï¸�</div>
    <div class="label" id="daily-run-label">æ‰‹åŠ¨æ—¥è·‘</div>
  </div>
</div>
<div class="run-log" id="daily-run-log"></div>
<div class="updated">æ›´æ–°æ—¶é—´: u„  </div>
<div class="exclude-row">
  <span class="hint">åŒ…å�«å…³é”®è¯�ï¼ˆé€—å�·æˆ–ç©ºæ ¼åˆ†éš”ï¼‰</span>
  <input type="text" id="exclude-keywords" placeholder="å‘½ä¸­ä»»ä¸€å�³ä¿�ç•™ï¼ˆé€—å�·æˆ–ç©ºæ ¼åˆ†éš”ï¼‰" oninput="applyExclude()">
  <button class="btn-save" onclick="saveExclude()">ðŸ’¾ ä¿�å­˜å…³é”®è¯�</button>
  <span id="exclude-status" class="save-status" style="display:none;"></span>
</div>
<div class="exclude-row">
  <span class="hint">æŽ’é™¤å…³é”®è¯�ï¼ˆé€—å�·æˆ–ç©ºæ ¼åˆ†éš”ï¼‰</span>
  <input type="text" id="block-keywords" placeholder="å‘½ä¸­å�³å‰”é™¤ï¼Œä¸ŽåŒ…å�«å…³é”®è¯�å� åŠ ï¼ˆé€—å�·æˆ–ç©ºæ ¼åˆ†éš”ï¼‰" oninput="applyBlock()">
  <button class="btn-save" onclick="saveBlock()">ðŸ’¾ ä¿�å­˜æŽ’é™¤è¯�</button>
  <span id="block-status" class="save-status" style="display:none;"></span>
</div>
<div class="filters groups-box">
  <span class="hint">åˆ†ç»„</span>
  <a class="filter-btn)r_  r    u
   ">å…¨éƒ¨ (z)</a>
z  <a class="filter-btnz (r´  uB   <div class="status-filters"><span class="hint">çŠ¶æ€�ç­›é€‰</span>z=<div class="table-wrap"><table id="crawler-table"><thead><tr>r}  u   çŠ¶æ€�u   å��ç§°u   æ�¡æ•°zw-numu   æœ€æ–°zw-dater,  u
   7æ—¥æ–°å¢žzw-weeku   æ´»è·ƒzw-actu   åˆ†ç»„u   è„šæœ¬uC   <th class="w-run">æ—¥è·‘çŠ¶æ€�</th><th class="w-toggle">å�¯ç”¨</th>z</tr></thead><tbody>u   ðŸŸ¢rÓ  u   ðŸŸ¡u   âšªrð  u!   <span class="missing-script">âš  r²  ré  Tu   <span class="muted">â�¹ï¸� rš  rñ  ró  rÌ  rã  r\  r`  rÍ  ú+rä  z | rË   u   â�³u   æœ€è¿‘: rþ  zrun-oku   â�°r]  zrun-warnu   ðŸš«r^  z	run-blockrc  ra  rb  zrun-badzrun-idlerŽ   z class="row-off"z<button class="btn-toggle ÚonÚoffz" onclick="toggleEnabled(&#39;ú'z&#39;z&#39;)" title="u   ç‚¹å‡»ç¦�ç”¨u   ç‚¹å‡»å�¯ç”¨u
   âœ… å�¯ç”¨r�  r4  z<tr data-search=\"z\" data-status=\"z\"z>
  <td class="tc">z</td>
  <td class="ell" title="z</td>
  <td class="ta-r">z</td>
  <td class="nowrap">r&   z</td>
  <td class="active-col">z</td>
  <td>z</td>
  <td class="ell mono">z</td>
  <td class="run-state r­  z</td>
  <td class="tc">z</td>
</tr>
z</tbody></table></div>z</div><!-- /tab-manage -->uÏ:  <div id="tab-analysis" class="tab-content">
  <div class="analysis-controls">
    <div class="control-group">
      <label>æ—¶é—´è½´</label>
      <select id="period-select" onchange="loadChart()">
        <option value="day">æŒ‰æ—¥</option>
        <option value="week">æŒ‰å‘¨</option>
        <option value="month">æŒ‰æœˆ</option>
      </select>
    </div>
    <div class="control-group">
      <label>çºµè½´</label>
      <button id="mode-inc" class="active-ctrl" onclick="setMode('incremental')">å�•æ—¥å¢žé‡�</button>
      <button id="mode-cum" onclick="setMode('cumulative')">ç´¯è®¡æ€»é‡�</button>
    </div>
    <div class="control-group">
      <label>æŒ‡æ ‡</label>
      <button id="metric-both" class="active-ctrl" onclick="setMetric('both')">å�ŒæŒ‡æ ‡</button>
      <button id="metric-records" onclick="setMetric('records')">æ•°æ�®é‡�</button>
      <button id="metric-spiders" onclick="setMetric('spiders')">è„šæœ¬æ•°</button>
    </div>
    <div class="control-group">
      <label>æ—¶é—´èŒƒå›´</label>
      <select id="range-select" onchange="loadChart()">
        <option value="30">è¿‘30å¤©</option>
        <option value="90" selected>è¿‘90å¤©</option>
        <option value="180">è¿‘å�Šå¹´</option>
        <option value="365">è¿‘ä¸€å¹´</option>
        <option value="0">å…¨éƒ¨</option>
      </select>
    </div>
  </div>
  <div class="legend">
    <span><i class="b"></i>æ•°æ�®é‡�</span>
    <span><i class="g"></i>è„šæœ¬æ•°</span>
  </div>
  <div class="chart-container">
    <canvas id="analysis-chart" height="80"></canvas>
  </div>
  <div id="chart-summary" class="chart-summary"></div>
</div>  <!-- end tab-analysis -->

<script>
var currentMode = 'incremental';
var currentMetric = 'both';
var chartInstance = null;

function switchTab(event, tabId) {
  document.querySelectorAll('.tab-content').forEach(t => t.classList.remove('active'));
  document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
  document.getElementById(tabId).classList.add('active');
  event.target.classList.add('active');
  if (tabId === 'tab-analysis') loadChart();
}

function setMode(mode) {
  currentMode = mode;
  document.getElementById('mode-inc').classList.toggle('active-ctrl', mode === 'incremental');
  document.getElementById('mode-cum').classList.toggle('active-ctrl', mode === 'cumulative');
  loadChart();
}

function setMetric(metric) {
  currentMetric = metric;
  document.getElementById('metric-both').classList.toggle('active-ctrl', metric === 'both');
  document.getElementById('metric-records').classList.toggle('active-ctrl', metric === 'records');
  document.getElementById('metric-spiders').classList.toggle('active-ctrl', metric === 'spiders');
  loadChart();
}


function saveExclude() {
  const kw = document.getElementById('exclude-keywords').value.trim();
  const status = document.getElementById('exclude-status');
  status.style.display = 'inline';
  status.textContent = 'â�³ ä¿�å­˜ä¸­...';
  fetch('/crawler/admin/save-exclude?kw=' + encodeURIComponent(kw))
    .then(r => r.json())
    .then(data => {
      if (data.success) {
        // ä¿�å­˜æˆ�åŠŸ â†’ çŸ­æš‚æ��ç¤ºå�Žåˆ·æ–°é¡µé�¢ï¼ˆåˆ·æ–°å�Žè¾“å…¥æ¡†è‡ªåŠ¨å›žå¡«å·²ä¿�å­˜å…³é”®è¯�ï¼‰
        status.style.color = '#1e7d45';
        status.style.fontWeight = 'bold';
        status.style.background = '#eaf7ee';
        status.style.padding = '4px 12px';
        status.style.borderRadius = '12px';
        status.style.border = '1px solid #1e7d45';
        status.textContent = kw ? ('âœ… å·²ä¿�å­˜å…³é”®è¯�ï¼š' + kw + 'ï¼Œå�³å°†åˆ·æ–°') : 'âœ… å·²æ¸…é™¤å…³é”®è¯�ï¼Œå�³å°†åˆ·æ–°';
        setTimeout(() => { location.reload(); }, 800);
      } else {
        status.style.color = '#d93025';
        status.style.fontWeight = 'bold';
        status.style.background = '#fce8e6';
        status.style.padding = '4px 12px';
        status.style.borderRadius = '12px';
        status.style.border = '1px solid #d93025';
        status.textContent = 'â�Œ å¤±è´¥: ' + (data.error || '');
      }
      setTimeout(() => { status.style.display = 'none'; status.style.color = '#8a9099'; status.style.fontWeight = 'normal'; status.style.background = ''; status.style.padding = ''; status.style.borderRadius = ''; status.style.border = ''; }, 5000);
    })
    .catch(e => {
      status.style.color = '#d93025';
      status.style.fontWeight = 'bold';
      status.style.background = '#fce8e6';
      status.style.padding = '4px 12px';
      status.style.borderRadius = '12px';
      status.style.border = '1px solid #d93025';
      status.textContent = 'â�Œ è¯·æ±‚å¤±è´¥';
      setTimeout(() => { status.style.display = 'none'; status.style.color = '#8a9099'; status.style.fontWeight = 'normal'; status.style.background = ''; status.style.padding = ''; status.style.borderRadius = ''; status.style.border = ''; }, 5000);
    });
}

function applyExclude() {
  // ä»…ç”¨äºŽä¿�å­˜å…³é”®è¯�ï¼ˆç™½å��å�•ï¼‰ï¼Œå®žé™…è¿‡æ»¤åœ¨ /crawler/ æ�œç´¢é¡µç”Ÿæ•ˆï¼ˆæœ�åŠ¡ç«¯è¿‡æ»¤ï¼‰
  // è¯­ä¹‰ï¼šä¸�å†�æŽ’é™¤ï¼Œè€Œæ˜¯"ä»…é™�ç»™å®šå…³é”®è¯�"ï¼ˆOR åŒ¹é…�ä»»ä¸€å�³ä¿�ç•™ï¼‰
}

// â”€â”€ æŽ’é™¤å…³é”®è¯�ï¼ˆ2026-09-11 æ–°å¢žï¼‰â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
// è¯­ä¹‰ï¼šå‘½ä¸­å�³å‰”é™¤ï¼ˆæ ‡é¢˜/ç«™ç‚¹/URL ä»»ä¸€åˆ—å�«è¯¥è¯�å°±ä¸¢ï¼‰ï¼Œå¤šä¸ªè¯�ä¹‹é—´ ANDã€‚
// ä¸Žä¸Šé�¢çš„ã€ŒåŒ…å�«å…³é”®è¯�ã€�å� åŠ  = å�Œæ�¡ä»¶æ”¶çª„ï¼šå…ˆæŒ‰åŒ…å�«è¯�æ”¶ï¼Œå†�æŠŠæŽ’é™¤è¯�æ¸…æŽ‰ã€‚
// æœ�åŠ¡ç«¯è¿‡æ»¤ç‚¹ï¼šv2 åˆ—è¡¨ browse_itemsï¼ˆSQL çº§ï¼Œtotal ç²¾ç¡®ï¼‰+ ç»�å…¸é¡µ handle_db_listï¼ˆè¡Œçº§å…œåº•ï¼‰ã€‚
function applyBlock() {
  // å�Œ applyExcludeï¼šè¾“å…¥æ¡†æœ¬èº«ä¸�å�šè¿‡æ»¤ï¼Œå®žé™…è¿‡æ»¤åœ¨æœ�åŠ¡ç«¯
}

function saveBlock() {
  const kw = document.getElementById('block-keywords').value.trim();
  const status = document.getElementById('block-status');
  status.style.display = 'inline';
  status.textContent = 'â�³ ä¿�å­˜ä¸­...';
  fetch('/crawler/admin/save-block?kw=' + encodeURIComponent(kw))
    .then(r => r.json())
    .then(data => {
      if (data.success) {
        status.style.color = '#1e7d45';
        status.style.fontWeight = 'bold';
        status.style.background = '#eaf7ee';
        status.style.padding = '4px 12px';
        status.style.borderRadius = '12px';
        status.style.border = '1px solid #1e7d45';
        status.textContent = kw ? ('âœ… å·²ä¿�å­˜æŽ’é™¤è¯�ï¼š' + kw + 'ï¼Œå�³å°†åˆ·æ–°') : 'âœ… å·²æ¸…é™¤æŽ’é™¤è¯�ï¼Œå�³å°†åˆ·æ–°';
        setTimeout(() => { location.reload(); }, 800);
      } else {
        status.style.color = '#d93025';
        status.style.fontWeight = 'bold';
        status.style.background = '#fce8e6';
        status.style.padding = '4px 12px';
        status.style.borderRadius = '12px';
        status.style.border = '1px solid #d93025';
        status.textContent = 'â�Œ å¤±è´¥: ' + (data.error || '');
      }
      setTimeout(() => { status.style.display = 'none'; status.style.color = '#8a9099'; status.style.fontWeight = 'normal'; status.style.background = ''; status.style.padding = ''; status.style.borderRadius = ''; status.style.border = ''; }, 5000);
    })
    .catch(e => {
      status.style.color = '#d93025';
      status.style.fontWeight = 'bold';
      status.style.background = '#fce8e6';
      status.textContent = 'â�Œ è¯·æ±‚å¤±è´¥';
      setTimeout(() => { status.style.display = 'none'; status.style.background = ''; status.style.fontWeight = 'normal'; }, 5000);
    });
}

// é¡µé�¢åŠ è½½æ—¶å¡«å……å·²ä¿�å­˜çš„å…³é”®è¯�ï¼ˆåŒ…å�« + æŽ’é™¤ï¼‰
document.addEventListener('DOMContentLoaded', function() {
  var input = document.getElementById('exclude-keywords');
  if (input && typeof savedExcludeKeywords !== 'undefined') {
    input.value = savedExcludeKeywords;
  }
  var binput = document.getElementById('block-keywords');
  if (binput && typeof savedBlockKeywords !== 'undefined') {
    binput.value = savedBlockKeywords;
  }
});

function loadChart() {
  var period = document.getElementById('period-select').value;
  var days = document.getElementById('range-select').value;
  var mode = currentMode;
  var metric = currentMetric;
  var summaryDiv = document.getElementById('chart-summary');
  summaryDiv.innerHTML = '<div class="chart-stat">â�³ åŠ è½½ä¸­...</div>';
  fetch('/crawler/admin/analysis?period=' + period + '&mode=' + mode + '&metric=' + metric + '&days=' + days)
    .then(r => r.json())
    .then(data => {
      if (!data.labels || data.labels.length === 0) {
        summaryDiv.innerHTML = '<div class="chart-stat">æš‚æ— æ•°æ�®</div>';
        return;
      }
      renderChart(data);
      var unit = period === 'month' ? 'æœˆ' : (period === 'week' ? 'å‘¨' : 'æ—¥');
      var rc = data.record_counts || [];
      var sc = data.spider_counts || [];
      // Records stats
      var r_total = rc.length > 0 ? rc[rc.length - 1] : 0;
      var r_sum = rc.reduce(function(a,b){return a+b}, 0);
      var r_avg = rc.length > 0 ? (r_sum / rc.length).toFixed(1) : '0';
      var r_max = rc.length > 0 ? Math.max.apply(null, rc) : 0;
      // Spider stats
      var s_total = sc.length > 0 ? sc[sc.length - 1] : 0;
      var s_sum = sc.reduce(function(a,b){return a+b}, 0);
      var s_avg = sc.length > 0 ? (s_sum / sc.length).toFixed(1) : '0';
      var s_max = sc.length > 0 ? Math.max.apply(null, sc) : 0;
      summaryDiv.innerHTML =
        '<div class="chart-stat cs-sep">' +
          '<b class="cs-b">ðŸ“Š æ•°æ�®é‡�</b> æ€»è®¡: <span>' + r_total + '</span> | ' +
          'å�‡å€¼: <span>' + r_avg + '</span>/' + unit + ' | å³°å€¼: <span>' + r_max + '</span>/' + unit +
        '</div>' +
        '<div class="chart-stat">' +
          '<b class="cs-g">ðŸ“œ è„šæœ¬æ•°</b> æ€»è®¡: <span>' + s_total + '</span> | ' +
          'å�‡å€¼: <span>' + s_avg + '</span>/' + unit + ' | å³°å€¼: <span>' + s_max + '</span>/' + unit +
        '</div>' +
        '<div class="chart-stat cs-sepl">ðŸ—“ <span>' + data.labels.length + '</span> ä¸ªæ—¶é—´åŒºé—´</div>';
    })
    .catch(function(err) {
      summaryDiv.innerHTML = '<div class="chart-stat cs-err">åŠ è½½å¤±è´¥: ' + err.message + '</div>';
    });
}

function renderChart(data) {
  var ctx = document.getElementById('analysis-chart').getContext('2d');
  if (chartInstance) chartInstance.destroy();

  var isCum = currentMode === 'cumulative';
  var labelSuffix = isCum ? 'ç´¯è®¡' : 'å¢žé‡�';

  var labels = data.labels;
  var rc = data.record_counts || [];
  var sc = data.spider_counts || [];

  if (labels.length > 120) {
    var step = Math.ceil(labels.length / 120);
    var nl = [], nrc = [], nsc = [];
    for (var i = 0; i < labels.length; i += step) {
      nl.push(labels[i]);
      nrc.push(rc[i] || 0);
      nsc.push(sc[i] || 0);
    }
    if (nl[nl.length-1] !== labels[labels.length-1]) {
      nl.push(labels[labels.length-1]);
      nrc.push(rc[rc.length-1] || 0);
      nsc.push(sc[sc.length-1] || 0);
    }
    labels = nl; rc = nrc; sc = nsc;
  }

  var datasets = [];
  var activeMetric = currentMetric;

  if (activeMetric === 'records' || activeMetric === 'both') {
    datasets.push({
      label: 'æ•°æ�®é‡� (' + labelSuffix + ')', data: rc, fill: true,
      backgroundColor: 'rgba(26,115,232,0.15)',
      borderColor: 'rgba(26,115,232,0.85)',
      pointBackgroundColor: 'rgba(52,152,219,1)',
      pointRadius: 2, pointHoverRadius: 5,
      borderWidth: 2, tension: 0.35,
    });
  }

  if (activeMetric === 'spiders' || activeMetric === 'both') {
    datasets.push({
      label: 'è„šæœ¬æ•° (' + labelSuffix + ')', data: sc, fill: true,
      backgroundColor: 'rgba(30,125,69,0.12)',
      borderColor: 'rgba(30,125,69,0.85)',
      pointBackgroundColor: 'rgba(39,174,96,1)',
      pointRadius: 2, pointHoverRadius: 5,
      borderWidth: 2, tension: 0.35,
      yAxisID: 'y',
    });
  }

  chartInstance = new Chart(ctx, {
    type: 'line',
    data: { labels: labels, datasets: datasets },
    options: {
      responsive: true, maintainAspectRatio: false,
      interaction: { mode: 'index', intersect: false },
      plugins: {
        legend: { display: datasets.length > 1, position: 'top' },
        tooltip: { callbacks: { label: function(ctx) { return ctx.dataset.label + ': ' + ctx.parsed.y; } } }
      },
      scales: {
        x: { grid: { display: false }, ticks: { font: { size: 11 }, maxRotation: 45 } },
        y: { beginAtZero: true, grid: { color: 'rgba(0,0,0,0.06)' }, ticks: { font: { size: 11 } } }
      }
    }
  });
}

// Daily run
var dailyCheckTimer = null;
function runDaily() {
  var card = document.getElementById('daily-run-card');
  var icon = document.getElementById('daily-run-icon');
  var label = document.getElementById('daily-run-label');
  var logDiv = document.getElementById('daily-run-log');
  icon.textContent = 'â�³'; label.textContent = 'å�¯åŠ¨ä¸­...';
  card.style.cursor = 'default'; card.onclick = null;
  fetch('/crawler/admin/run-daily').then(function(r){return r.json()}).then(function(data){
    if (data.running) {
      icon.textContent = 'ðŸ”„'; label.textContent = 'è¿�è¡Œä¸­...';
      logDiv.style.display = 'block';
      logDiv.textContent = data.message + '\n\næ—¥å¿—å�³å°†åˆ·æ–°...';
      dailyCheckTimer = setInterval(checkStatus, 5000);
      checkStatus();
    } else {
      icon.textContent = 'â�Œ'; label.textContent = data.message;
      setTimeout(resetButton, 3000);
    }
  }).catch(function(e){ icon.textContent = 'â�Œ'; label.textContent = 'ç½‘ç»œé”™è¯¯'; setTimeout(resetButton, 3000); });
}
function checkStatus() {
  fetch('/crawler/admin/run-status').then(function(r){return r.json()}).then(function(data){
    var icon = document.getElementById('daily-run-icon');
    var label = document.getElementById('daily-run-label');
    var logDiv = document.getElementById('daily-run-log');
    if (data.running && data.log_tail) logDiv.textContent = data.log_tail;
    if (!data.running) {
      icon.textContent = 'âœ…'; label.textContent = 'æ—¥è·‘å®Œæˆ�';
      if (dailyCheckTimer) { clearInterval(dailyCheckTimer); dailyCheckTimer = null; }
      setTimeout(function(){ location.reload(); }, 3000);
    }
  });
}
/* 2026-09-11: åŽŸ editUrl()ï¼ˆå¼¹ prompt æ”¹ã€Œæ�¥æº�URLã€�ï¼‰å·²ç§»å…¥ Archive â€”â€” flat-list æ—¶ä»£å­¤å„¿ï¼Œ
   UI æ— å…¥å�£è°ƒç”¨ï¼›é…�å¥—ç«¯ç‚¹ /crawler/admin/set-url ä¸Ž set_crawler_url() ä¸€å¹¶ç§»é™¤ã€‚ */
function toggleEnabled(name) {
  if (!confirm('ç¡®è®¤åˆ‡æ�¢çˆ¬è™«å�¯ç”¨çŠ¶æ€�?\n' + name)) return;
  fetch('/crawler/admin/toggle-enabled?name=' + encodeURIComponent(name))
    .then(function(r){return r.json()})
    .then(function(data){
      if (data.success) location.reload();
      else alert('åˆ‡æ�¢å¤±è´¥: ' + (data.error || 'æœªçŸ¥é”™è¯¯'));
    })
    .catch(function(e){ alert('ç½‘ç»œé”™è¯¯: ' + e.message); });
}
function resetButton() {
  var card = document.getElementById('daily-run-card');
  var icon = document.getElementById('daily-run-icon');
  var label = document.getElementById('daily-run-label');
  icon.textContent = 'â–¶ï¸�'; label.textContent = 'æ‰‹åŠ¨æ—¥è·‘';
  card.style.cursor = 'pointer'; card.onclick = runDaily;
}


</script>
</div><!-- /wrap -->
</body></html>r�  )"r'  r]   r   r€   rr  r‚   r1  r„   r9  rÊ  rõ  r  rg  r   r   r   rœ  r…   r»  r…  r¼  r  r  r  r  r   r   r  r  r¹  r·  rª   rr   r�   )?r7  r·  r¸  r¹  rà   rº  r�  r£  r»  rÄ  rD  r   Útotal_recordsrì  rí  rî  rï  Ú	enabled_nÚgroupsrµ   r_  rÊ  Únow_strÚ
week_totalÚ	day_totalÚ_rowsrŸ  Ú
_SORT_KEYSr†  rŽ  Ú	_sf_itemsÚ_sf_htmlÚ_keyÚ_labelr‹  r!   Úsaved_excluder˜  Úsaved_blockr  ÚgdataÚ_gactÚactive_markerÚscript_displayÚ_display_urlrf  Úhistory_titlesrg  r  r¦  Ú_nÚstatus_titleÚrun_clsÚsearch_textÚ_row_statusÚ	_tr_extraÚ_enabledÚ_toggle_btnr‚  r�  rŒ  r�  r.  s?   `````                                                     @@@@@r	   rå  rå  «  s  ÿù€ ô &Ó'�M€HˆcÜ�‹M€EÛ O G§O¡O´IÓ$>×$FÑ$FÐGeÓ$f×$oÑ$oÓ$qÐrsÑ$t�Mð  wFÐv}÷  wFñ  wFô  GPó  wQ÷  wWñ  wWô  wYÜÑ:˜xÔ:Ó:€IÜÑ:˜xÔ:Ó:€IÜÑ< Ô<Ó<€JÜÑ> Ô>Ó>€KÜÑB˜xÔBÓB€Ià€FØò %ˆØˆg‰JˆØ�F‰?Ø"#°¸QÑ?ˆF�1‰IØˆq‰	�'Ó˜aÑÓØˆq‰	�)Ó  '¡
Ñ*ÓØˆX‹;Ø�1‰I�hÓ 1Ñ$Ôð%õ "Øˆh�l‰l‹n×%Ñ%Ð&6Ó7€GÜÑ5¨HÔ5Ó5€JÜÑ3¨(Ô3Ó3€Ið €EÙ�&˜E’/Ø!Ö:�q Q w¡Z°6Ó%9’Ð:ˆÐ:Ù�7˜eÒ#Ø!ÖF�qÔ%7¸Ó%:¸gÓ%E’ÐFˆÐFÙ
Ø�Y‰Y‹[×ÑÓ ˆÙØ %ö  M˜1¨°·±°v³Ò1DÀ"ÈÑ0KÈqÏuÉuÐU]ËÒOdÐbdÑ0eÐhkÑ0kÐop×otÑotÐuzÓo{ò  pBð  @Bñ  1C÷  0Jñ  0Jó  0Lò  *L’Qð  MˆEð  MáZÙ1Ù1Ù;Ù4Ù5Ù2Ù3Ù1ñ
€Jð �:ÑØˆØ˜U’]‰E¨€EðÜ�u *¨TÑ"2¸UÀf¹_ÔNˆô ˜“Z€NðÜ�!”S˜“XÓˆô �a˜.¨3Ñ.°Ñ2°sÑ:Ó;€KðÜ�4‹yˆô ˆq”#�d˜KÓ(Ó)€DØ�t˜a‘x 3Ñ&¨¨s©
Ð3€I÷=ñ =÷G÷ð ò4q€Ià€HØ!ò F‰ˆˆfØ  WÒ%5°Ò6‰y¸BˆÙÙšd¡J°¸Ö$;ºVðEñ 	F‰ðFð
 €Eð €MðÜÔ$Ó%ð 	-¨ØŸF™F›HŸN™NÓ,ˆM÷	-ð
 €KðÜÔ"Ó#ð 	+ qØŸ&™&›(Ÿ.™.Ó*ˆK÷	+ð
 
‡L�L÷ Gó Gð (ð Gô )-¯
©
°=Ó(AÐ'BðGðCðGô #Ÿj™j¨Ó5Ð6ðGðP7ðGôp (¨Ó1Ð2ðqGðp31ðqGðF 2?°ðGGðF@0ðGGðH 16¨wðIGðH71ðIGðJ 2;°ðKGðJ<rðKGñR JOÐr{ð  }Bñ  sBð  CFò  sFð  UVð  WZð  r[ðSGðR [~ðSGðR Hð  ~IðSGðRIrðSGñT JOÐr{ð  }Bñ  sBð  CFò  sFð  UVð  WZð  r[ðUGðT [~ðUGðT Hð  ~IðUGðTIrðUGñV KPÐr|ð  ~Cñ  sCð  DGò  sGð  VWð  X[ð  r\ðWGðV \ðWGðV @Jð  KðWGðVKtðWGñX NSÐtð  AFñ  uFð  GJò  uJð  YZð  [^ð  t_ðYGðX _BðYGðX CNð  BOðYGðXO2ðYGð^ 3<°ð_Gð^=1ð_Gð` 2<°ðaGð`=$ðaGðn %, 9ðoGðn-ðoGðL %+¨e¢O‘y¸Ð<ðMGðL =EðMGñL FPÐRWÐ[\ÔE]ÐD^ðMGðL _iðMGðL joÐhoðMGðLpôMGô GôP ˜vŸ|™|›~Ó.ò {‰ˆˆuØ# uš_‘	°"ˆØ�‰Ð-¨e¨W°H¹ZÈ%ÐSTÔ=UÐ<VÐVXÐY^ÐX_Ð_aÐbgÐhoÑbpÐaqÐqxÐyÕzð{ð 
‡L�L�ÔØ	‡L�LÐUÐX`Ñ`ÐckÑkÔlØ	‡L�LÐPÙ˜h¨Ó1ñ2á˜f hÓ/ñ0ñ ˜g x°Ó9ñ:ñ ˜h¨°(Ó;ñ	<ñ
 ˜f l°HÓ=ñ>ñ ˜h¨°'Ó:ñ;ñ ˜g xÓ0ñ1ñ ˜h¨Ó1ñ2ð Yñ	Yð *ñ
*ô 
+ð ó 7ˆØ"# H¢+™¸aÀ
¹mÈaÒ>O±FÐUZˆØ˜8™ˆØ�Ò!Ø@ÀÀ8ÁÀÈWÐU‰NØ—‘�y $Ô'Ø:¸1¸X¹;¸-ÀwÐOˆNà—u‘u˜U BÓ'ÒB¨1¯5©5°¸rÓ+Bˆð Ð(Ñ)ˆ
àˆØ—‘Ð)¨2Ó.ò 	BˆAØ�:‘˜s Ð#ˆBØ˜H™+¨Ò1‘°uˆBØ,-¨kªN�1�Q�{‘^Ð$ CÑ(ÀˆBØ×!Ñ! R D¨¨"¨¨a°©k¨]¸!¸B¸4Ð"@ÕAð		Bñ
 :H�u—z‘z .°°!Ð"4Ô5ÈRˆØ× Ñ  Ô'áØ!)¨.¸Ñ*;Ð)<Ð=Ô]`ÐaoÓ]pÐstÒ]tÀ2ÀnÐUVÑFWÐEXÑAYÐz|Ñ}�ð  *×4Ñ4°UÔ;‘8Ø"'¨:Ñ"5¸ÀZÑ9O‘:Ø#)¨ZÑ#7¸;È*Ñ;T‘;Ø!+×!6Ñ!6°uÔ!=ÀÈ:ÑAUØ$,°
Ñ$:¸hÈ*Ñ>Tñ Ø[eð	 	ð
 ˜‘y 3‘¨¨8©Ñ4°sÑ:¸lÒ>PÈbÑQ×XÑXÓZ×bÑbÐcfÐhjÓkˆä(¨Ó+ˆØ./¯e©e°I¸tÔ.DÑ&È"ˆ	Ø—5‘5˜ DÓ)‰á‰D %Ñ'Ü��&‘	‹N×"Ñ" 3¨Õ0Ù&‰N¨NÑ:Ù$‰L¨/Ñ9ð	
ˆð 	�‰÷ ó Ð-ð ¨k¨]ð Ð:Oð ÐP[È}ð Ð\`ð ÐajÐ`kð ð lð Ø�ðð!ðà˜F™)˜ðà$&ðà'(¨¡y kðð2ðð �g‘J�<ðð ðð 45°X±;Ò3DÀ"ÈÒ2L�q˜‘{Ò( b¨#¨2Ñ.ÐRUÐVð	ðWð	ð
 �j‘M�?ðð
#ðð $% X¢;™%°EÐ:ðð;ðð 	ˆ�z€lðððð 'Ð'ðð(ðð  �yðð !*ðð +7¨ðð 8:ðð ;E¸ððFðð �ððôö 	ðW7ðp 
‡L�LÐ)Ô*Ø	‡L�L‘“Ôð
 
‡L�LÐ-Ô.Ø	‡L�Lð [ô [ðx
 �7‰7�5‹>Ðùòw ;ùâFùò Møô" ò Úðûô
 ò Ø‹ðûô
 ò Ø‹ðú÷v	-ñ 	-ûðÚú÷	+ñ 	+ûðÚús£   ÆbÆbÆ%bÆ9bÇ%AbÉbÉ-b Êb  Ê8b2 Ì=c ÍcÍ+c Í6c& ÎcÎ$c& â	bâbâ b/â.b/â2cã cãcã	c ãcãc#ãc& ã&c+c                 ó   — t        j                  t        t        «      «      }t	        |t
        «      }|r|n|j                  dg «      }|D ]y  }|j                  d|j                  dd«      «      }|| k(  sŒ+|j                  dd«      }| |d<   |r|n|}t        j                  |t        t        d«      dd	¬
«       d| |d   dœc S  dd| › d�dœS )uE   åˆ‡æ�¢çˆ¬è™«é…�ç½®çš„å�¯ç”¨/ç¦�ç”¨çŠ¶æ€� (ä¿�æŒ�åŽŸ flat-list æ ¼å¼�)r»  r  rœ  r   ré  Trk  Frž   r¼  )r¿  r  ré  r¾  r¿  rÀ  )r  rØ  r  rÀ  rÙ  r5  r   rÃ  )r  rÄ  Úis_listr»  rµ   Úcnamer‡  r"   s           r	   ré  ré  ®!  sÌ   € ä
�)‰)”DœÓ%Ó
&€CÜ˜œdÓ#€GÙ‰s 3§7¡7¨:°rÓ#:€HØò LˆØ—‘�f˜aŸe™e K°Ó4Ó5ˆØ�D‹=Ø—%‘%˜	 4Ó(ˆCØ"˜7ˆAˆi‰LÙ%‘(¨3ˆCÜ�I‰I�cœ4¤¨SÓ1ÀÈaÕPØ#¨T¸aÀ	¹lÑKÒKðLð ¨°4°&¸Ð'DÑEÐEr   c                 ó6	  — ddl }ddl}ddl}ddl} |j                  t        t        «      «      }t        |t        «      rd|i}d}|d   D ]K  }|j                  d|j                  dd«      «      | k(  sŒ)|j                  d|j                  dd«      «      } n |sd	d
| z  dœS |j                  d«      r#d|j                  j                  t        |«      g}nì|j                  d«      r#d|j                  j                  t        |«      g}n¸d|j                  j                  t        |«      g}|d   D ]Ž  }|j                  dd«      | k(  sŒ|j                  dd«      }	|	rat        |	t        «      r)|j                  |	D �
cg c]  }
t        |
«      ‘Œ c}
«       n(|j                  t        |	«      j!                  «       «        n 	  |j"                  |ddd¬«      }|j$                  }|j&                  dd |j(                  dd z   }t+        |j                  «       «      }||||dk7  d	d| dœ}d}	  |j                  t        |«      «      }|j-                  |«       t/        |«      dkD  r|dd } |j0                  |t        |d«      «       d}|dk(  rdnd}	  |j                  t        |«      «      }d}|j!                  d«      D ]?  }d|v sd|v sŒddl} |j4                  d |«      }|sŒ&t+        |j7                  d!«      «      }ŒA |dk(  rd"|z  nd#|z  |d$œ|| <    |j0                  |t        |d«      d	¬%«       	 t9        d&«      j;                  d'«      }t9        d(«      j<                  j?                  «       jA                  d)«      }t9        d(«      j<                  j?                  «       jA                  d*«      }|dk(  rd+nd,}|r|j                  jC                  |«      n| }|jE                  d-|||| ||d|dk(  rdnd.|› �f«       |jG                  «        |jI                  «        |dk(  | |||dd/ |dk(  rd0d2œS d1|z  d2œS c c}
w #  g }Y �ŒxY w#  i }Y �Œ¥xY w#  Y Œ8xY w# |jJ                  $ r	 d	d3| d4œcY S tL        $ r}d	t        |«      | d4œcY d}~S d}~ww xY w)5u   è¿�è¡Œå�•ä¸ªçˆ¬è™«è„šæœ¬r   Nr»  r   r  rœ  r  rÎ  FzCrawler "%s" not foundrÀ  rÜ  Úbashz.jsÚnoder1  rl  Ti,  r2  iþÿÿ)r  rè  ÚrcÚ	has_errorr~   rÍ  r  z/tmp/crawl_results.jsonr¯  rk  rç  r\  r`  rþ  u   æ–°å¢žÚnewz(\d+)r›   u
   âœ… +%dæ�¡u	   â�Œ rc=%d)r}  rè  rö  r   r   rÊ  r  z%H:%M:%Srã  ra  z INSERT OR REPLACE INTO run_logs (run_date, run_time, script_name, config_name, status, new_count, elapsed_seconds, error_detail) VALUES (?, ?, ?, ?, ?, ?, ?, ?)zrc=r�  u   å·²å®Œæˆ� (exit 0)zrc=%d)r¿  r  r  r¶  r9  Úmessageu   æ‰§è¡Œè¶…æ—¶(300s))r¿  r§  r  )'r4  r  rÕ   ÚtimerØ  r  rÀ  rÙ  r5  r   rt   rÖ   r   r±  r£   r�   r   r5  r8  r6  r7  r…  r   r]   rÃ  r   r   r'   rô  r€   rÊ  rõ  r  rõ  r‚   rƒ   r„   ÚTimeoutExpiredr…   )r  r4  r  rÕ   rº  rÄ  r  rµ   Úcmdrl  rí  r»   r¶  r9  Únow_tsÚ
run_recordÚstatus_fileÚexistingÚrun_status_fileÚ	run_emojiÚrsrÍ  rY  r   r(   ró  Ú_todayÚ_nowÚ_statusÚ_script_namerá  s                                  r	   Úrun_single_scriptrÈ  ½!  sˆ  € ç%×%Ø
ˆ$�)‰)”DœÓ%Ó
&€CÜ�#”tÔØ˜3ÐˆØ€FØ�‰_ò ˆØ�5‰5�˜Ÿ™˜{¨BÓ/Ó0°DÓ8Ø—U‘U˜8 Q§U¡U¨9°bÓ%9Ó:ˆFÙðñ Ø Ð+CÀdÑ+JÑKÐKà‡��uÔØ�r—w‘w—|‘|¤O°VÓ<Ð=‰Ø	�‰˜Ô	Ø�r—w‘w—|‘|¤O°VÓ<Ð=‰à˜"Ÿ'™'Ÿ,™,¤¸Ó?Ð@ˆà�Z‘ò 	ˆAØ�u‰u�V˜RÓ  DÓ(Ø—u‘u˜V RÓ(�ÙÜ! $¬Ô-ØŸ
™
°DÖ#9¨q¤C¨¥FÒ#9Õ:àŸ
™
¤3 t£9§?¡?Ó#4Ô5Ùð	ðEAØ�—‘ °D¸tÈSÔQˆØ×ÑˆØ—‘˜t˜uÐ%¨¯©°d°eÐ(<Ñ<ˆä�T—Y‘Y“[Ó!ˆàØØØ˜q™ØØØñ
ˆ
ð 0ˆð	Ø �t—y‘y¤ kÓ!2Ó3ˆHð 	�‰˜
Ô#Üˆx‹=˜3ÒØ  �ˆHØˆ�	‰	�(œD ¨cÓ2Ô3à=ˆØ 1šW‘E¨%ˆ	ð	Ø�—‘œ4 Ó0Ó1ˆBð ˆ	Ø—L‘L Ó&ò 	0ˆDØ˜4Ñ 5¨D¢=ÛØ�B—I‘I˜h¨Ó-�ÚÜ # A§G¡G¨A£J£‘Ið	0ð ;=Àº'˜l¨YÒ6À{ÐUWÑGWÐ_eÑfˆˆ4‰Øˆ�	‰	�"”d˜?¨CÓ0¸uÕEð	Ü˜YÓ'×/Ñ/Ð0AÓBˆCÜ 
Ó+×4Ñ4×8Ñ8Ó:×CÑCÀJÓOˆFÜ˜jÓ)×2Ñ2×6Ñ6Ó8×AÑAÀ*ÓMˆDØ"$¨¢'‘h¨xˆGÙ7=˜2Ÿ7™7×+Ñ+¨FÔ3À4ˆLØ�K‰Kð2ð ˜˜|¨T°7¸IÀqØ˜Q’w‘ c¨"¨ Jð0ô	1ð �J‰JŒLØ�I‰IŒKð ˜Q‘wØØØØ˜T˜c�lØ/1°QªwÐ+ñ
ð 	
ð =DÀb¹Lñ
ð 	
ùò} $:øð,	Ø‹Hûð	Ø‹Bûð4	Ùûð ×$Ñ$ò OØ Ð+?ÈÑNÒNÜò AØ ¬3¨q«6¸4Ñ@Õ@ûðAúsˆ   Å>Q 
ÇA)Q  È.Q É	AQ  ÊQ Ê1Q  ËQ  Ë*AQ  Ì;C*Q Ð%Q  Ð9Q  ÑQÑ	Q  ÑQÑQ  ÑQÑQ  Ñ RÑ7RÑ?RÒRÒRz/tmp/daily_crawl_run.pidc                  ó$  — dd l } dd l}t        «       }|j                  d«      rddddœS 	  | j                  «       }|dk(  re | j
                  «         |j                  ddg|j                  |j                  ¬	«        | j                  t        «        | j                  d«       y t        t        d
«      5 }|j                  t        |«      «       d d d «       ddd|dœS #  Y ŒQxY w# 1 sw Y   ŒxY w# t        $ r}dd|› �ddœcY d }~S d }~ww xY w)Nr   ÚrunningFu   æ—¥è·‘å·²åœ¨è¿�è¡Œä¸­T)r¿  r¹  rÊ  r´  z/root/daily_incremental.sh)r6  r7  rk  u   æ—¥è·‘å·²å�¯åŠ¨)r¿  r¹  rÊ  ri  u   å�¯åŠ¨å¤±è´¥: )rÕ   r4  rç  r   ÚforkÚsetsidr5  ÚDEVNULLr$  ÚRUN_PID_FILEÚ_exitr  r‚  r�   r…   )rÕ   r4  r}  ri  r˜  rá  s         r	   ræ  ræ  ("  sú   € ßÜ!Ó#€FØ‡z�z�)ÔØ Ð-DÐQUÑVÐVðUØˆb�g‰g‹iˆØ�!Š8ØˆB�I‰IŒKØˆJ�N‰N˜FÐ$@ÐAØ *× 2Ñ 2¸:×;MÑ;MõOà�—‘œ<Ô(àˆB�H‰H�Q�Kä”l CÓ(Ð@¨A¨q¯w©w´s¸3³xÔ/@×@Ø#Ð0AÈdÐ[^Ñ_Ð_øð	 ‘Dú÷ AÐ@ûäò UØ ¨~¸a¸SÐ-AÈeÑTÕTûðUúsT   «AC3 Á=C  ÂC3 Â&C3 Â6C'ÃC3 Ã C$Ã"C3 Ã'C0Ã,C3 Ã3	DÃ<D
ÄDÄ
Dc                  ó  — dd l } dd l}| j                  j                  t        «      r–	 t        t        «      5 }t        |j                  «       j                  «       «      }d d d «        | j                  d«       d}	  |j                  ddt        › �dgd|j                  ¬«      j                  dd	¬
«      }d||dœS ddiS # 1 sw Y   ŒcxY w#  Y ŒxY w# t        t        f$ r$  | j                   t        «       n#  Y nxY wY ddiS w xY w)Nr   r   Útailr&   z/var/log/crawler_daily.logrm   )r~   r7  rt  rr   r<  T)rÊ  ri  Úlog_tailrÊ  F)rÕ   r4  rÖ   rÜ   rÎ  r  r…  r  r   ÚkillÚcheck_outputÚRUN_LOG_TAILrÍ  rz  rÙ   r„  r$  )rÕ   r4  r˜  ri  rÒ  s        r	   rç  rç  <"  sû   € ßØ	‡w�w‡~�~”lÔ#ð	Ü”lÓ#ÐE q´°A·F±F³H·N±NÓ4DÓ0E¨#×EØˆB�G‰G�C˜ŒOØˆHðØ2˜:×2Ñ2Ø˜q¤ Ð/Ð1MÐNØ j×&8Ñ&8ô:ç:@¹&ÀÐQZ¸&Ó:[ð ð  $¨C¸XÑFÐFð �uÐÐ÷ FÐEûð ‘DûäœÐ$ò 	Ø�—‘œ<Õ(øØ‘DûØ�uÐÐð	úsX   ©C ¸(CÁ C Á>:C Â8C ÃCÃC ÃCÃC ÃDÃ$C;Ã:DÃ;C?Ã=DÄDÚ__main__z0.0.0.0)r›   r|   rÿ   NNrô   N)r›   rt  rô   N)rm   )Fr\   )r   r   )NrÎ   r  rô   r   r   r   F)rÍ   )r   rô   r   r   r6  )rÌ   )r¡  )r¨  )FNrÎ   r  rô   r   F)é   r�  )rÃ  rÅ  rq  rn  )r›   rô   rô   r   rµ  r¶  r|   r   )ÙÚ__doc__Úhttp.serverr…  r   Úurllib.parserž  r   rÕ   ra  r  rÊ  ÚioÚcsvÚsignalÚsysr˜   rA  r¹   r
   r�   r~  re  r   r   r$   rŒ  r”  r´  ÚCSV_PATHÚPORTr)   ÚPHASESr/  rs   r  rœ  rv   rq   rz   rˆ   Ú
CATEGORIESr“   r™   rµ  r§   r®   r©   r½   rÂ   rØ   rÚ   rÛ   rÉ   ÚcompilerÞ   ré   rî   ró   r   rs  r‡  rŠ  r�  r‘  r•  r—  rŸ  r¤  rª  r@  rµ  r  r¹  r¡  r»  rß  ÚIÚSr½  r¾  r¿  rÀ  rÁ  rÃ  Ú_EXC_LABELSrÆ  rÓ  r©  rÔ  rÏ  rÈ  rÉ  rÑ  rÊ  rÕ  rÒ  rË  rÝ  rà  r  Ú	frozensetr   r  r  r  r  r	  r  r  r  r  rm  rw  r½  r~  rˆ  r“  r”  r•  r‹  r�  rœ  rÒ  rà  r  r  r  rþ  rÂ  rÁ  rÀ  rü  r¿  r¾  r8  r:  r<  rB  rE  rK  r_  rý  rm  ro  rt  r•  r®  rn  ro  rÆ  rñ  r×  rº  r  Úshutilr%  rü  rÖ  r  rÈ  r¸  r¹  rÂ  rÓ  rÚ  rß  râ  rç  rï  rò  rù  rþ  r  r*  r:  r@  rZ  r\  r_  rc  re  r  ri  rÿ  r  ÚserverÚBaseHTTPRequestHandlerrm  r4  rÀ  rr  r±  r  r  r   rª  rÁ  r¬  rd  r¸  r°  r¶  r¹  rè  r'  rÁ  rg  rå  ré  rÈ  rÎ  rÕ  ræ  rç  rž  ÚThreadingHTTPServerÚserve_forever)r    r_   r,   r`   r­  s   00000r	   ú<module>rí     sâ	  ðñ÷ v× u× u× u× u× u× uÓ uò
Bð €à!€ð &Ð ò QÐ Ø'°;ÈnÑ]Ð ò	ð '€à€
à€à€à€òð$ ˜ð  3Cñ  Dà
˜^ð  8Xñ  Yà
˜Nð  7qñ  rà
˜~ð  :Sñ  Tà
˜^ð  8añ  bà
˜^ð  8iñ  jð
€ð  "(Ö(˜AˆQˆt‰W�a‰ZÒ(€	ð Ð&ò  )d	ð  e	Ø�?ò  %Wð  XØ�^ò  &Gð  HØÐ$ò  'uð  vØˆ^ò  ~ð  Ø
ˆNÒwÐxØ�ò  !pð  qØˆhò  að  bØÐ ò  #_ð  `ØÐ#ò  &rð  sØÐò  !Rð  SØ
ˆNò  rð  sØ�(Ò}Ð~Ø�nò  'Zð  [ð€ð" ]k×kÐkÑFXÀfÈeÐUX�˜v°¸SÑAÑAÔk€ñ ÙZ¸^ÔZÙô€ò€òò,ð  NÑ3ð€
òeò9ðk€	ò^	òò$	òò	ð %€à€ØÐ ò	ð ˆR�Z‰ZÐeÓf€
ò#òLò.ôk!òZ	
"ô 2òl
ô 2òlô(2òlò<ò<ô0 òL Q€ðð ð<ð 
ô*Uð.  €
ò*ñ\ Ô Ù Ô ð ˆr�z‰zÐDÓE€ð �"—*‘*ÐTÐVX×VZÑVZÐ]_×]aÑ]aÑVaÓb€Ø�—‘ÐNÐPR×PTÑPTÐWY×W[ÑW[ÑP[Ó\€Ø�B—J‘J˜}¨b¯d©dÓ3Ð Ø�—‘Ð,¨b¯d©dÓ3€ð �—‘ØRÐTV×TXÑTXóZ€òð( H€Ø�—
‘
˜4 +Ñ-°Ñ?Ó@€ð ˆr�z‰zð +ó ,€ð ˆr�z‰zð  Ió  J€àˆr�z‰zÐaÓb€Øˆb�j‰jÐeÓf€Øˆr�z‰zÐ9Ó:€Ø�—
‘
ÐDÓE€ØˆR�Z‰Z˜Ó €
Øˆb�j‰j˜Ó)€Øˆr�z‰zÐLÓM€àˆr�z‰zð  Dó  E€òKò*%òZ.ð& �—
‘
Ð.Ó/€ñ
 "ò #ó Ð ð> �—
‘
ð]ó^€ð
 �B—J‘JÐPÓQÐ Ø€ôDôF	(ð0 ˆR�Z‰Zð8ó9€
ð �B—J‘JÐRÓSÐ òGð w)€
ð e€ôóF ð ˜A Q¨r¸"ÀCÑH€	òòðcÐ ð €ð Ð àÐ òô6Rðj EJØ6;ôY!ôx?&ðDS€ðlk€
ô\]ò@ò
ôMô
HðB $¨nÀtÐTXØ/Ø^ñ`ð Ð):ÀTÐRWØ/ØNñPð  ¨+ÀÈUØ/ØKñMð #¨]ÀUÐSXØ)ØTñVñ€ô Hò<?òòô.òò&ò"ð( GMØ6;ô_!ðD LQØ6;ôNò.*ô8&ò*0òf>òBKðh €Ø€ó Û Û Û Û à€	Ø-€Ø'€ØÐ ð ˜(°À	ÑJØ˜.°&À)ÑLØ˜.°&À)ÑLØ˜.°&À)ÑLØ˜.°&À)ÑLØ˜.°&À)ÑLØ˜.°(ÀIÑNØ˜(°À	ÑJð	Ð ò ò	òò2ñ=€ó
ó7óó7õó0UóEóP1ñ4G€	õT{ó|[óLóõ-ó	bñ	'ð óó*	ñ€ö>[0/�D—K’K×6Ò6ô [0/÷Ba )× (Ó (á9€Ø€	Ù%€ÙCÐ ñ @Ð ð ˜(©'Ò2ØÐ0¹ÒDØ˜©Ò?Ø ±~ÒFØ˜±lÒCØ˜NÑ2DÒEØ˜Ñ.UÒVØ˜Ñ.RÒSØÐ,Ñ4GÒHØÐ/Ñ7KÒLØÐ*Ñ2CÒDØ˜h©kÒ:Ø .Ñ8RÒSØÐ2Ñ:TÒUð€
ó"4ð &0Ö0˜c��D“	Ò0€Ø3=Ö>¨C�3�t‘9˜c¡$™iÑ'Ò>€ó9ð Ð ØÐ óó:#óJHó"Zõvtójð  dfØ!õ}óFFócAñP *€Ø€óUó(ð& ‰zÒà‡K‚K×#Ò#¡Y°Ð$5°}ÓE×SÒSÕUð ùòiO )ùô. lùòp] 1ùÚ>s   ÂY)Ã2Y.×Y5×Y: