o
    Ñf²j–U  ã                   @   sð  U d dl Z d dlZd dlmZ e j e j e j e¡¡d¡Ze	ƒ Z
e	e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dddœddddœgZee ed< dZd ed!efd"d#„Zd efd$d%„Zd}d ed'ed(ed!efd)d*„Zd ed'ed+efd,d-„Zd ed!efd.d/„Zd ed!ee fd0d1„Zd ed!ee fd2d3„Zd ed4efd5d6„Zd ed7ed8edB d9ed!ef
d:d;„Zd ed7ed!edB fd<d=„Zd ed!ee fd>d?„Zd ed7ed!efd@dA„Zd ed7efdBdC„Zd ed!efdDdE„Z d ed!ee fdFdG„Z!d ed7ed!efdHdI„Z"d ed7ed8edB d9efdJdK„Z#d ed7efdLdM„Z$d ed!ee fdNdO„Z%	Pd~d edQedRedSedB dTedB dUefdVdW„Z&d edXefdYdZ„Z'd ed!ee fd[d\„Z(d edQedRedSedB dTedB dUed]efd^d_„Z)d edXefd`da„Z*d edXed7ed!efdbdc„Z+d edXed!e,eef fddde„Z-d edXefdfdg„Z.dhdi„ Z/d edjedkedled!ef
dmdn„Z0d ed!ee fdodp„Z1d edqed!edB fdrds„Z2			t	dd edqedjedkedleduedvedwedxefdydz„Z3d edqefd{d|„Z4dS )€é    N©ÚdatetimeÚdatabaseÚ
_INIT_DONEzopenai/gpt-oss-120bzGPT-OSS 120BÚgroq©Úmodel_idÚ
model_nameÚplatformzopenai/gpt-oss-20bzGPT-OSS 20Bzqwen/qwen3.8-27bzQwen 3.8 27Bz
allam-2-7bz
ALLaM 2 7Bz2nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:freezNemotron OmniÚ
openrouterzpoolside/laguna-xs.2:freezLaguna XS.2zmoonshotai/kimi-k2.6:freez	Kimi K2.6zgoogle/gemma-4-26b-a4b-it:freezGemma 4 26Bz!liquid/lfm-2.5-1.2b-thinking:freezLFM Thinkingz!liquid/lfm-2.5-1.2b-instruct:freezLFM Instructz#nvidia/nemotron-3-nano-30b-a3b:freezNemotron 30BÚDEFAULT_MODELS)zllama-3.3-70b-versatilezllama-3.1-8b-instantzmixtral-8x7b-32768Úbot_usernameÚreturnc                 C   s&   t jtdd� t j t|  ¡ › d�¡S )NT)Úexist_okz.db)ÚosÚmakedirsÚDB_DIRÚpathÚjoinÚlower)r   © r   ú%/var/www/kodo/factory/cobots/ai/db.pyÚget_db_path   s   r   c              	   Ã   sr  �|   ¡ }|tv rd S t t| ƒ¡4 I d H š–}| d¡I d H  | d¡I d H  | d¡I d H  | d¡I d H  | d¡I d H  | d¡I d H  | d¡I d H  | d¡I d H  g d	¢}|D ]\}}| d
||f¡I d H  q]tD ]}| d|d |d |d f¡I d H  qotD ]}| d|f¡I d H  q†| ¡ I d H  t 	|   ¡ ¡ W d   ƒI d H  d S 1 I d H s²w   Y  d S )NzŒ
            CREATE TABLE IF NOT EXISTS settings (
                key   TEXT PRIMARY KEY,
                value TEXT
            )
        a\  
            CREATE TABLE IF NOT EXISTS users (
                id          INTEGER PRIMARY KEY,
                username    TEXT,
                first_name  TEXT,
                is_banned   INTEGER DEFAULT 0,
                is_blocked  INTEGER DEFAULT 0,
                last_active TEXT,
                joined_at   TEXT
            )
        zÙ
            CREATE TABLE IF NOT EXISTS admins (
                id         INTEGER PRIMARY KEY,
                username   TEXT,
                first_name TEXT,
                added_at   TEXT
            )
        aß  
            CREATE TABLE IF NOT EXISTS mandatory_channels (
                id               INTEGER PRIMARY KEY AUTOINCREMENT,
                channel_id       TEXT UNIQUE NOT NULL,
                channel_username TEXT,
                channel_title    TEXT NOT NULL,
                invite_link      TEXT,
                display_type     TEXT DEFAULT 'buttons',
                is_active        INTEGER DEFAULT 1,
                added_at         TEXT
            )
        av  
            CREATE TABLE IF NOT EXISTS funded_channels (
                id               INTEGER PRIMARY KEY AUTOINCREMENT,
                channel_id       TEXT UNIQUE NOT NULL,
                channel_username TEXT,
                channel_title    TEXT NOT NULL,
                invite_link      TEXT,
                display_type     TEXT DEFAULT 'buttons',
                target_count     INTEGER NOT NULL DEFAULT 100,
                current_count    INTEGER DEFAULT 0,
                is_active        INTEGER DEFAULT 1,
                added_at         TEXT,
                completed_at     TEXT
            )
        a]  
            CREATE TABLE IF NOT EXISTS funded_subscriptions (
                id                INTEGER PRIMARY KEY AUTOINCREMENT,
                funded_channel_id INTEGER NOT NULL,
                user_id           INTEGER NOT NULL,
                subscribed_at     TEXT,
                UNIQUE(funded_channel_id, user_id)
            )
        zõ
            CREATE TABLE IF NOT EXISTS models (
                model_id   TEXT PRIMARY KEY,
                model_name TEXT NOT NULL,
                platform   TEXT NOT NULL,
                is_enabled INTEGER DEFAULT 1
            )
        a_  
            CREATE TABLE IF NOT EXISTS custom_buttons (
                id          INTEGER PRIMARY KEY AUTOINCREMENT,
                btn_type    TEXT NOT NULL,
                label       TEXT NOT NULL,
                content     TEXT NOT NULL,
                position    INTEGER DEFAULT 0,
                created_at  TEXT
            )
        ))Úis_openÚ1)Úclosed_messageu(   ðŸ”´ Ø§Ù„Ø¨ÙˆØª Ù…Ù‚Ù�ÙˆÙ„ Ø­Ø§Ù„ÙŠØ§Ù‹.)Úwelcome_messageÚ )Únotify_new_usersr   )Únotify_blockedr   )Úfund_notifyr   z9INSERT OR IGNORE INTO settings (key, value) VALUES (?, ?)z]INSERT OR IGNORE INTO models (model_id, model_name, platform, is_enabled) VALUES (?, ?, ?, 1)r   r	   r
   z7DELETE FROM models WHERE model_id=? AND platform='groq')
r   r   Ú	aiosqliteÚconnectr   Úexecuter   Ú_OLD_GROQ_MODELSÚcommitÚadd)r   ÚkeyÚdbÚdefaultsÚdkeyÚvalueÚmÚ_oldr   r   r   Úinit_db#   s>   €		þýÿ.“r.   r   r'   Údefaultc              
   Ã   s¾   �t  t| ƒ¡4 I d H šF}| d|f¡4 I d H š$}| ¡ I d H }|r&|d n|W  d   ƒI d H  W  d   ƒI d H  S 1 I d H sBw   Y  W d   ƒI d H  d S 1 I d H sXw   Y  d S )Nz&SELECT value FROM settings WHERE key=?r   ©r!   r"   r   r#   Úfetchone)r   r'   r/   r(   ÚcurÚrowr   r   r   Úget_setting–   s   €þÿ.ÿr4   r+   c              	   Ã   sn   �t  t| ƒ¡4 I d H š}| d||f¡I d H  | ¡ I d H  W d   ƒI d H  d S 1 I d H s0w   Y  d S )Nz:INSERT OR REPLACE INTO settings (key, value) VALUES (?, ?)©r!   r"   r   r#   r%   )r   r'   r+   r(   r   r   r   Úset_setting�   s   €
ÿ.ür6   c              
   Ã   ó´   �t  t| ƒ¡4 I d H šA}| d¡4 I d H š!}dd„ | ¡ I d H D ƒW  d   ƒI d H  W  d   ƒI d H  S 1 I d H s=w   Y  W d   ƒI d H  d S 1 I d H sSw   Y  d S )NzSELECT key, value FROM settingsc                 S   s   i | ]	}|d  |d “qS )r   é   r   ©Ú.0Úrr   r   r   Ú
<dictcomp>¨   s    z$get_all_settings.<locals>.<dictcomp>©r!   r"   r   r#   Úfetchall©r   r(   r2   r   r   r   Úget_all_settings¥   s   €ÿÿ.ÿr@   c              
   Ã   r7   )Nz=SELECT model_id, model_name, platform, is_enabled FROM modelsc                 S   s.   g | ]}|d  |d |d t |d ƒdœ‘qS )r   r8   é   é   )r   r	   r
   Ú
is_enabled)Úboolr9   r   r   r   Ú
<listcomp>¯   s    û
üÿzget_models.<locals>.<listcomp>r=   r?   r   r   r   Ú
get_modelsª   s   €ÿùýÿ.ÿrF   c              
   Ã   r7   )NzDSELECT model_id, model_name, platform FROM models WHERE is_enabled=1c                 S   ó$   g | ]}|d  |d |d dœ‘qS )r   r8   rA   r   r   r9   r   r   r   rE   ¿   s    ÿÿz&get_enabled_models.<locals>.<listcomp>r=   r?   r   r   r   Úget_enabled_modelsº   s   €ÿþýÿ.ÿrH   r   c              	   Ã   ól   �t  t| ƒ¡4 I d H š}| d|f¡I d H  | ¡ I d H  W d   ƒI d H  d S 1 I d H s/w   Y  d S )Nz>UPDATE models SET is_enabled = 1 - is_enabled WHERE model_id=?r5   )r   r   r(   r   r   r   Útoggle_modelÅ   s   €
þ.ûrJ   Úuser_idÚusernameÚ
first_namec              
   Ã   sF  �t  ¡  ¡ }t t| ƒ¡4 I d H š„}| d|f¡4 I d H š}| ¡ I d H }W d   ƒI d H  n1 I d H s6w   Y  |se| d|||||f¡I d H  | ¡ I d H  |||ddddœW  d   ƒI d H  S | d||||f¡I d H  | ¡ I d H  |d |d |d |d	 |d
 ddœW  d   ƒI d H  S 1 I d H sœw   Y  d S )NúHSELECT id,username,first_name,is_banned,is_blocked FROM users WHERE id=?zRINSERT INTO users (id,username,first_name,last_active,joined_at) VALUES(?,?,?,?,?)r   T)ÚidrL   rM   Ú	is_bannedÚ
is_blockedÚis_newzAUPDATE users SET username=?,first_name=?,last_active=? WHERE id=?r8   rA   rB   é   F©	r   ÚutcnowÚ	isoformatr!   r"   r   r#   r1   r%   )r   rK   rL   rM   Únowr(   r2   r3   r   r   r   Úget_or_create_userÎ   s8   €ÿ(þ
þÿö

þÿ0ïrX   c              
   Ã   s   �t  t| ƒ¡4 I d H šg}| d|f¡4 I d H šE}| ¡ I d H }|s7	 W d   ƒI d H  W d   ƒI d H  d S |d |d |d |d |d dœW  d   ƒI d H  W  d   ƒI d H  S 1 I d H scw   Y  W d   ƒI d H  d S 1 I d H syw   Y  d S )NrN   r   r8   rA   rB   rS   )rO   rL   rM   rP   rQ   r0   )r   rK   r(   r2   r3   r   r   r   Úget_useræ   s&   €þúÿÿùÿ.ÿrY   c              
   Ã   r7   )NzKSELECT id,username,first_name FROM users WHERE is_banned=0 AND is_blocked=0c                 S   rG   ©r   r8   rA   )rO   rL   rM   r   r9   r   r   r   rE   ø   ó    ÿz(get_all_active_users.<locals>.<listcomp>r=   r?   r   r   r   Úget_all_active_usersó   s   €ÿÿýÿ.ÿr\   c              
   Ã   sè   �t  t| ƒ¡4 I d H š[}| d|f¡4 I d H š'}| ¡ I d H s5	 W d   ƒI d H  W d   ƒI d H  dS W d   ƒI d H  n1 I d H sEw   Y  | d|f¡I d H  | ¡ I d H  	 W d   ƒI d H  dS 1 I d H smw   Y  d S )NzSELECT id FROM users WHERE id=?Fz'UPDATE users SET is_banned=1 WHERE id=?T)r!   r"   r   r#   r1   r%   ©r   rK   r(   r2   r   r   r   Úban_userü   s   €þÿ(ÿ0úr^   c              	   Ã   rI   )Nz'UPDATE users SET is_banned=0 WHERE id=?r5   ©r   rK   r(   r   r   r   Ú
unban_user  ó
   €.þr`   c              
   Ã   sN  �t  t| ƒ¡4 I d H š‰}| d¡4 I d H š}| ¡ I d H d }W d   ƒI d H  n1 I d H s0w   Y  | d¡4 I d H š}| ¡ I d H d }W d   ƒI d H  n1 I d H sXw   Y  | d¡4 I d H š}| ¡ I d H d }W d   ƒI d H  n1 I d H s€w   Y  || | }W d   ƒI d H  n1 I d H s›w   Y  ||||dœS )NzSELECT COUNT(*) FROM usersr   z,SELECT COUNT(*) FROM users WHERE is_banned=1z-SELECT COUNT(*) FROM users WHERE is_blocked=1)ÚtotalÚbannedÚblockedÚactiver0   )r   r(   r2   rb   rc   rd   re   r   r   r   Úget_statistics  s   €(ÿ(ÿ(ÿ(ùrf   c              
   Ã   r7   )Nz)SELECT id,username,first_name FROM adminsc                 S   rG   rZ   r   r9   r   r   r   rE     r[   zget_admins.<locals>.<listcomp>r=   r?   r   r   r   Ú
get_admins  s   €ÿÿÿ.ÿrg   c              
   Ã   s²   �t  t| ƒ¡4 I d H š@}| d|f¡4 I d H š}t| ¡ I d H ƒW  d   ƒI d H  W  d   ƒI d H  S 1 I d H s<w   Y  W d   ƒI d H  d S 1 I d H sRw   Y  d S )Nz SELECT id FROM admins WHERE id=?)r!   r"   r   r#   rD   r1   r]   r   r   r   Úis_admin  s   €ÿÿ.ÿrh   c              	   Ã   s~   �t  ¡  ¡ }t t| ƒ¡4 I d H š }| d||||f¡I d H  | ¡ I d H  W d   ƒI d H  d S 1 I d H s8w   Y  d S )NzOINSERT OR REPLACE INTO admins (id,username,first_name,added_at) VALUES(?,?,?,?)©r   rU   rV   r!   r"   r   r#   r%   )r   rK   rL   rM   rW   r(   r   r   r   Ú	add_admin$  s   €

þ.ûrj   c              	   Ã   rI   )NzDELETE FROM admins WHERE id=?r5   r_   r   r   r   Úremove_admin/  ra   rk   c              
   Ã   r7   )NzvSELECT id,channel_id,channel_username,channel_title,invite_link,display_type FROM mandatory_channels WHERE is_active=1c              	   S   s6   g | ]}|d  |d |d |d |d |d dœ‘qS )r   r8   rA   rB   rS   é   )rO   Ú
channel_idÚchannel_usernameÚchannel_titleÚinvite_linkÚdisplay_typer   r9   r   r   r   rE   :  s    þÿÿz*get_mandatory_channels.<locals>.<listcomp>r=   r?   r   r   r   Úget_mandatory_channels4  s   €ÿýüÿ.ÿrr   Úbuttonsrm   ro   rn   rp   rq   c              
   Ã   s‚   �t  ¡  ¡ }t t| ƒ¡4 I d H š"}| d||||||f¡I d H  | ¡ I d H  W d   ƒI d H  d S 1 I d H s:w   Y  d S )Nz—INSERT OR REPLACE INTO mandatory_channels (channel_id,channel_username,channel_title,invite_link,display_type,is_active,added_at) VALUES(?,?,?,?,?,1,?)ri   )r   rm   ro   rn   rp   rq   rW   r(   r   r   r   Úadd_mandatory_channelA  s   €
ü.ùrt   Úchannel_db_idc              	   Ã   rI   )Nz4UPDATE mandatory_channels SET is_active=0 WHERE id=?r5   ©r   ru   r(   r   r   r   Úremove_mandatory_channelO  ó   €
ÿ.ürw   c              
   Ã   r7   )NzŽSELECT id,channel_id,channel_username,channel_title,invite_link,display_type,target_count,current_count FROM funded_channels WHERE is_active=1c                 S   sB   g | ]}|d  |d |d |d |d |d |d |d dœ‘qS )	r   r8   rA   rB   rS   rl   é   é   )rO   rm   rn   ro   rp   rq   Útarget_countÚcurrent_countr   r9   r   r   r   rE   \  s    ýþÿz'get_funded_channels.<locals>.<listcomp>r=   r?   r   r   r   Úget_funded_channelsV  s   €ÿüüÿ.ÿr}   r{   c           	      Ã   s„   �t  ¡  ¡ }t t| ƒ¡4 I d H š#}| d|||||||f¡I d H  | ¡ I d H  W d   ƒI d H  d S 1 I d H s;w   Y  d S )Nz³INSERT OR REPLACE INTO funded_channels (channel_id,channel_username,channel_title,invite_link,display_type,target_count,current_count,is_active,added_at) VALUES(?,?,?,?,?,?,0,1,?)ri   )	r   rm   ro   rn   rp   rq   r{   rW   r(   r   r   r   Úadd_funded_channeld  s   €ÿ
ü.ør~   c              	   Ã   rI   )Nz1UPDATE funded_channels SET is_active=0 WHERE id=?r5   rv   r   r   r   Úremove_funded_channels  rx   r   c              
   Ã   s  �t  ¡  ¡ }t t| ƒ¡4 I d H šh}| d||f¡4 I d H š'}| ¡ I d H r<	 W d   ƒI d H  W d   ƒI d H  dS W d   ƒI d H  n1 I d H sLw   Y  | d|||f¡I d H  | d|f¡I d H  | ¡ I d H  	 W d   ƒI d H  dS 1 I d H s€w   Y  d S )NzKSELECT id FROM funded_subscriptions WHERE funded_channel_id=? AND user_id=?FzXINSERT INTO funded_subscriptions (funded_channel_id,user_id,subscribed_at) VALUES(?,?,?)zCUPDATE funded_channels SET current_count=current_count+1 WHERE id=?TrT   )r   ru   rK   rW   r(   r2   r   r   r   Úrecord_funded_sub{  s2   €þûÿ(ü
þ
þ0ðr€   c              
   Ã   sÆ   �t  t| ƒ¡4 I d H šJ}| d|f¡4 I d H š(}| ¡ I d H }|r*|d |d fndW  d   ƒI d H  W  d   ƒI d H  S 1 I d H sFw   Y  W d   ƒI d H  d S 1 I d H s\w   Y  d S )NzASELECT current_count,target_count FROM funded_channels WHERE id=?r   r8   )r   r   r0   )r   ru   r(   r2   r3   r   r   r   Úget_funded_channel_count�  s   €þûÿ.ÿr�   c              	   Ã   sz   �t  ¡  ¡ }t t| ƒ¡4 I d H š}| d||f¡I d H  | ¡ I d H  W d   ƒI d H  d S 1 I d H s6w   Y  d S )NzAUPDATE funded_channels SET is_active=0, completed_at=? WHERE id=?ri   )r   ru   rW   r(   r   r   r   Úmark_funded_completeš  s   €
þ.ûr‚   c              	   Ã   s:   �dD ]\}}z
|   |¡I d H  W q ty   Y qw d S )N))Úemojiz0ALTER TABLE custom_buttons ADD COLUMN emoji TEXT)Úcustom_emoji_idz:ALTER TABLE custom_buttons ADD COLUMN custom_emoji_id TEXT)Úcolorz0ALTER TABLE custom_buttons ADD COLUMN color TEXT)Ú
is_visiblezBALTER TABLE custom_buttons ADD COLUMN is_visible INTEGER DEFAULT 1)r#   Ú	Exception)r(   ÚcolÚddlr   r   r   Ú_ensure_cbtn_columns¤  s   €ÿørŠ   Úbtn_typeÚlabelÚcontentc              	   Ã   s˜   �ddl m } t t| ƒ¡4 I d H š-}t|ƒI d H  | d|||| ¡  ¡ f¡I d H }| ¡ I d H  |j	W  d   ƒI d H  S 1 I d H sEw   Y  d S )Nr   r   z¨INSERT INTO custom_buttons (btn_type, label, content, position, created_at, is_visible) VALUES (?, ?, ?, (SELECT COALESCE(MAX(position),0)+1 FROM custom_buttons), ?, 1))
r   r!   r"   r   rŠ   r#   rU   rV   r%   Ú	lastrowid)r   r‹   rŒ   r�   Ú_dtr(   r2   r   r   r   Úadd_custom_button±  s   €
ý0ør�   c              
   Ã   sÆ   �t  t| ƒ¡4 I d H šJ}t|ƒI d H  | d¡4 I d H š#}| ¡ I d H }dd„ |D ƒW  d   ƒI d H  W  d   ƒI d H  S 1 I d H sFw   Y  W d   ƒI d H  d S 1 I d H s\w   Y  d S )NzŠSELECT id, btn_type, label, content, position, emoji, custom_emoji_id, color, COALESCE(is_visible,1) FROM custom_buttons ORDER BY positionc                 S   sH   g | ] }|d  |d |d |d |d |d |d |d |d d	œ	‘qS )
r   r8   rA   rB   rS   rl   ry   rz   é   ©	rO   r‹   rŒ   r�   Úpositionrƒ   r„   r…   r†   r   r9   r   r   r   rE   Æ  s    þÿÿz&get_custom_buttons.<locals>.<listcomp>)r!   r"   r   rŠ   r#   r>   )r   r(   r2   Úrowsr   r   r   Úget_custom_buttons¾  s   €ÿýûþ.þr•   Úbtn_idc                 Ã   s&  �t  t| ƒ¡4 I d H šz}t|ƒI d H  | d|f¡4 I d H šQ}| ¡ I d H }|s>	 W d   ƒI d H  W d   ƒI d H  d S |d |d |d |d |d |d |d |d	 |d
 dœ	W  d   ƒI d H  W  d   ƒI d H  S 1 I d H svw   Y  W d   ƒI d H  d S 1 I d H sŒw   Y  d S )Nz…SELECT id, btn_type, label, content, position, emoji, custom_emoji_id, color, COALESCE(is_visible,1) FROM custom_buttons WHERE id = ?r   r8   rA   rB   rS   rl   ry   rz   r‘   r’   )r!   r"   r   rŠ   r#   r1   )r   r–   r(   r2   r;   r   r   r   Úget_custom_buttonÍ  s(   €ýùþ
ÿøþ.þr—   Ú__keep__rƒ   r„   r…   r†   c	              	   Ã   sz  �t  t| ƒ¡4 I d H š¤}	t|	ƒI d H  g g }
}|d ur'|
 d¡ | |¡ |d ur5|
 d¡ | |¡ |d urC|
 d¡ | |¡ |dkrQ|
 d¡ | |¡ |dkr_|
 d¡ | |¡ |dkrm|
 d¡ | |¡ |d ur{|
 d¡ | |¡ |
s‰	 W d   ƒI d H  d S | |¡ |	 d	d
 |
¡› d�|¡I d H  |	 ¡ I d H  W d   ƒI d H  d S 1 I d H s¶w   Y  d S )Nzbtn_type = ?z	label = ?zcontent = ?r˜   z	emoji = ?zcustom_emoji_id = ?z	color = ?zis_visible = ?zUPDATE custom_buttons SET z, z WHERE id = ?)r!   r"   r   rŠ   Úappendr#   r   r%   )r   r–   r‹   rŒ   r�   rƒ   r„   r…   r†   r(   ÚsetsÚvalsr   r   r   Úupdate_custom_buttonÜ  s2   €
î
 .ërœ   c              	   Ã   rI   )Nz'DELETE FROM custom_buttons WHERE id = ?r5   )r   r–   r(   r   r   r   Údelete_custom_buttonø  ra   r�   )r   )rs   )NNNr˜   r˜   r˜   N)5r   r!   r   r   r   ÚdirnameÚabspathÚ__file__r   Úsetr   Ú__annotations__r   ÚlistÚdictr$   Ústrr   r.   r4   r6   r@   rF   rH   rJ   ÚintrX   rY   r\   rD   r^   r`   rf   rg   rh   rj   rk   rr   rt   rw   r}   r~   r   r€   Útupler�   r‚   rŠ   r�   r•   r—   rœ   r�   r   r   r   r   Ú<module>   s¸   











õs
	ÿÿ
ÿ	

ÿ
ÿþÿÿ
þÿÿþ
þ

ýÿÿþþý
ý