Ë
    «¼jzt  ã                   ó†  — U d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZ d dl	m
Z
 d dlmZ  e e
e«      j                  «       j                   dz  «      Zd„ Zd�dedefd	„Zdefd
„ZdŽd„Zd„ Zdefd„Zdedee   fd„Zdedee   fd„Zdedefd„Zdefd„Zd„ Zd„ Z d�dedede!fd„Z"d�dedededefd„Z#d�dedede$e   fd„Z%dededefd„Z&dededefd „Z'ded!efd"„Z(ded!edefd#„Z)defd$„Z*dededefd%„Z+defd&„Z,ded'edefd(„Z-defd)„Z.ded*edefd+„Z/defd,„Z0ded-edefd.„Z1defd/„Z2ded0edefd1„Z3defd2„Z4ded3e5defd4„Z6defd5„Z7ded6e5defd7„Z8defd8„Z9ded9e5defd:„Z:defd;„Z;ded<edefd=„Z<defd>„Z=ded?edefd@„Z>dAZ? ej€                  dB«      ZA ej€                  dC«      ZBdDdEdFdGdHœdIdJdKdLdHœdMdNdOdPdHœfZCdaDee!   eEdQ<   de!fdR„ZFdefdS„ZGdTe$defdU„ZHde!fdV„ZIde!fdW„ZJdeKfdX„ZLdefdY„ZMde!fdZ„ZNdefd[„ZOd*edefd\„ZPd]edefd^„ZQdefd_„ZRdefd`„ZSdefda„ZTd‘d]ee   de!fdb„ZUde5fdc„ZVddddeœdfedgee   dee   fdh„ZWd’ded*ediedjedef
dk„ZXdefdl„ZYdedmedefdn„ZZdefdo„Z[dedpedefdq„Z\de!e   fdr„Z]de!e   fds„Z^deddfdt„Z_dedefdu„Z`daaee$e      eEdv<   de$e   fdw„Zbde!e   fdx„Zcdefdy„Zddzedefd{„Zedzedefd|„Zfd}Zgdahee   eEd~<   defd„Zidefd€„Zjdee   fd�„Zkdefd‚„Zldefdƒ„Zmd„edefd…„Zndefd†„Zodefd‡„Zpd‘dTee   de!e   fdˆ„Zqdefd‰„Zrd�dedee   fdŠ„Zsdefd‹„ZtdefdŒ„Zuy)“é    N)ÚFlaskÚrequestÚjsonify)ÚPath)ÚOptionalzozpay.dbc                  ór  — t        dt        › �«       t        j                  t        «      } t        j                  | _        | j                  «       }|j                  d«       |j                  d«       |j                  «       D �ch c]  }|d   ’Œ	 }}d|vr|j                  d«       d|vr|j                  d«       d	|vr|j                  d
«       d|vr|j                  d«       d|vr|j                  d«       d|vr|j                  d«       d|vr|j                  d«       t        |«       n,|j                  d«       |j                  «       rt        |«       |j                  d«       |j                  d«       |j                  d«       |j                  d«       | j                  «        | S c c}w )Nz[db_api] opening DB: zö
		CREATE TABLE IF NOT EXISTS accounts (
			device TEXT PRIMARY KEY,
			ip TEXT,
			port INTEGER,
			number TEXT,
			password TEXT,
			name TEXT,
			balance REAL,
			income REAL,
			outcome REAL,
			cards TEXT,
			blocked INTEGER DEFAULT 0
		)
		zPRAGMA table_info(accounts)é   Úblockedz9ALTER TABLE accounts ADD COLUMN blocked INTEGER DEFAULT 0Ú
card_flagsz/ALTER TABLE accounts ADD COLUMN card_flags TEXTÚneeds_setupz=ALTER TABLE accounts ADD COLUMN needs_setup INTEGER DEFAULT 0Úfrom_publicz=ALTER TABLE accounts ADD COLUMN from_public INTEGER DEFAULT 0Ú	public_idz.ALTER TABLE accounts ADD COLUMN public_id TEXTÚcolorz*ALTER TABLE accounts ADD COLUMN color TEXTÚslotz6ALTER TABLE accounts ADD COLUMN slot INTEGER DEFAULT 1zfSELECT ip, slot FROM accounts WHERE COALESCE(from_public, 0) = 0 GROUP BY ip, slot HAVING COUNT(*) > 1zd
		CREATE TABLE IF NOT EXISTS banned_ips (
			ip TEXT PRIMARY KEY,
			banned_at REAL NOT NULL
		)
		zZ
		CREATE TABLE IF NOT EXISTS app_settings (
			key TEXT PRIMARY KEY,
			value TEXT
		)
		zl
		CREATE TABLE IF NOT EXISTS panel_workers (
			tg_id INTEGER PRIMARY KEY,
			added_at REAL NOT NULL
		)
		zÔ
		CREATE TABLE IF NOT EXISTS proxies (
			id INTEGER PRIMARY KEY AUTOINCREMENT,
			url TEXT NOT NULL UNIQUE,
			used INTEGER NOT NULL DEFAULT 0,
			added_at REAL NOT NULL,
			used_at REAL,
			used_by TEXT
		)
		)ÚprintÚDB_PATHÚsqlite3ÚconnectÚRowÚrow_factoryÚcursorÚexecuteÚfetchallÚ_backfill_device_slotsÚfetchoneÚcommit)ÚconnÚcurÚrowÚcolss       ú%/var/www/api.ozpay.ru/ozpay/db_api.pyÚget_connr"      s‘  € äÐ	œw˜iÐ(Ô)Ü�‰œÓ €Ü—K‘K€Ôà‡{�{ƒ}€Ø‡�ðôð" ‡�Ð*Ô+ØŸ<™<›>Ö*�CˆˆQ‹Ð*€Ð*Ø�TÑØ‡+�+ÐIÔJØ˜ÑØ‡+�+Ð?Ô@Ø˜ÑØ‡+�+ÐMÔNØ˜ÑØ‡+�+ÐMÔNØ�tÑØ‡+�+Ð>Ô?Ø�4ÑØ‡+�+Ð:Ô;Ø
�$ÑØ‡+�+ÐFÔGÜ˜Õà‡+�+Økôð 	‡\�\„^Ü˜#ÔØ‡�ðôð ‡�ðôð ‡�ðôð ‡�ð	ôð ‡�„Ø€ùòw 	+s   ÂF4ÚdefaultÚreturnc                 óZ   — 	 t        | «      }|dk\  r|S |S # t        t        f$ r |}Y Œw xY w)Nr	   )ÚintÚ	TypeErrorÚ
ValueError)Úvaluer#   r   s      r!   Ú_parse_slot_valuer*   g   s>   € ðÜ	ˆU‹€$ð ˜’	ˆÐ&˜wÐ&øô 
”JÐò Ø	‚$ðús   ‚ –*©*c                 ó@   — t        | xs i j                  d«      d«      S )Nr   r	   )r*   Úget©r   s    r!   Údevice_slot_valuer.   o   s   € Ü˜3š9 "Ÿ/™/¨&Ó1°1Ó5Ð5ó    c                 ó^  — | j                  d«       | j                  «       D �cg c]  }t        |«      ‘Œ }}i }|D ]O  }t        |j	                  d«      xs d«      j                  «       }|j                  |g «      j                  |«       ŒQ |j                  «       D �]‡  }|j                  d„ ¬«       i }|D ]M  }|j	                  d«      rŒt        |j	                  d«      d«      }|d	k\  sŒ6|j	                  |d«      d	z   ||<   ŒO t        «       }	i }
|D ]–  }|j	                  d
«      }t        |j	                  d«      d«      }|sŒ2|j	                  d«      r|d	k  rd	}|	j                  |«       ||
|<   Œa|d	k\  sŒg|j	                  |«      d	k(  sŒ|||	vsŒ�|	j                  |«       ||
|<   Œ˜ d	}|D ]C  }|j	                  d
«      }|r||
v rŒ||	v r
|d	z  }||	v rŒ
|	j                  |«       ||
|<   |d	z  }ŒE |
j                  «       D ]  \  }}| j                  d||f«       Œ �ŒŠ y c c}w )Nz8SELECT device, ip, port, slot, from_public FROM accountsÚipÚ c                 ó¶   — t        | j                  d«      xs d«      j                  «       rt        | d   «      ndt        | j                  d«      xs d«      fS )NÚportr2   i Êš;Údevice)Ústrr,   Úisdigitr&   r-   s    r!   ú<lambda>z(_backfill_device_slots.<locals>.<lambda>{   sJ   € Ü˜3Ÿ7™7 6›?Ò0¨bÓ1×9Ñ9Ô;„3€sˆ6�{ÔÀÜ€s‡w�wˆxÓÒ˜BÓð€ r/   ©Úkeyr   r   r   r	   r5   z-UPDATE accounts SET slot = ? WHERE device = ?)r   r   Údictr6   r,   ÚstripÚ
setdefaultÚappendÚvaluesÚsortr*   ÚsetÚaddÚitems)r   ÚrÚrowsÚby_ipr   r1   ÚgroupÚcountsr   ÚusedÚassignedr5   Úns                r!   r   r   s   sG  € Ø‡�ÐGÔHØŸ,™,›.Ö)�QŒˆa�Ð)€Ð)Ø€Øò '€SÜ
ˆ3�7‰7�4‹=Ò˜BÓ×%Ñ%Ó'€"Ø×Ñ�2�rÓ×!Ñ! #Õ&ð'ð �l‰l‹nó 'P€UØ‡*�*ñ €*ô ð €&Øò +€cØ	‡g�gˆmÔØÜ
˜CŸG™G F›O¨QÓ
/€4Ø
ˆaƒiØ—:‘:˜d AÓ&¨Ñ*€Fˆ4‚Lð+ô “5€$Ø€(Øò €cØ�G‰G�HÓ€6Ü
˜CŸG™G F›O¨QÓ
/€4Ù
ØØ	‡g�gˆmÔØˆa‚xØ€TØ‡H�HˆT„NØ€HˆVÑØØ
ˆaƒi�F—J‘J˜tÓ$¨Ó)¨d¸$Ò.>Ø‡H�HˆT„NØ€HˆVÒðð €!Øò 
€cØ�G‰G�HÓ€6Ù
�F˜hÑ&ØØ	
ˆd‰Øˆ�F€Að 
ˆdŠà‡8�8ˆA„;Ø€8ˆFÑØˆ�6�1ð
ð —n‘nÓ&ò P�l€fˆdØ‡;�;Ð>ÀÀvÀÕOòPñM'Pùò 	*s   ¤H*c                  óš   — t        «       } | j                  «       }|j                  d«       | j                  «        | j	                  «        y )NzØ
		CREATE TABLE IF NOT EXISTS accounts (
			device TEXT PRIMARY KEY,
			ip TEXT,
			port INTEGER,
			number TEXT,
			password TEXT,
			name TEXT,
			balance REAL,
			income REAL,
			outcome REAL,
			cards TEXT
		)
		)r"   r   r   r   Úclose)r   r   s     r!   Úinit_dbrN   ¤   s9   € Ü‹
€Ø‡{�{ƒ}€Ø‡�ðôð  ‡�„Ø‡�…r/   r5   c                 ó  — t        «        t        «       }|j                  «       }|j                  d| |j	                  d«      |j	                  d«      |j	                  d«      |j	                  d«      |j	                  d«      |j	                  d«      |j	                  d«      |j	                  d	«      |j	                  d
«      t        |j	                  d«      d«      f«       |j                  «        |j                  «        y)z=Create a device row. Pass any of the columns as keyword args.z…INSERT INTO accounts (device, ip, port, number, password, name, balance, income, outcome, cards, slot) VALUES (?,?,?,?,?,?,?,?,?,?,?)r1   r4   ÚnumberÚpasswordÚnameÚbalanceÚincomeÚoutcomeÚcardsr   r	   N)rN   r"   r   r   r,   r*   r   rM   )r5   Úfieldsr   r   s       r!   Úcreate_devicerX   »   sÆ   € ä„Ü‹
€Ø‡{�{ƒ}€Ø‡�ð Jà	Ø	‡:�:ˆdÓØ	‡:�:ˆfÓØ	‡:�:ˆhÓØ	‡:�:ˆjÓØ	‡:�:ˆfÓØ	‡:�:ˆiÓØ	‡:�:ˆhÓØ	‡:�:ˆiÓØ	‡:�:ˆgÓÜ�V—Z‘Z Ó'¨Ó+ðôð  ‡�„Ø‡�…r/   r1   c                 ó
  — | r|dv ry 	 t        |«      }t        «       }|j	                  «       }|j                  d| |f«       |j                  «       }|j                  «        |sy t        |«      S # t        t        f$ r Y y w xY w)N©Nr2   z0SELECT * FROM accounts WHERE ip = ? AND port = ?)	r&   r'   r(   r"   r   r   r   rM   r;   )r1   r4   r   r   r   s        r!   Úfind_device_by_ip_portr[   Ô   s�   € Ù
ˆd�jÑ Ø	ðÜ	ˆT‹€$ô 	‹
€Ø‡{�{ƒ}€Ø‡�Ð?À"ÀdÀÔLØ
‡|�|ƒ~€Ø‡�„ÙØ	ÜˆS‹	Ðøô 
”JÐò Ù	ðús   ‰A0 Á0BÂBr   c                 óø   — t        | xs d«      j                  «       } | sy t        «       }|j                  «       }|j	                  d| f«       |j                  «       }|j                  «        |sy t        |«      S )Nr2   z*SELECT * FROM accounts WHERE public_id = ?)r6   r<   r"   r   r   r   rM   r;   )r   r   r   r   s       r!   Úfind_device_by_public_idr]   å   sf   € Ü�’˜bÓ!×'Ñ'Ó)€ÙØ	Ü‹
€Ø‡{�{ƒ}€Ø‡�Ð9¸I¸<ÔHØ
‡|�|ƒ~€Ø‡�„ÙØ	ÜˆS‹	Ðr/   c                 ó¾   — t        «       }|j                  «       }|j                  d| f«       |j                  «        |j                  }|j                  «        |dkD  S )Nz%DELETE FROM accounts WHERE device = ?r   ©r"   r   r   r   ÚrowcountrM   )r5   r   r   Úchangeds       r!   Údelete_devicerb   ó   sJ   € Ü‹
€Ø‡{�{ƒ}€Ø‡�Ð4°v°iÔ@Ø‡�„Ø�<‰<€Ø‡�„Ø�!‰Ðr/   c                 ó¸   — t        «       }|j                  «       }|j                  d| f«       |j                  «       }|j	                  «        |sy t        |«      S )Nz'SELECT * FROM accounts WHERE device = ?)r"   r   r   r   rM   r;   )r5   r   r   r   s       r!   Ú
get_devicerd   ý   sI   € Ü‹
€Ø‡{�{ƒ}€Ø‡�Ð6¸¸	ÔBØ
‡|�|ƒ~€Ø‡�„ÙØ	ÜˆS‹	Ðr/   c                 óâ   — t        | j                  d«      xs d«      }t        j                  d|«      D �cg c]-  }|j	                  «       rt        |«      n|j                  «       ‘Œ/ c}S c c}w )Nr5   r2   z(\d+))r6   r,   ÚreÚsplitr7   r&   Úlower)r   r5   Úparts      r!   Ú_device_sort_keyrj     sQ   € Ü
ˆc�g‰g�hÓÒ% 2Ó
&€ÜCEÇ8Á8ÈHÐV\ÓC]Ö^¸4�d—l‘l”nŒˆTŒ¨$¯*©*«,Ñ	6Ò^Ð^ùÒ^s   ·2A,c                  ó  — t        «       } | j                  «       }|j                  d«       |j                  «       }| j	                  «        |D �cg c]  }t        |«      ‘Œ }}|j                  t        ¬«       |S c c}w )NzSELECT * FROM accountsr9   )r"   r   r   r   rM   r;   r@   rj   )r   r   rE   rD   rC   s        r!   Úlist_devicesrl     se   € Ü‹
€Ø‡{�{ƒ}€Ø‡�Ð%Ô&Ø�‰‹€Ø‡�„ØÖ	 �aŒ$ˆq�'Ð	 €Ð	 Ø‡�Ô €Ô!Ø€ùò 
!s   ÁA<Úexcludec                 óf  — t        | xs d«      j                  «       }t        |xs d«      j                  «       }g }t        «       D ]g  }|r"t        |j                  d«      xs d«      |k(  rŒ't        |j                  d«      xs d«      j                  «       |k7  rŒW|j	                  |«       Œi |S )Nr2   r5   r1   )r6   r<   rl   r,   r>   )r1   rm   ÚwantedÚskiprC   r   s         r!   Úlist_devices_by_iprq     sž   € Ü
ˆbŠh�B‹-×
Ñ
Ó
€ÜˆGŠM�rÓ× Ñ Ó"€Ø	€Ü‹Nò €SÙ	Œc�#—'‘'˜(Ó#Ò) rÓ*¨dÒ2ØÜˆ�‰�‹Ò	˜"Ó×#Ñ#Ó%¨Ò/ØØ‡,�,ˆsÕðð 	€r/   Úmin_slotc                 óÆ   — t        | |¬«      D �ch c]  }t        |«      ’Œ }}	 t        |«      }|dk  rd}||v r
|dz  }||v rŒ
|S c c}w # t        t        f$ r d}Y Œ/w xY w)N©rm   r	   )rq   r.   r&   r'   r(   )r1   rm   rr   r   rI   rK   s         r!   Únext_device_slotru   %  s}   € Ü+=¸bÈ'Ô+RÖS CÔ	˜3Õ	ÐS€ÐSðÜ	ˆ(ƒm€!ð ˆ‚EØ€!ØˆD�yØ€q�&€!ð 	ˆD‚yà	€ùò 	Tøô 
”JÐò Ø‚!ðús   �A¥A ÁA ÁA c                 óÞ   — t        «       }t        | |¬«      D ]=  }	 t        |j                  d«      «      }d|cxk  rdk  sŒ*n Œ-|j                  |«       Œ? |S # t        t
        f$ r Y ŒSw xY w)Nrt   r4   r	   iÿÿ  )rA   rq   r&   r,   r'   r(   rB   )r1   rm   rI   r   r4   s        r!   Úused_device_portsrw   2  sp   € Ü“%€Ü˜r¨7Ô3ò €SðÜ
ˆc�g‰g�f‹oÓ
€4ð ˆ$Ô�%ÖØ‡8�8ˆD…>ðð 	€øô	 ”ZÐ	 ò Ùðús   œAÁA,Á+A,Údatac                 óž  — g d¢}g }g }|j                  «       D ]/  \  }}||v sŒ|j                  |› d�«       |j                  |«       Œ1 |sy|j                  | «       t        «       }|j                  «       }|j	                  ddj                  |«      › d�|«       |j                  «        |j                  }	|j                  «        |	dkD  S )z=Generic update by device. `data` keys should be column names.)r1   r4   rP   rQ   rR   rS   rT   rU   rV   r
   r   r   r   r   r   r   z = ?FúUPDATE accounts SET z, z WHERE device = ?r   )	rC   r>   r"   r   r   Újoinr   r`   rM   )
r5   rx   ÚallowedÚ	set_partsÚparamsÚkÚvr   r   ra   s
             r!   Úupdate_devicer�   >  sÂ   € ò v€Ø€Ø
€Ø�Z‰Z‹\ò �T€QˆØˆ'‚\Ø×Ñ�q�c˜�JÔØ	‡=�=�Õðñ 	Ø	Ø‡�ˆvÔÜ‹
€Ø‡{�{ƒ}€Ø‡�Ð# D§I¡I¨iÓ$8Ð#9Ð9JÐKÈVÔTØ‡�„Ø�<‰<€Ø‡�„Ø�!‰Ðr/   ÚoldÚnewc                 óx  — | xs dj                  «       } |xs dj                  «       }| r|r| |k(  ryt        «       }|j                  «       }	 |j                  d|| f«       |j	                  «        |j
                  }|j                  «        |dkD  S # t        j                  $ r |j                  «        Y yw xY w)Nr2   Fz/UPDATE accounts SET device = ? WHERE device = ?r   )	r<   r"   r   r   r   r`   r   ÚIntegrityErrorrM   )r‚   rƒ   r   r   ra   s        r!   Úrename_devicer†   S  s¨   € ØŠ	ˆr×ÑÓ€ØŠ	ˆr×ÑÓ€Ù‘3˜# š*Ø	Ü‹
€Ø‡{�{ƒ}€ðØ‡+�+Ð?À#ÀsÀÔLØ‡+�+„-Ø�L‰L€'ð ‡�„Ø�!‰Ðøô	 	×Ñò Ø‡*�*„,Ù	ðús   Á0B Â#B9Â8B9Úfieldc                 ó´   — t        «       }|j                  «       }|j                  d|› d�| f«       |j                  «       }|j	                  «        |sy |d   S )NzSELECT z FROM accounts WHERE device = ?r   )r"   r   r   r   rM   )r5   r‡   r   r   r   s        r!   Ú
_get_fieldr‰   h  sQ   € Ü‹
€Ø‡{�{ƒ}€Ø‡�ˆw�u�gÐ<Ð=À¸yÔIØ
‡|�|ƒ~€Ø‡�„ÙØ	ØˆA‰€r/   c                 óÈ   — t        «       }|j                  «       }|j                  d|› d�|| f«       |j                  «        |j                  }|j                  «        |dkD  S )Nrz   z = ? WHERE device = ?r   r_   )r5   r‡   r)   r   r   ra   s         r!   Ú_update_fieldr‹   s  sV   € Ü‹
€Ø‡{�{ƒ}€Ø‡�Ð# E 7Ð*?Ð@À5È&À/ÔRØ‡�„Ø�<‰<€Ø‡�„Ø�!‰Ðr/   c                 ó   — t        | d«      S ©Nr1   ©r‰   ©r5   s    r!   Úget_ipr�   ~  s   € Ü�6˜4Ó Ð r/   c                 ó   — t        | d|«      S r�   ©r‹   )r5   r1   s     r!   Ú	update_ipr“   ‚  s   € Ü�f˜d BÓ'Ð'r/   c                 ó   — t        | d«      S ©Nr4   rŽ   r�   s    r!   Úget_portr–   ‡  ó   € Ü�6˜6Ó"Ð"r/   r4   c                 ó   — t        | d|«      S r•   r’   )r5   r4   s     r!   Úupdate_portr™   ‹  ó   € Ü�f˜f dÓ+Ð+r/   c                 ó   — t        | d«      S ©NrP   rŽ   r�   s    r!   Ú
get_numberr�   �  ó   € Ü�6˜8Ó$Ð$r/   rP   c                 ó   — t        | d|«      S rœ   r’   )r5   rP   s     r!   Úupdate_numberr    ”  ó   € Ü�f˜h¨Ó/Ð/r/   c                 ó   — t        | «      S ©N)r�   r�   s    r!   Ú	get_phoner¤   ˜  s   € Ü�6ÓÐr/   Úphonec                 ó   — t        | |«      S r£   )r    )r5   r¥   s     r!   Úupdate_phoner§   œ  s   € Ü�f˜eÓ$Ð$r/   c                 ó   — t        | d«      S ©NrR   rŽ   r�   s    r!   Úget_namerª   ¡  r—   r/   rR   c                 ó   — t        | d|«      S r©   r’   )r5   rR   s     r!   Úupdate_namer¬   ¥  rš   r/   c                 ó   — t        | d«      S ©NrS   rŽ   r�   s    r!   Úget_balancer¯   ª  ó   € Ü�6˜9Ó%Ð%r/   rS   c                 ó   — t        | d|«      S r®   r’   )r5   rS   s     r!   Úupdate_balancer²   ®  ó   € Ü�f˜i¨Ó1Ð1r/   c                 ó   — t        | d«      S ©NrT   rŽ   r�   s    r!   Ú
get_incomer¶   ³  rž   r/   rT   c                 ó   — t        | d|«      S rµ   r’   )r5   rT   s     r!   Úupdate_incomer¸   ·  r¡   r/   c                 ó   — t        | d«      S ©NrU   rŽ   r�   s    r!   Úget_outcomer»   ¼  r°   r/   rU   c                 ó   — t        | d|«      S rº   r’   )r5   rU   s     r!   Úupdate_outcomer½   À  r³   r/   c                 ó   — t        | d«      S ©NrV   rŽ   r�   s    r!   Ú	get_cardsrÀ   Å  s   € Ü�6˜7Ó#Ð#r/   rV   c                 ó   — t        | d|«      S r¿   r’   )r5   rV   s     r!   Úupdate_cardsrÂ   É  s   € Ü�f˜g uÓ-Ð-r/   c                 ó   — t        | d«      S ©Nr   rŽ   r�   s    r!   Úget_card_flagsrÅ   Í  s   € Ü�6˜<Ó(Ð(r/   r   c                 ó   — t        | d|«      S rÄ   r’   )r5   r   s     r!   Úupdate_card_flagsrÇ   Ñ  s   € Ü�f˜l¨JÓ7Ð7r/   Úcard_flag_defsz^[a-z][a-z0-9_]{0,23}$z^#[0-9a-f]{6}$Úbeelineu   Ð‘Ð¸Ð»Ð°Ð¹Ð½z#facc15u   Ð±©ÚidrR   r   ÚaliasÚyapayu   Ð¯Ð¿ÐµÐ¹z#ef4444u   Ñ�Úmtsu   ÐœÐ¢Ð¡z#a855f7u   Ð¼Ú_flag_defs_cachec                  óF   — t         D � cg c]  } t        | «      ‘Œ c} S c c} w r£   )Ú_DEFAULT_CARD_FLAGSr;   ©Úitems    r!   Údefault_card_flag_defsrÔ   à  s   € Ü 3Ö4˜Œˆd�Ò4Ð4ùÒ4s   ‰c                 óü   — t        | xs d«      j                  «       }|syt        |«      }t        |«      dk7  s&|d   j	                  «       s|d   j                  «       st        d«      ‚|d   j                  «       S )Nr2   r	   r   u/   Ð‘ÑƒÐºÐ²Ð° Ñ„Ð»Ð°Ð³Ð° â€” Ð¾Ð´Ð¸Ð½ Ñ�Ð¸Ð¼Ð²Ð¾Ð»)r6   r<   ÚlistÚlenÚisspaceÚisalnumr(   Úcasefold)r)   ÚtextÚcharss      r!   Ú_normalize_flag_aliasrÝ   ä  sp   € ÜˆEŠK�RÓ×ÑÓ €ÙØ	Ü	ˆd‹€ÜˆƒJ�!‚O�u˜Q‘x×'Ñ'Ô)°°q±×1AÑ1AÔ1CÜÐDÓEÐEØˆa‰×ÑÓÐr/   rI   c                 óB   — 	 dt        j                  d«      z   }|| vr|S Œ)NÚfé   )ÚsecretsÚ	token_hex)rI   Ú	candidates     r!   Ú_new_flag_idrä   î  s-   € ØØ”G×%Ñ% aÓ(Ñ(€)Ø�dÑØ
Ðð r/   c                 ó€  — t        | t        «      r| }n	 | rt        j                  | «      nd }t        |t        «      s
t        «       S g }t        «       }t        «       }t        «       }|D �]˜  }t        |t        «      sŒdj                  t        |j                  d«      xs d«      j                  «       «      d d }t        |j                  d«      xs d«      j                  «       j                  «       }|rt         j#                  |«      sŒ¥|j%                  «       }	|	|v rŒº	 t'        |j                  d«      «      }
|
r|
|v rd}
t        |j                  d«      xs d«      j                  «       j                  «       }t(        j#                  |«      r||vr|n
t+        |«      }|j-                  |«       |j-                  |	«       |
r|j-                  |
«       |j/                  ||||
dœ«       t1        |«      dk\  s�Œ˜ |S  |S # t        t
        t        j                  f$ r d }Y �Œýw xY w# t
        $ r d}
Y Œýw xY w)	Nú rR   r2   é   r   rÌ   rË   rÊ   )Ú
isinstancerÖ   ÚjsonÚloadsr'   r(   ÚJSONDecodeErrorrÔ   rA   r;   r{   r6   r,   rg   r<   rh   Ú_HEX_COLOR_REÚ	fullmatchrÚ   rÝ   Ú_FLAG_ID_RErä   rB   r>   r×   )ÚrawÚpayloadÚflagsÚused_idsÚ
used_namesÚused_aliasesrÓ   rR   r   Úname_keyrÌ   Úraw_idÚflag_ids                r!   Ú_parse_card_flag_defsrø   õ  sü  € Üˆs”DÔØ�'ðÙ #ŒT�Z‰Z˜Œ_¨€7ô 	�7œDÔ!Ü	Ó	!Ð!Ø	€Ü‹E€Ü‹e€Ü“€Øó 	€TÜ	�Dœ$Ô	ØØ	�‰”#�d—h‘h˜vÓ&Ò,¨"Ó-×3Ñ3Ó5Ó	6°s¸Ð	;€$Ü
ˆd�h‰h�wÓÒ% 2Ó
&×
,Ñ
,Ó
.×
4Ñ
4Ó
6€%Ù	”]×,Ñ,¨UÔ3ØØ�]‰]‹_€(Ø�ÑØðÜ  §¡¨'Ó!2Ó3€5ñ ˆu˜Ñ$Ø€5Üˆt�x‰x˜‹~Ò# Ó$×*Ñ*Ó,×2Ñ2Ó4€&Ü!×+Ñ+¨FÔ3¸ÀhÑ8N‰FÔT`ÐaiÓTj€'Ø
‡,�,ˆwÔØ‡.�.�ÔÙ
Ø×Ñ�EÔØ‡,�,�g t°eÀeÑLÔMÜˆƒZ�2ÔØØ€ð3	ð2 	€øôC ”Z¤×!5Ñ!5Ð	6ò Øƒ7ðûô( 
ò Ø‚5ðús#   •H Ä%H/È H,È+H,È/H=È<H=c                  ó€  — t         �,t        j                  t        j                  t         «      «      S t	        «       } | j                  «       }|j                  dt        f«       |j                  «       }| j                  «        t        |r|d   nd «      }|a t        j                  t        j                  |«      «      S ©Nz,SELECT value FROM app_settings WHERE key = ?r   )rÏ   ré   rê   Údumpsr"   r   r   ÚCARD_FLAG_SETTINGS_KEYr   rM   rø   ©r   r   r   rx   s       r!   Úget_card_flag_defsrþ     sŠ   € äÐ Ü	�‰”D—J‘JÔ/Ó0Ó	1Ð1Ü‹
€Ø‡{�{ƒ}€Ø‡�Ð;Ô>TÐ=VÔWØ
‡|�|ƒ~€Ø‡�„Ü©˜c !šf°Ó6€ØÐÜ�
‰
”4—:‘:˜dÓ#Ó$Ð$r/   c                  ó6   — t        d„ t        «       D «       «      S )Nc              3   ó&   K  — | ]	  }|d    –— Œ y­w)rË   N© )Ú.0rÓ   s     r!   ú	<genexpr>z!card_flag_keys.<locals>.<genexpr>.  s   è ø€ Ò:˜Tˆd�4�jÑ:ùs   ‚)Útuplerþ   r  r/   r!   Úcard_flag_keysr  -  s   € ÜÑ:Ô%7Ó%9Ô:Ó:Ð:r/   c                  óh   — i } t        «       D ]"  }|j                  d«      xs d}|sŒ|d   | |<   Œ$ | S )NrÌ   r2   rË   )rþ   r,   )ÚmappingrÓ   rÌ   s      r!   Úsystem_by_aliasr  1  sC   € Ø€ÜÓ!ò €TØ
�(‰(�7Ó
Ò
!˜r€%Ú
Ø˜‘J€7ˆ5‚>ðð 	€r/   c                 ót  — t        | t        «      st        d«      ‚t        | «      dkD  rt        d«      ‚g }t	        «       }t	        «       }t	        «       }| D �]Î  }t        |t
        «      st        d«      ‚dj                  t        |j                  d«      xs d«      j                  «       «      }|st        d«      ‚t        |«      dkD  rt        d	«      ‚|j                  «       }||v rt        d
«      ‚t        |j                  d«      xs d«      j                  «       j                  «       }t        j                  |«      st        d«      ‚t        |j                  d«      «      }	|	r|	|v rt        d«      ‚t        |j                  d«      xs d«      j                  «       j                  «       }
t         j                  |
«      r|
|vr|
n
t#        |«      }|j%                  |«       |j%                  |«       |	r|j%                  |	«       |j'                  ||||	dœ«       �ŒÑ t)        «       }|j+                  «       }|j-                  dt.        t1        j2                  |d¬«      f«       |j5                  «        |j7                  «        |at1        j:                  t1        j2                  |«      «      S )Nu2   Ð�ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ñ‹Ð¹ Ñ�Ð¿Ð¸Ñ�Ð¾Ðº Ñ„Ð»Ð°Ð³Ð¾Ð²rç   u&   Ð¡Ð»Ð¸ÑˆÐºÐ¾Ð¼ Ð¼Ð½Ð¾Ð³Ð¾ Ñ„Ð»Ð°Ð³Ð¾Ð²u!   Ð�ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ñ‹Ð¹ Ñ„Ð»Ð°Ð³ræ   rR   r2   u*   Ð£ÐºÐ°Ð¶Ð¸Ñ‚Ðµ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ Ñ„Ð»Ð°Ð³Ð°u9   Ð�Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ Ñ„Ð»Ð°Ð³Ð° Ñ�Ð»Ð¸ÑˆÐºÐ¾Ð¼ Ð´Ð»Ð¸Ð½Ð½Ð¾Ðµu?   Ð�Ð°Ð·Ð²Ð°Ð½Ð¸Ñ� Ñ„Ð»Ð°Ð³Ð¾Ð² Ð´Ð¾Ð»Ð¶Ð½Ñ‹ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°Ñ‚ÑŒÑ�Ñ�r   u"   Ð£ÐºÐ°Ð¶Ð¸Ñ‚Ðµ Ñ†Ð²ÐµÑ‚ Ñ„Ð»Ð°Ð³Ð°rÌ   u9   Ð‘ÑƒÐºÐ²Ñ‹ Ñ„Ð»Ð°Ð³Ð¾Ð² Ð´Ð¾Ð»Ð¶Ð½Ñ‹ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°Ñ‚ÑŒÑ�Ñ�rË   rÊ   úiINSERT INTO app_settings (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.valueF©Úensure_ascii)rè   rÖ   r(   r×   rA   r;   r{   r6   r,   rg   rÚ   r<   rh   rì   rí   rÝ   rî   rä   rB   r>   r"   r   r   rü   ré   rû   r   rM   rÏ   rê   )rC   rñ   rò   ró   rô   rÓ   rR   rõ   r   rÌ   rö   r÷   r   r   s                 r!   Úsave_card_flag_defsr  :  s=  € ä�5œ$ÔÜÐGÓHÐHÜˆƒJ�‚OÜÐ;Ó<Ð<Ø	€Ü‹E€Ü‹e€Ü“€Øó N€TÜ	�Dœ$Ô	Ü	Ð7Ó	8Ð8Ø	�‰”#�d—h‘h˜vÓ&Ò,¨"Ó-×3Ñ3Ó5Ó	6€$Ù	Ü	Ð@Ó	AÐAÜˆƒY�‚^Ü	ÐOÓ	PÐPØ�]‰]‹_€(Ø�ÑÜ	ÐUÓ	VÐVÜ
ˆd�h‰h�wÓÒ% 2Ó
&×
,Ñ
,Ó
.×
4Ñ
4Ó
6€%Ü	×	 Ñ	  Ô	'Ü	Ð8Ó	9Ð9Ü
 §¡¨Ó 1Ó
2€%Ù
ˆu˜Ñ$Ü	ÐOÓ	PÐPÜˆt�x‰x˜‹~Ò# Ó$×*Ñ*Ó,×2Ñ2Ó4€&Ü!×+Ñ+¨FÔ3¸ÀhÑ8N‰FÔT`ÐaiÓTj€'Ø
‡,�,ˆwÔØ‡.�.�ÔÙ
Ø×Ñ�EÔØ‡,�,�g t°eÀeÑLÖMð/Nô0 	‹
€Ø‡{�{ƒ}€Ø‡�ØmÜœ4Ÿ:™: e¸%Ô@ÐAôð ‡�„Ø‡�„ØÐÜ�
‰
”4—:‘:˜eÓ$Ó%Ð%r/   c                 óJ   — t        j                  ddt        | xs d«      «      S )Nz\Dr2   )rf   Úsubr6   ©r)   s    r!   Ú_card_digitsr  h  s   € Ü
�‰ˆu�bœ#˜ešk rÓ*Ó+Ð+r/   c           	      ó†   ‡— t        | «      Š‰s| xs dS dj                  ˆfd„t        dt        ‰«      d«      D «       «      S )Nr2   ræ   c              3   ó.   •K  — | ]  }‰||d z    –— Œ y­w)rà   Nr  )r  ÚiÚdigitss     €r!   r  z&_format_card_number.<locals>.<genexpr>p  s   øè ø€ ÒC Q�˜˜!˜a™%”ÑCùs   ƒr   rà   )r  r{   Úranger×   )rP   r  s    @r!   Ú_format_card_numberr  l  s<   ø€ Ü
�vÓ
€ÙØ	Š�2ÐØ�‰ÓC¬%°´3°v³;ÀÓ*BÔCÓCÐCr/   rï   c                 ó6  — | xs dj                  «       }|syt        j                  d|«      rt        |«      dkD  r|d d S |S t	        |«      }t        |«      dk(  r>|d d j                  «       rt        |d d «      nd}d|cxk  rdk  rn y|d d › d	|dd  › �S y)
Nr2   z(0[1-9]|1[0-2])/\d{2}(?:\d{2})?é   rà   é   r   r	   é   ú/)r<   rf   rí   r×   r  r7   r&   )rï   rÛ   r  Úmonths       r!   Ú_format_expiryr  s  s®   € Ø	Š�×ÑÓ€ÙØ	Ü‡L�LÐ3°TÔ:Ü˜“Y ’]ˆˆbˆqˆÐ,¨Ð,Ü
�tÓ
€ÜˆƒK�1ÒØ# B Q˜Z×/Ñ/Ô1Œ#ˆf�R�aˆjŒ/°q€%Øˆ%Ô�2Ôà
ð �B�QˆZˆL˜˜&  ˜*˜Ð
&Ð&Ø
r/   c                  ó>   — t        «       D � ci c]  } | d“Œ c} S c c} w ©NF)r  r9   s    r!   Ú_empty_flagsr!  �  s   € Ü-Ó/Ö0˜ˆˆe‰Ò0Ð0ùÒ0s   �
c           	      ó¢   — t        | t        «      s
t        «       S t        «       D �ci c]  }|t	        | j                  |«      «      “Œ c}S c c}w r£   )rè   r;   r!  r  Úboolr,   )r)   r:   s     r!   Ú_flags_from_valuer$  …  s=   € Ü�5œ$ÔÜ	‹ÐÜ.<Ó.>Ö? sˆŒd�5—9‘9˜S“>Ó"Ñ	"Ò?Ð?ùÒ?s   §"Ac                 ó<  — | si S t        | t        «      r| }n	 t        j                  | «      }t        |t        «      si S i }|j                  «       D ]!  \  }}t        |«      }|sŒt        |«      ||<   Œ# |S # t        t
        t        j                  f$ r i cY S w xY wr£   )
rè   r;   ré   rê   r'   r(   rë   rC   r  r$  )rï   rx   rñ   r:   r)   r  s         r!   Úparse_card_flagsr&  ‹  s¢   € ÙØ	€)Üˆs”DÔØ	�$ðÜ
�*‰*�S‹/€4ô 	�4œÔØ	€)Ø	€Ø—:‘:“<ò +�Z€Sˆ%Ü˜Ó€&Ù	ØÜ# EÓ*€%ˆ‚-ð	+ð
 	€øô ”Z¤×!5Ñ!5Ð	6ò Ø
‚9ðús   ™A8 Á8 BÂBc                 ó  — t        |«      }| sg S g }t        | «      j                  d«      D ]Õ  }|j                  «       }|sŒ|j                  d«      }|r|d   nd}t	        |«      dkD  r|d   nd}t	        |«      dkD  r|d   nd}t        |«      }	t        |«      }
|	r|
|	dd k(  rd}nt        |«      }|j                  |	«      xs
 t        «       }t        |«      ||d	œ}|j                  |«       |j                  |«       Œ× |S )
ui   cards Ð² Ð‘Ð”: number/expiry/cvv, ÐºÐ°Ñ€Ñ‚Ñ‹ Ñ‡ÐµÑ€ÐµÐ· ':'. Ð¡Ñ‚Ð°Ñ€Ñ‹Ð¹ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚: number/last4/cvv.ú:r  r   r2   r	   r  éüÿÿÿN)rP   ÚexpiryÚcvv)r&  r6   rg   r<   r×   r  r  r,   r!  r  Úupdater>   )rï   Ú	flags_rawÚ	flags_maprV   ÚchunkÚpartsrP   Úmiddler+  Únumber_digitsÚmiddle_digitsr*  rñ   Úcards                 r!   Úparse_cardsr5     s
  € ä˜iÓ(€ÙØ	€)Ø	€Ü�#‹h�n‰n˜SÓ!ò €UØ
�+‰+‹-€%Ù	ØØ
�+‰+�cÓ
€%Ùˆ5�Š8 "€&Ü˜5“z A’~ˆ5�Š8¨2€&Ü˜“J ’NˆˆaŠ¨€#Ü˜vÓ&€-Ü˜vÓ&€-Ù�}¨°b°cÐ(:Ò:Ø�6ä˜6Ó"€6Ø
�-‰-˜Ó
&Ò
8¬,«.€%ä  Ó(ØØ
ñ
€$ð
 ‡+�+ˆeÔØ‡,�,ˆtÕð+ð, 	€r/   c                 ó6  — | �| dk(  ryt        | t        t        f«      rt        | «      S t        | «      j	                  dd«      j	                  dd«      j	                  dd«      }t        j                  dd|«      }	 |rt        |«      S dS # t        $ r Y yw xY w)Nr2   ç        õ   Â ræ   ú,ú.z[^\d.])rè   r&   Úfloatr6   Úreplacerf   r  r(   )r)   rÛ   s     r!   Ú_to_balancer=  ¿  s’   € Ø	€M�U˜b’[Ø	Üˆu”sœE�lÔ#Ü	ˆu‹ÐÜˆE‹
×Ñ˜6 3Ó'×/Ñ/°°RÓ8×@Ñ@ÀÀcÓJ€Ü
�‰ˆy˜"˜dÓ#€ðÙŒˆt‹Ð% #Ð%øÜò Ù	ðús   Á=B Â
B Â	BÂBT)ÚsmallerÚsystemr>  r?  c                 óª  — |�|t        «       vryg }t        «       D �]  }|j                  d«      rŒt        |j                  d«      «      }|j                  d«      xs d}t	        |j                  d«      |j                  d«      «      D ]§  }t        |j                  d«      «      }|sŒ |r|j                  |«      rŒ4|j                  ||j                  d	«      xs dj                  «       ||j                  d«      xs d||j                  d
«      xs d|j                  d«      xs d|dœ«       Œ© �Œ |sy|j                  d„ |  ¬«       |d   S )u†   ÐšÐ°Ñ€Ñ‚Ð° Ñ�Ð¾ Ð²Ñ�ÐµÐ¹ Ð¿Ð°Ð½ÐµÐ»Ð¸: min/max Ð±Ð°Ð»Ð°Ð½Ñ� Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð°, Ð±ÐµÐ· Ð³Ð°Ð»Ð¾Ñ‡ÐºÐ¸ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ Ñ�Ð¸Ñ�Ñ‚ÐµÐ¼Ñ‹.Nr
   rS   r5   r2   rV   r   rP   rR   r*  r+  )r5   rR   rS   rP   r2  r*  r+  r?  c                 ó   — | d   | d   | d   fS )NrS   r5   r2  r  rÒ   s    r!   r8   zpick_card.<locals>.<lambda>é  s   € �D˜‘O T¨(¡^°T¸/Ñ5JÐK€ r/   )r:   Úreverser   )	r  rl   r,   r=  r5  r  r>   r<   r@   )r>  r?  Ú
candidatesr   rS   Ú	device_idr4  r2  s           r!   Ú	pick_cardrE  Ì  sI  € à
Ð˜6¬Ó)9Ñ9Ø	Ø€Ü‹Nó €SØ‡W�WˆYÔØÜ˜Ÿ™ 	Ó*Ó+€'Ø�g‰g�hÓÒ% 2€)Ü˜#Ÿ'™' 'Ó*¨C¯G©G°LÓ,AÓBò €dÜ §¡¨Ó 2Ó3€=Ù
ØÙ�—‘˜&Ô!ØØ×ÑØØ�W‰W�V‹_Ò" ×)Ñ)Ó+ØØ�h‰h�xÓ Ò& BØ"Ø�h‰h�xÓ Ò& BØ�8‰8�E‹?Ò ˜bØñ	õ 	òðñ* 	Ø	Ø‡�ÙKØˆ+ð ô ð 	�1‰Ðr/   Úflagr)   c           	      óæ  ‡	— |t        «       vryt        | «      }|syt        |j                  d«      «      }t	        |«      }|sy|j                  |«      xs
 t        «       Š	t        |«      ‰	|<   t        «       }t        ˆ	fd„|D «       «      r-|D �ci c]  }|t        ‰	j                  |«      «      “Œ c}||<   n|j                  |d «       t        | t        j                  |d¬«      «      S c c}w )NFr   c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr£   )r,   )r  r:   Úcurrents     €r!   r  z set_card_flag.<locals>.<genexpr>ü  s   øè ø€ Ò)˜Sˆ�‰�C×Ñ)ùs   ƒr  )r  rd   r&  r,   r  r!  r#  ÚanyÚpoprÇ   ré   rû   )
r5   rP   rF  r)   r   rñ   r  Úkeysr:   rI  s
            @r!   Úset_card_flagrM  ï  sÏ   ø€ Ø”Ó Ñ Ø	Ü�&Ó€ÙØ	Ü	˜#Ÿ'™' ,Ó/Ó	0€Ü
�vÓ
€ÙØ	Ø�9‰9�VÓÒ.¤£€Ü�e“€ˆ�ÜÓ€ÜÓ) DÔ)Ô)Ø:>Ö?°3�3œ˜WŸ[™[¨Ó-Ó.Ñ.Ò?€%ˆ‚-à‡)�)ˆF�DÔÜ˜&¤$§*¡*¨UÀÔ"GÓHÐHùò @s   Â"C.c                 ó   — t        | d«      S ©Nr
   rŽ   r�   s    r!   Úget_blockedrP    r°   r/   r
   c           	      ó@   — t        | dt        t        |«      «      «      S rO  )r‹   r&   r#  )r5   r
   s     r!   Úupdate_blockedrR    s   € Ü�f˜i¬¬T°'«]Ó);Ó<Ð<r/   c                 ó   — t        | d«      S ©NrQ   rŽ   r�   s    r!   Úget_passwordrU    s   € Ü�6˜:Ó&Ð&r/   rQ   c                 ó   — t        | d|«      S rT  r’   )r5   rQ   s     r!   Úupdate_passwordrW    s   € Ü�f˜j¨(Ó3Ð3r/   c                  óB   — t        «       D � cg c]  } | d   ‘Œ	 c} S c c} w r�   )Úlist_banned_ip_rowsr-   s    r!   Úlist_banned_ipsrZ    s   € Ü1Ó3Ö4�sˆˆT‹Ò4Ð4ùÒ4s   �c                  óN  — t        «       } | j                  «       }|j                  d«       g }|j                  «       D ]=  }|r|d   sŒ	 t	        |d   xs d«      }|j                  t        |d   «      |dœ«       Œ? | j                  «        |S # t
        t        f$ r d}Y ŒGw xY w)NzDSELECT ip, banned_at FROM banned_ips ORDER BY banned_at DESC, ip ASCr   r	   r7  )r1   Ú	banned_at)
r"   r   r   r   r;  r'   r(   r>   r6   rM   )r   r   rE   r   r\  s        r!   rY  rY    s¤   € Ü‹
€Ø‡{�{ƒ}€Ø‡�ÐSÔTØ
€Ø�L‰L‹Nò ;€SÙ	�C˜’FØðÜ�S˜‘V’[˜qÓ!€9ð ‡+�+”S˜˜Q™“[¨yÑ9Õ:ð;ð ‡�„Ø€øô	 ”ZÐ	 ò Ø‚9ðús   Á
BÂB$Â#B$c                 óò   — | xs dj                  «       } | sy t        «       }|j                  «       }|j                  d| t	        j                  «       f«       |j                  «        |j                  «        y )Nr2   z>INSERT OR IGNORE INTO banned_ips (ip, banned_at) VALUES (?, ?))r<   r"   r   r   Útimer   rM   )r1   r   r   s      r!   Úsave_banned_ipr_  *  s]   € Ø	‚xˆR×ÑÓ€Ù
ØÜ‹
€Ø‡{�{ƒ}€Ø‡�ØBØ„t‡y�yƒ{Ðôð ‡�„Ø‡�…r/   c                 óì   — | xs dj                  «       } | syt        «       }|j                  «       }|j                  d| f«       |j	                  «        |j
                  }|j                  «        |dkD  S )Nr2   Fz#DELETE FROM banned_ips WHERE ip = ?r   )r<   r"   r   r   r   r`   rM   )r1   r   r   ra   s       r!   Úremove_banned_ipra  8  sb   € Ø	‚xˆR×ÑÓ€Ù
Ø	Ü‹
€Ø‡{�{ƒ}€Ø‡�Ð2°R°EÔ:Ø‡�„Ø�<‰<€Ø‡�„Ø�!‰Ðr/   Ú_panel_workers_cachec                  ó4  — t        «       } | j                  «       }|j                  d«       t        «       }|j	                  «       D ](  }|r|d   €Œ	 |j                  t        |d   «      «       Œ* | j                  «        |a
|S # t        t        f$ r Y ŒPw xY w)NzSELECT tg_id FROM panel_workersr   )r"   r   r   rA   r   rB   r&   r'   r(   rM   rb  )r   r   Úidsr   s       r!   Ú_load_panel_workersre  H  s“   € ä‹
€Ø‡{�{ƒ}€Ø‡�Ð.Ô/Ü
ƒu€Ø�L‰L‹Nò €SÙ	��A‘�ØðØ‡7�7Œ3ˆs�1‰v‹;Õð	ð ‡�„ØÐØ€øô	 ”ZÐ	 ò Ùðús   ÁBÂBÂBc                  ó@   — t         €
t        «        t        t         «      S r£   )rb  re  Úsortedr  r/   r!   Úlist_panel_workersrh  Z  s   € äÐ ÜÔÜÔ#Ó$Ð$r/   c                 ót   — 	 t        | «      }t        €
t	        «        |t        v S # t        t        f$ r Y yw xY wr   )r&   r'   r(   rb  re  )Útg_idÚuids     r!   Úis_panel_workerrl  a  sC   € ðÜˆE‹
€#ô Ð ÜÔØÔ#Ð#Ð#øô 
”JÐò Ù	ðús   ‚% ¥7¶7rj  c                 ó^  — 	 t        | «      }|dk  ryt        «       }|j	                  «       }|j                  d|t        j                  «       f«       |j                  «        |j                  «        t        €t        «        yt        j                  |«       y# t        t        f$ r Y yw xY w)NFr   zCINSERT OR IGNORE INTO panel_workers (tg_id, added_at) VALUES (?, ?)T)r&   r'   r(   r"   r   r   r^  r   rM   rb  re  rB   )rj  rk  r   r   s       r!   Úadd_panel_workerrn  l  sœ   € ðÜˆE‹
€#ð ˆ1‚HØ	Ü‹
€Ø‡{�{ƒ}€Ø‡�ØGØŒ�	‰	‹Ðôð ‡�„Ø‡�„äÐ ÜÔð 	ô ×Ñ˜3ÔØøô# 
”JÐò Ù	ðús   ‚B ÂB,Â+B,c                 óN  — 	 t        | «      }t        «       }|j	                  «       }|j                  d|f«       |j                  «        |j                  dkD  }|j                  «        t        €t        «        |S t        j                  |«       |S # t        t        f$ r Y yw xY w)NFz)DELETE FROM panel_workers WHERE tg_id = ?r   )r&   r'   r(   r"   r   r   r   r`   rM   rb  re  Údiscard)rj  rk  r   r   ra   s        r!   Úremove_panel_workerrq  ƒ  s–   € ðÜˆE‹
€#ô 	‹
€Ø‡{�{ƒ}€Ø‡�Ð8¸3¸&ÔAØ‡�„Ø�<‰<˜!Ñ€Ø‡�„äÐ ÜÔð 	€ô ×Ñ˜sÔ#Ø€øô 
”JÐò Ù	ðús   ‚B ÂB$Â#B$Úuserbot_watchÚ_watch_cachec                  ó   — dg g d dœS )NT©ÚenabledÚkeywordsÚchatsÚalert_chat_idr  r  r/   r!   Ú_default_watch_settingsrz  š  s   € àØØØñ		ð r/   c                 óZ   — dj                  t        | xs d«      j                  «       «      S )Nræ   r2   )r{   r6   rg   r  s    r!   Ú_normalize_watch_keywordr|  £  s#   € Ø�‰”�U’[˜bÓ!×'Ñ'Ó)Ó*Ð*r/   c                 ó’  — t        | t        «      sy | j                  d«      }|dv ry 	 t        |«      }dj                  t        | j                  d«      xs |«      j                  «       «      d d }t        | j                  d«      xs d«      j                  «       d d }||xs t        |«      |d	œS # t        t
        f$ r Y y w xY w)
NrË   rZ   ræ   Útitleéx   Úkindr2   é   )rË   r~  r€  )
rè   r;   r,   r&   r'   r(   r{   r6   rg   r<   )r)   rö   Úchat_idr~  r€  s        r!   Ú_normalize_watch_chatrƒ  §  s¿   € Ü�5œ$ÔØ	Ø
�)‰)�D‹/€Ø
ˆjÑØ	ðÜ�‹K€'ð 
�‰”#�e—i‘i Ó(Ò3¨GÓ4×:Ñ:Ó<Ó	=¸d¸sÐ	C€ÜˆE�I‰I�fÓÒ# Ó$×*Ñ*Ó,¨S¨bÐ1€Ø Ò!6¬#¨g«,ÀÑEÐEøô	 
”JÐò Ù	ðús   ©B4 Â4CÃCc                 ó   — t        «       }| s|S t        | t        «      r| }n	 t        j                  | «      }t        |t        «      s|S d|v rt        |j                  d«      «      |d<   g }t        «       }|j                  d«      xs g D ]Y  }t        |«      }|j                  «       }|r||v rŒ%|j                  |«       |j                  |d d «       t        |«      dk\  sŒY n ||d<   g }t        «       }	|j                  d«      xs g D ]L  }t!        |«      }
|
r|
d   |	v rŒ|	j                  |
d   «       |j                  |
«       t        |«      dk\  sŒL n ||d<   |j                  d«      }|d	v rd |d<   |S 	 t#        |«      |d<   |S # t
        t        t        j                  f$ r |cY S w xY w# t
        t        f$ r	 d |d<   Y |S w xY w)
Nrv  rw  éP   é2   rx  rË   éd   ry  rZ   )rz  rè   r;   ré   rê   r'   r(   rë   r#  r,   rA   r|  rÚ   rB   r>   r×   rƒ  r&   )rï   rx   rð   rw  ÚseenrÓ   Úwordr:   rx  Úseen_idsÚchatÚalerts               r!   Ú_parse_watch_settingsr�  ¶  sé  € ÜÓ!€ÙØ	€+Üˆs”DÔØ�'ðÜ�Z‰Z˜‹_€7ô 	�7œDÔ!Ø	€+Ø�ÑÜ˜Ÿ™ YÓ/Ó0€$€y�/Ø€Ü‹€Ø�[‰[˜Ó$Ò*¨ò 	€TÜ	! $Ó	'€$Ø�‰‹€#Ù	�˜‘ØØ‡(�(ˆ3„-Ø
‡/�/�$�s˜�)ÔÜˆƒ]�bÓÙð	ð €€jÑØ	€Ü‹E€Ø�[‰[˜Ó!Ò' Rò 	€TÜ	˜tÓ	$€$Ù	��d‘˜xÑ'ØØ
‡,�,ˆt�D‰zÔØ‡,�,ˆtÔÜˆƒZ�3ÓÙð	ð €€g�Ø	�‰�_Ó	%€Ø	ˆZÑØ€$€Ñð 	€ð	 Ü˜u›:€4ˆÑð 	€øôK ”Z¤×!5Ñ!5Ð	6ò Ø
‚;ðûôF ”ZÐ	 ò  Ø€4ˆÒØ€ð ús#   £F Å?F5 Æ F2Æ1F2Æ5GÇGc                  ó€  — t         �,t        j                  t        j                  t         «      «      S t	        «       } | j                  «       }|j                  dt        f«       |j                  «       }| j                  «        t        |r|d   nd «      }|a t        j                  t        j                  |«      «      S rú   )rs  ré   rê   rû   r"   r   r   ÚWATCH_SETTINGS_KEYr   rM   r�  rý   s       r!   Úget_watch_settingsr�  ç  sˆ   € äÐÜ	�‰”D—J‘Jœ|Ó,Ó	-Ð-Ü‹
€Ø‡{�{ƒ}€Ø‡�Ð;Ô>PÐ=RÔSØ
‡|�|ƒ~€Ø‡�„Ü©˜c !šf°Ó6€Ø€Ü�
‰
”4—:‘:˜dÓ#Ó$Ð$r/   rð   c                 óà  — t        «       }t        | t        «      si } d| v r| d   n|d   d| v r| d   n|d   d| v r| d   n|d   d| v r| d   n|d   dœ}t        |«      }t	        «       }|j                  «       }|j                  dt        t        j                  |d¬«      f«       |j                  «        |j                  «        |at        j                  t        j                  |«      «      S )	Nrv  rw  rx  ry  ru  r
  Fr  )r�  rè   r;   r�  r"   r   r   r�  ré   rû   r   rM   rs  rê   )rð   rI  Úmergedrx   r   r   s         r!   Úsave_watch_settingsr“  õ  sê   € äÓ€Ü�7œDÔ!Ø€'à#,°Ñ#7ˆW�YÒ¸WÀYÑ=OØ%/°7Ñ%:ˆg�jÒ!ÀÈ
Ñ@SØ&¨'Ñ1ˆ7�7Ò°w¸wÑ7GØ/>À'Ñ/I�7˜?Ò+ÈwÐWfÑOgñ	€ô 	˜fÓ%€Ü‹
€Ø‡{�{ƒ}€Ø‡�ØmÜ”t—z‘z $°UÔ;Ð<ôð ‡�„Ø‡�„Ø€Ü�
‰
”4—:‘:˜dÓ#Ó$Ð$r/   c           	      óÜ   — t        | d   «      t        | d   xs d«      t        | d   «      t        | d   xs d«      | d   dvrt        | d   «      nd | d	   dvrt        | d	   «      d
œS d d
œS )NrË   Úurlr2   rI   Úadded_atr   Úused_atrZ   Úused_by)rË   r•  rI   r–  r—  r˜  )r&   r6   r#  r;  r-   s    r!   Ú
_proxy_rowr™    s†   € äˆC�‰I‹Ü	ˆS�‰ZÒ˜2Ó	Ü
ˆs�6‰{Ó
Ü�C˜
‘OÒ( qÓ)Ø&)¨)¡n¸JÑ&FŒU�3�y‘>Ô"ÈDØ$'¨	¡N¸*Ñ$DŒS��Y‘Ó ñ	ð ð KOñ	ð r/   c                 óT  — t        | t        «      r| j                  «       } t        | t        t        f«      sdddœS t        «       }g }| D ]H  }t        |xs d«      j                  «       }|r||v rŒ'|j                  |«       |j                  |«       ŒJ |sdddœS t        «       }|j                  «       }t        j                  «       }d}|D ](  }|j                  d||f«       |j                  sŒ$|dz  }Œ* |j                  «        |j                  «        |t!        |«      |z
  dœS )u‹   Ð”Ð¾Ð±Ð°Ð²Ð»Ñ�ÐµÑ‚ Ð¿Ñ€Ð¾ÐºÑ�Ð¸-Ñ�Ñ�Ñ‹Ð»ÐºÐ¸ Ð² Ð¿ÑƒÐ». Ð”ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ‚Ñ‹ Ð¿Ñ€Ð¾Ð¿ÑƒÑ�ÐºÐ°ÑŽÑ‚Ñ�Ñ�. Ð’Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÑ‚ Ñ�Ñ‡Ñ‘Ñ‚Ñ‡Ð¸ÐºÐ¸.r   )ÚaddedÚskippedr2   zDINSERT OR IGNORE INTO proxies (url, used, added_at) VALUES (?, 0, ?)r	   )rè   r6   Ú
splitlinesrÖ   r  rA   r<   rB   r>   r"   r   r^  r   r`   r   rM   r×   )	Úurlsrˆ  ÚcleanedrÓ   r•  r   r   Únowr›  s	            r!   Úadd_proxiesr¡    s  € äˆt”SÔØ	�‰Ó	€$Ü�4œ$¤˜Ô'Ø Ñ	#Ð#Ü‹€Ø€Øò €TÜˆDŠJ�B‹×ÑÓ€#Ù	��t‘ØØ‡(�(ˆ3„-Ø	‡.�.�Õðñ 	Ø Ñ	#Ð#Ü‹
€Ø‡{�{ƒ}€Ü‡y�yƒ{€Ø	
€Øò €SØ‡+�+ØIØˆ€:ôð 	‡\ƒ\ØˆA�:�5ðð ‡�„Ø‡�„Ø¤C¨£L°5Ñ$8Ñ9Ð9r/   c                 ó  — t        «       }|j                  «       }| €|j                  d«       n|j                  | rdnd| rdndf«       |j                  «       }|j	                  «        |D �cg c]  }t        |«      ‘Œ c}S c c}w )Nz%SELECT * FROM proxies ORDER BY id ASCzBSELECT * FROM proxies WHERE used = ? ORDER BY used_at DESC, id ASCz4SELECT * FROM proxies WHERE used = ? ORDER BY id ASCr	   r   )r"   r   r   r   rM   r™  )rI   r   r   rE   rD   s        r!   Úlist_proxiesr£  8  ss   € Ü‹
€Ø‡{�{ƒ}€Ø€LØ‡+�+Ð5Õ6à‡+�+ÙKOÑGØ>Ù	�A�1Ðôð
 	�‰‹€Ø‡�„Ø $Ö%˜1Œ�A�Ò%Ð%ùÒ%s   Á.Bc                  ó  — t        «       } | j                  «       }|j                  d«       d}d}|j                  «       D ]-  }t	        |d   «      rt	        |d   «      }Œ t	        |d   «      }Œ/ | j                  «        ||||z   dœS )NzWSELECT COALESCE(used, 0) AS used, COUNT(*) AS n FROM proxies GROUP BY COALESCE(used, 0)r   rI   rK   )Ú	availablerI   Útotal)r"   r   r   r   r&   rM   )r   r   r¥  rI   r   s        r!   Úproxy_countsr§  H  sƒ   € Ü‹
€Ø‡{�{ƒ}€Ø‡�ÐfÔgØ€Ø	€Ø�L‰L‹Nò €SÜˆˆV‰ÔÜ
ˆc�#‰h‹-�4ä�3�s‘8‹}�9ð	ð
 ‡�„Ø¨¸	ÀDÑ8HÑIÐIr/   c                 óò  — t        «       }|j                  «       }|j                  d«       |j                  «       }|s|j	                  «        yt        |«      }|j                  dt        j                  «       t        | xs d«      xs d|d   f«       |j                  s|j	                  «        t        | «      S |j                  «        |j	                  «        d|d<   t        | xs d«      xs d|d<   |S )	u�   Ð‘ÐµÑ€Ñ‘Ñ‚ Ñ�Ð°Ð¼ÑƒÑŽ Ñ�Ñ‚Ð°Ñ€ÑƒÑŽ Ñ�Ð²Ð¾Ð±Ð¾Ð´Ð½ÑƒÑŽ Ð¿Ñ€Ð¾ÐºÑ�Ð¸, Ð¿Ð¾Ð¼ÐµÑ‡Ð°ÐµÑ‚ Ð¸Ñ�Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð½Ð¾Ð¹ Ð¸ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÑ‚ ÐµÑ‘.z<SELECT * FROM proxies WHERE used = 0 ORDER BY id ASC LIMIT 1NzOUPDATE proxies SET used = 1, used_at = ?, used_by = ? WHERE id = ? AND used = 0r2   rË   TrI   r˜  )r"   r   r   r   rM   r™  r^  r6   r`   Útake_next_proxyr   )r5   r   r   r   Úproxys        r!   r©  r©  W  sÊ   € ä‹
€Ø‡{�{ƒ}€Ø‡�ÐKÔLØ
‡|�|ƒ~€ÙØ‡*�*„,Ø	Ü	�C‹€Ø‡�ØSÜ‡9�9ƒ;”�F’L˜bÓ!Ò) T¨5°©;Ð7ôð 	�ŠØ‡*�*„,Ü	˜Ó	 Ð Ø‡�„Ø‡�„Ø€€v�Ü˜š "Ó%Ò-¨€€yÑØ€r/   c                 ó   — 	 t        | «      }t        «       }|j	                  «       }|j                  d|f«       |j                  «        |j                  }|j                  «        |dkD  S # t        t        f$ r Y yw xY w)NFz DELETE FROM proxies WHERE id = ?r   ©	r&   r'   r(   r"   r   r   r   r`   rM   ©Úproxy_idÚpidr   r   ra   s        r!   Údelete_proxyr°  o  ss   € ðÜˆH‹€#ô 	‹
€Ø‡{�{ƒ}€Ø‡�Ð/°#°Ô8Ø‡�„Ø�<‰<€Ø‡�„Ø�!‰Ðøô 
”JÐò Ù	ðúó   ‚A+ Á+A=Á<A=c                 ó   — 	 t        | «      }t        «       }|j	                  «       }|j                  d|f«       |j                  «        |j                  }|j                  «        |dkD  S # t        t        f$ r Y yw xY w)uk   Ð’Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÑ‚ Ð¸Ñ�Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð½ÑƒÑŽ Ð¿Ñ€Ð¾ÐºÑ�Ð¸ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾ Ð² Ð¿ÑƒÐ» Ð´Ð¾Ñ�Ñ‚ÑƒÐ¿Ð½Ñ‹Ñ….FzHUPDATE proxies SET used = 0, used_at = NULL, used_by = NULL WHERE id = ?r   r¬  r­  s        r!   Úrestore_proxyr³  }  sx   € ðÜˆH‹€#ô 	‹
€Ø‡{�{ƒ}€Ø‡�ØLØ€&ôð ‡�„Ø�<‰<€Ø‡�„Ø�!‰Ðøô 
”JÐò Ù	ðúr±  )r	   )r$   N)r2   )r2   r	   r£   )T)vré   rf   rá   r   r^  Úflaskr   r   r   Úpathlibr   Útypingr   r6   Ú__file__ÚresolveÚparentr   r"   r&   r*   r.   r   rN   rX   r;   r[   r]   r#  rb   rd   rj   rl   rÖ   rq   ru   rA   rw   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ü   Úcompilerî   rì   rÑ   rÏ   Ú__annotations__rÔ   rÝ   rä   rø   rþ   r  r  r  r  r  r  r  r!  r$  r&  r5  r=  rE  rM  rP  rR  rU  rW  rZ  rY  r_  ra  rb  re  rh  rl  rn  rq  r�  rs  rz  r|  rƒ  r�  r�  r“  r™  r¡  r£  r§  r©  r°  r³  r  r/   r!   ú<module>r¼     sŽ  ðä Û 	Û Û Û ß )Ñ )Ý Ý ñ ‰d�8‹n×$Ñ$Ó&×-Ñ-°
Ñ:Ó
;€òTñn' cð '°#ó 'ð6˜có 6ó.Pòbð.˜#ó ð2˜sð ¨X°d©^ó ð"¨ð °¸±ó ð˜#ð  $ó ð�só ò_ò
ñ
˜3ð 
¨ð 
°dó 
ñ

˜ð 

 sð 

¸3ð 

Àsó 

ñ	˜#ð 	¨ð 	°S¸±Xó 	ð˜#ð  Tð ¨dó ð*�sð  ð ¨ó ð*�sð  3ó ð˜#ð  cð °Tó ð!�3ó !ð(�cð (˜sð ( tó (ð
#�Só #ð,˜ð , 3ð ,¨4ó ,ð
%�só %ð0˜#ð 0 sð 0¨tó 0ð�có ð%˜ð % Sð %¨Tó %ð
#�Só #ð,˜ð , 3ð ,¨4ó ,ð
&˜ó &ð2˜3ð 2¨ð 2°4ó 2ð
%�só %ð0˜#ð 0 uð 0°ó 0ð
&˜ó &ð2˜3ð 2¨ð 2°4ó 2ð
$�có $ð.˜ð . Sð .¨Tó .ð)˜3ó )ð8˜cð 8¨sð 8°tó 8ð *Ð Øˆb�j‰jÐ2Ó3€Ø�—
‘
Ð,Ó-€à˜>°IÈÑMØ˜¨iÀ$ÑGØ�x¨)¸dÑCðÐ ð
 $(Ð �(˜4‘.Ó 'ð5 ó 5ð Có ð�sð ˜só ð' $ó 'ðT%˜Dó %ð;˜ó ;ð˜ó ð+& $ó +&ð\,˜3ó ,ðD ð D¨ó Dð˜ð  ó ð1�dó 1ð@ ó @ð˜Tó ñ*�X˜c‘]ð °tó ð>
˜%ó 
ð "&¸tò  ˜$ð  ¨x¸©}ð  ÈÐQUÉó  ñFI˜#ð I sð I°#ð I¸dð IÈdó Ið*&˜ó &ð=˜3ð =¨ð =°ó =ð
'˜ó 'ð4˜Cð 4¨3ð 4°4ó 4ð5˜˜c™ó 5ð˜T $™Zó ð"�sð ˜tó ð
˜ð 
 ó 
ð ,0Ð �h˜s 3™xÑ(Ó /ð˜S ™Xó ð$%˜D ™Ió %ð$˜dó $ð˜Cð  Dó ð.˜sð  tó ð& %Ð Ø#€ˆh�t‰nÓ #ð ó ð+ só +ðF H¨T¡Nó Fð. $ó .ðb%˜Dó %ð% ð %¨$ó %ð0�tó ð:˜ó :ñ@&�x ‘~ð &°°d±ó &ð J�dó Jñ˜Cð ¨°$©ó ð0˜dó ð˜tô r/   