o
    �Ö¹j6°  ã                   @   s´  d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
Z
d dlmZ e e¡Z�d5ded	ed
efdd„Zedeed ƒƒeedeed ƒƒƒedeed ƒƒedeed ƒƒeddƒdddœZeddƒ d¡ZeddƒZedd ƒZedd!�G d"d#„ d#ƒƒZedd!�G d$d%„ d%ƒƒZedd!�G d&d'„ d'ƒƒZi d(d)“d*d+“d,d-“d.d/“d0d1“d2d3“d4d5“d6d7“d8d9“d:d;“d<d=“d>d?“d@dA“dBdC“dDdE“dFdG“dHdI“dJdKdLdMdNdOdPdQdRdSdTœ
¥Zd(d*d0d4d8d:dUdVdWdXœ	Zd(d:hZdYdZd[d\d]d^d_d`dadbdcddœZi d(ededfƒedgdhƒedidjƒg“d*edkdlƒedmdldndo�edpdqƒedrdsdtdo�g“d,edudvdwdo�edxdydwdo�edzd{ƒg“d.ed|d}d~dd€�ed�d‚dƒd„ƒed…d‚dƒd†ƒed‡dˆdwdo�g“d0ed‰dŠƒed‹dŒƒed�dŒdŽdo�g“d2ed�d�ƒed‘d�d’do�ed“d�d”ƒg“d4ed•d–ƒed—d–d˜do�ed™dšƒed›dœƒg“d6ed�džƒedŸdžd do�ed¡d¢d£ƒed¤d¢d¥ƒg“d8ed¦d§d¨do�ed©d§dªdo�ed«d¬d­do�ed®d¯d°d±ƒg“d:ed²d³ƒed´dµƒed¶d·ƒg“d>ed¸d¹ƒedºd¹dwdo�ed»d¹d¼do�g“d@edud½dwdo�ed¾d¿dwdo�edÀdÁƒedÂd¿dÃƒg“dÄedÅdÆƒedÇdÈdwdo�edÉdÊƒg“dËedÌdÍƒedÎdÏƒedÐdÍd”ƒedÑdÒdwdo�g“dVedÓdÔƒedÕdÖƒed×dØƒedÙdØd­do�g“dWedÚdÛƒedÜdÛd­do�edÝdÞƒedßdÛdàdád€�g“Ze  ¡ D ]\Z!Z"e #e!ed|e"d~dd€�g¡ �qTedâ  $edãdcdäƒ¡ i d(edådhdæƒedçdjdæƒg“d*edèdqdæƒedédldæƒedêdsdëdtƒg“d,edìd{dæƒedídydæƒg“d.edîdïdëd­ƒg“d0ed‹dŒdæƒed‰dŠdðƒg“d2edñd�dæƒg“d4edòd–dæƒedódšdôƒg“d6edõdždöƒg“d8ed¦d§dæd¨ƒed«d¬dæd­ƒg“d:ed‰d³dðƒed´dµdæƒg“d>ed÷d¹dæƒg“d@edødÁdæƒedùd¿dæƒg“dÄedúdÆdðƒedûdÊdæƒg“dËedüdÍdæƒedýdÏdæƒg“dVedÓdÔdæƒedÕdÖdæƒg“dWedþdÛdæƒedÿ�d dæƒg“Z%e�d�dƒedï�dƒe�d�dƒe�d�dƒ�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�d
œdždž�d�d�d
œdsds�d�d�d
œ�d�d�d�d�d
œfZ'd
e(e)eef  f�d�d„Z*�dedB d
edB f�d�d„Z+�ded
e(e,eef  f�d�d„Z-�de	d
ee.B f�d�d„Z/�de	d
ef�d�d„Z0�d6�de	�d!ed
ef�d"�d#„Z1�d$e	�d%e	d
ef�d&�d'„Z2�d7�de	�d)ed
ef�d*�d+„Z3�d,e)ee	f d
ef�d-�d.„Z4�de�d/e�d0e)ee	f d
ef�d1�d2„Z5G �d3�d4„ �d4ƒZ6e6ƒ Z7dS (8  é    N)Ú	dataclass)Údatetime)ÚDecimal)ÚAny)Ú	DB_CONFIGÚ ÚnameÚfallbackÚreturnc                 C   s   t tj | d¡ƒ ¡ }|p|S )Nr   )ÚstrÚosÚenvironÚgetÚstrip)r   r	   Úvalue© r   ú3/var/www/back/telegram_server/app_master_service.pyÚ_env   s   r   ÚAPP_MASTER_DB_HOSTÚhostÚAPP_MASTER_DB_PORTÚportÚAPP_MASTER_DB_USERÚuserÚAPP_MASTER_DB_PASSWORDÚpasswordÚAPP_MASTER_DB_NAMEÚ
app_masterÚutf8mb4T)r   r   r   r   ÚdbÚcharsetÚ
autocommitÚAPP_MASTER_ADMIN_URLz(https://app-master.officialsite.kr/adminú/ÚOFFICIAL_MAIL_ADMIN_URLz;https://mail.officialsite.kr/kavenix?view=domain-assistanceÚOFFICIAL_MAIL_CHARGES_URLz1https://mail.officialsite.kr/kavenix?view=charges)Úfrozenc                   @   sB   e Zd ZU eed< eed< dZeed< dZeed< dZeed< d	S )
ÚMetricÚlabelÚtableúCOUNT(*)Ú
expressionr   ÚwhereÚnumberÚvalue_formatN)Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__r+   r,   r.   r   r   r   r   r'   -   s   
 r'   c                   @   s2   e Zd ZU eed< eed< eed< dZeed< dS )ÚActivityr(   r)   Údate_columnr   r,   N)r/   r0   r1   r   r2   r,   r   r   r   r   r3   6   s
   
 r3   c                   @   s2   e Zd ZU eed< eedf ed< dZeed< dS )ÚPurchaser)   .Úpaid_statusesÚpurchased_atr4   N)r/   r0   r1   r   r2   Útupler4   r   r   r   r   r5   >   s   
 r5   Úbabynoteu   ì•„ê°€ë…¸íŠ¸Úbalancepicku   ë°¸ëŸ°ìŠ¤í”½Úrandomquestionu   ëžœë�¤ì§ˆë¬¸Ú
tapcounteru   íƒ­ì¹´ìš´í„°ÚstonemasterÚStoneMasterÚqnoteÚQNoteÚcalmoau	   ìº˜ëª¨ì•„Ú	chromakeyu   í�¬ë¡œë§ˆí‚¤ ìŠ¤í�¬ë¦°Ú
onetakeduou   ê°€ì„¸ë¡œìº Úwallet_keeperu   ì§€ê°‘ì§€ì¼œÚtiplyu   íŒ�ë¦¬zramen-timeru   ê¼¬ë“¤ íƒ€ì�´ë¨¸ztag-shuttleu   íƒœê·¸ ì…”í‹€Úkaomojiu   ì¹´ì˜¤ëª¨ì§€úfocus-intervalu   í�¬ì»¤ìŠ¤ ì�¸í„°ë²Œúwater-reminderu   ë¬¼ë§ˆì‹œê¸° ì•Œë¦¬ë¯¸úpill-reminderu   ì•½ ì•Œë¦¬ë¯¸u   ê¸°ìƒ� ë¦¬ë§ˆì�¸ë�”u   ìŠ¬ë¦½ ì‚¬ìš´ë“œu   ì†Œì�Œ ì¸¡ì •ê¸°u   ë¬¼ì£¼ê¸° ì•Œë¦¬ë¯¸u	   ë„¤ìž„ë“œu   ì¦�ê±°ë…¸íŠ¸u   ëˆˆ íœ´ì‹� ì•Œë¦¬ë¯¸u   ë„¥ ë¦´ë¦¬í”„u   ê³ ìŠ¤íŠ¸ëŸ¬ë‹�zMerge Snack Factory)
ústandup-reminderúsleep-soundúsound-meterúplant-reminderÚnamedúevidence-noteú	eye-breakúneck-reliefúghost-runningúmerge-snack-factoryÚplant_reminderrO   rR   )	r9   r:   r=   rA   rC   rD   rM   rO   rR   Útiply_ad_settingsÚkaomoji_ad_settingsÚfocus_interval_ad_settingsÚwater_reminder_ad_settingsÚpill_reminder_ad_settingsÚstandup_reminder_ad_settingsÚsleep_sound_ad_settingsÚsoundmeter_ad_settingsÚeye_break_ad_settingsÚneck_relief_ad_settingsÚmerge_snack_factory_ad_settings)rE   rF   rG   rH   rI   rJ   rK   rL   rP   rQ   rS   u   ì „ì²´ ê°€ì¡±Úbabynote_familiesu   ì „ì²´ ì�¼ê¸°Úbabynote_diariesu   ì „ì²´ ëŒ“ê¸€Úbabynote_commentsu   ì „ì²´ ê²Œìž„Úbalancepick_gamesu   ê³µê°œ ê²Œìž„z%is_public = 1 AND status = 'approved')r,   u   ì „ì²´ í”Œë ˆì�´Úbalancepick_game_playsu   í™œì„± í”„ë¦¬ë¯¸ì—„Úbalancepick_purchasesz`status = 'completed' AND verified_at IS NOT NULL AND purchase_state = 0 AND is_test_purchase = 0u   í™œì„± ì¹´í…Œê³ ë¦¬Úrandomquestion_categorieszis_active = 1u   í™œì„± ì§ˆë¬¸ ì„¸íŠ¸Úrandomquestion_game_setsu   ì „ì²´ ì§ˆë¬¸ ì¹´ë“œÚrandomquestion_game_itemsu   ê´‘ê³  ìš´ì˜� ëª¨ë“œÚtapcounter_ad_settingszMAX(ad_mode)Útext)r.   u   ì�¼ì�¼ ë¬´ë£Œ ì‚¬ìš©Úapp_settingsz$MAX(CAST(setting_value AS UNSIGNED))z<app_name = 'tapcounter' AND setting_key = 'daily_free_limit'u   ê´‘ê³  ì‹œì²­ ë³´ìƒ�z;app_name = 'tapcounter' AND setting_key = 'ad_reward_count'u   í™œì„± ê´‘ê³  ì œê±°Útapcounter_ad_removalu   í�´ë�¼ìš°ë“œ ì €ìž¥Ústonemaster_cloud_savesu   ê´‘ê³  ì�´ë²¤íŠ¸Ústonemaster_ad_eventsu   ë¦¬ì›Œë“œ ì™„ë£Œzevent_type = 'completed'u	   ì „ì²´ QRÚqr_codesu   ì¦�ê²¨ì°¾ê¸° QRzis_favorite = 1u   ìƒ�ì„± ê¸°ê¸°zCOUNT(DISTINCT device_serial)u   ì „ì²´ ì•½ì†�Úcalmoa_appointmentsu   ì§„í–‰ ì¤‘ ì•½ì†�zis_closed = 0u   ì „ì²´ ì�‘ë‹µÚcalmoa_responsesu   ë°œì†¡ ì•Œë¦¼Úcalmoa_notificationsu   ì „ì²´ êµ¬ë§¤Úchromakey_purchasesu   í™œì„± êµ¬ë§¤z>is_active = 1 AND (expiry_time IS NULL OR expiry_time > NOW())u   ëˆ„ì � ì„¸ì…˜Úchromakey_statsz COALESCE(SUM(total_sessions), 0)u   ê´‘ê³  ë…¸ì¶œzCOALESCE(SUM(ad_views), 0)u   ì €ìž¥ ì™„ë£ŒÚonetakeduo_save_sessionszstatus = 'saved'u   ì›Œí„°ë§ˆí�¬ ì €ìž¥z*status = 'saved' AND watermark_applied = 1u   ê´‘ê³  ë³´ìƒ�Úonetakeduo_reward_claimszstatus = 'completed'u   Pro ì‚¬ìš©ìž�Úonetakeduo_user_stater*   z
is_pro = 1u   í�´ë�¼ìš°ë“œ ì €ìž¥ ì‚¬ìš©ìž�Úwallet_keeper_cloud_savesu   ë¬¸ìž� ìž�ì‚° ìˆ˜ì§‘Úwallet_keeper_sms_reportsu   ê´€ë¦¬ìž� ì•Œë¦¼ ë°œì†¡Ú wallet_keeper_customer_remindersu   ì „ì²´ ë�¼ë©´Úramen_timer_ramensu   í™œì„± ë�¼ë©´u   ì»¤ìŠ¤í…€ ë�¼ë©´zis_custom = 1Útag_shuttle_categoriesu   í™œì„± íƒœê·¸Útag_shuttle_tagsu   ì‚¬ìš©ìž� ì €ìž¥ íƒœê·¸Útag_shuttle_my_tagsu   ëˆ„ì � ë³µì‚¬zCOALESCE(SUM(copy_count), 0)rM   u   í�´ë�¼ìš°ë“œ ì‹�ë¬¼ ë�°ì�´í„°Úplant_reminder_user_datau   í™œì„± ì‹�ë¬¼ í”„ë¦¬ì…‹Úplant_reminder_presetsu   í‘¸ì‹œ ë°œì†¡ ê¸°ë¡�Úplant_reminder_push_historyrN   u   ìƒ�ì„± ëª…í•¨Úbusiness_cardsu   ì „ìž�ì„œëª…Úelectronic_signaturesu   ëª…í•¨ ìƒ�ì„± ê¸°ê¸°u   í™œì„± í…œí”Œë¦¿Únamed_card_templatesu   ì¦�ê±° ê¸°ë¡�Úevidence_note_recordsu   PDF ë‚´ë³´ë‚´ê¸°Úevidence_note_pdf_exportsu   ì²¨ë¶€ ì—…ë¡œë“œÚ evidence_note_attachment_uploadsu   ì—…ë¡œë“œ ì™„ë£Œu   ì „ì²´ ëŸ¬ë‹�Úghost_running_runsu   ì™„ë£Œ ëŸ¬ë‹�u   ìƒ�ì„± ê³ ìŠ¤íŠ¸Úghost_running_ghostsu   ëˆ„ì � ê±°ë¦¬zCOALESCE(SUM(distance_m), 0)ÚdistancerS   u   í™œì„± ê´‘ê³  ìœ í˜•z=MAX(banner_enabled + interstitial_enabled + rewarded_enabled)u   ì�¼ê¸° ìž‘ì„±Ú
created_atu   ëŒ“ê¸€ ìž‘ì„±u   ê²Œìž„ í”Œë ˆì�´u   ê²Œìž„ ìƒ�ì„±u   í”„ë¦¬ë¯¸ì—„ êµ¬ë§¤r7   u   ì§ˆë¬¸ ì¹´ë“œ ë“±ë¡�u   ì§ˆë¬¸ ì„¸íŠ¸ ë“±ë¡�u   ê²°ì œ ì™„ë£ŒÚtapcounter_purchasesÚ
updated_atu	   QR ìƒ�ì„±u   ì•½ì†� ìƒ�ì„±u   ì�‘ë‹µ ì œì¶œÚsubmitted_atu   êµ¬ë§¤ ë“±ë¡�Úpurchase_timeu   ë�¼ë©´ ë“±ë¡�u   íƒœê·¸ ì €ìž¥u   íƒœê·¸ ë“±ë¡�u   ì‹�ë¬¼ ë�°ì�´í„° ì €ìž¥u   í‘¸ì‹œ ë°œì†¡u   ëª…í•¨ ìƒ�ì„±u   ì „ìž�ì„œëª… ìƒ�ì„±u   ëŸ¬ë‹� ê¸°ë¡�u   ì‹¤ì‹œê°„ ì„¸ì…˜Úghost_running_live_sessionsÚbabynote_purchases)Ú	completedÚcalmoa_purchases)r’   ÚrestoredÚonetakeduo_purchases)r9   r<   rA   rC   Úapp_inquiriesÚinquiryuâ  
            SELECT id AS event_id, app_name AS app_key, subject AS title,
                   content AS detail,
                   COALESCE(NULLIF(user_name, ''), NULLIF(user_email, ''), NULLIF(user_id, ''), 'ì�µëª…') AS actor,
                   NULL AS amount, NULL AS currency, NULL AS platform,
                   status, created_at AS event_time
            FROM app_inquiries
            WHERE created_at > %s AND created_at <= %s
            ORDER BY created_at ASC
        )r)   ÚsourceÚ
event_typeÚsqlÚpurchaseaý  
            SELECT id AS event_id, 'babynote' AS app_key, product_id AS title,
                   product_type AS detail, user_id AS actor,
                   price AS amount, currency, platform, status,
                   COALESCE(purchased_at, created_at) AS event_time
            FROM babynote_purchases
            WHERE status = 'completed'
              AND COALESCE(purchased_at, created_at) > %s
              AND COALESCE(purchased_at, created_at) <= %s
            ORDER BY event_time ASC
        a  
            SELECT id AS event_id, 'tapcounter' AS app_key, product_id AS title,
                   product_type AS detail, user_id AS actor,
                   price AS amount, currency, platform, status,
                   COALESCE(purchased_at, created_at) AS event_time
            FROM tapcounter_purchases
            WHERE status = 'completed'
              AND COALESCE(purchased_at, created_at) > %s
              AND COALESCE(purchased_at, created_at) <= %s
            ORDER BY event_time ASC
        a
  
            SELECT id AS event_id, 'calmoa' AS app_key, product_id AS title,
                   NULL AS detail, COALESCE(user_id, device_serial) AS actor,
                   price AS amount, currency, platform, status,
                   COALESCE(purchased_at, created_at) AS event_time
            FROM calmoa_purchases
            WHERE status = 'completed'
              AND COALESCE(purchased_at, created_at) > %s
              AND COALESCE(purchased_at, created_at) <= %s
            ORDER BY event_time ASC
        a8  
            SELECT id AS event_id, 'onetakeduo' AS app_key, product_id AS title,
                   NULL AS detail, COALESCE(user_id, guest_serial) AS actor,
                   price AS amount, currency, platform, status,
                   COALESCE(verified_at, purchased_at, created_at) AS event_time
            FROM onetakeduo_purchases
            WHERE status = 'completed'
              AND COALESCE(verified_at, purchased_at, created_at) > %s
              AND COALESCE(verified_at, purchased_at, created_at) <= %s
            ORDER BY event_time ASC
        u   
            SELECT id AS event_id, 'chromakey' AS app_key, product_id AS title,
                   'ê´‘ê³  ì œê±° í™œì„±í™”' AS detail, device_id AS actor,
                   NULL AS amount, NULL AS currency, platform, 'completed' AS status,
                   COALESCE(purchase_time, created_at) AS event_time
            FROM chromakey_purchases
            WHERE is_active = 1
              AND COALESCE(purchase_time, created_at) > %s
              AND COALESCE(purchase_time, created_at) <= %s
            ORDER BY event_time ASC
        uO  
            SELECT id AS event_id, 'balancepick' AS app_key, product_id AS title,
                   'lifetime í”„ë¦¬ë¯¸ì—„' AS detail, device_serial AS actor,
                   NULL AS amount, NULL AS currency, platform, status,
                   purchased_at AS event_time
            FROM balancepick_purchases
            WHERE status = 'completed'
              AND verified_at IS NOT NULL
              AND purchase_state = 0
              AND is_test_purchase = 0
              AND purchased_at > %s
              AND purchased_at <= %s
            ORDER BY event_time ASC
        Ú babynote_kidsnote_payment_ordersu(  
            SELECT id AS event_id, 'babynote' AS app_key, order_name AS title,
                   'í‚¤ì¦ˆë…¸íŠ¸ í�¬í† ë¶�' AS detail, user_id AS actor,
                   total_price AS amount, 'KRW' AS currency, 'toss' AS platform,
                   status, COALESCE(approved_at, created_at) AS event_time
            FROM babynote_kidsnote_payment_orders
            WHERE status = 'paid'
              AND COALESCE(approved_at, created_at) > %s
              AND COALESCE(approved_at, created_at) <= %s
            ORDER BY event_time ASC
        c                   C   s   dd„ t  ¡ D ƒS )Nc                 S   s   g | ]	\}}||d œ‘qS ))Úkeyr(   r   )Ú.0r�   r(   r   r   r   Ú
<listcomp>È  s    zlist_apps.<locals>.<listcomp>)Ú
APP_LABELSÚitemsr   r   r   r   Ú	list_appsÇ  s   r¢   r   c                 C   sŽ   t | pdƒ ¡  ¡ }|sd S |tv r|S | dd¡ dd¡ dd¡}t ¡ D ]\}}|| dd¡ dd¡ ¡ | dd¡ ¡ hv rD|  S q&d S )Nr   Ú Ú_Ú-)r   r   Úlowerr    Úreplacer¡   )r   Ú
normalizedÚcompactr�   r(   r   r   r   Úresolve_app_keyË  s   þürª   Úapp_keyc                 C   sf   dg}| t v r| d¡ t | ¡st | ¡r| d¡ | tv s#| dv r(| d¡ | tv r1| d¡ |S )N)Úoverviewõ   ìš”ì•½)Úusersõ	   ì‚¬ìš©ìž�)Úactivityõ   í•µì‹¬ í™œë�™>   rB   r:   )Ú	purchasesõ   ê²°ì œ)Ú	inquiriesõ   ë¬¸ì�˜)ÚUSER_APP_NAMESÚappendÚCORE_METRICSr   Ú
ACTIVITIESÚ	PURCHASESÚINQUIRY_APPS)r«   Ú
categoriesr   r   r   Úapp_stat_categoriesÛ  s   



r½   c              	   C   st   t | tƒr	t| ƒ} t | tƒrt| ƒS t | ttfƒr| S zt| p dƒ}| ¡ r+t|ƒW S |W S  ttfy9   Y dS w ©Nr   )Ú
isinstancer   ÚfloatÚboolÚintÚ
is_integerÚ	TypeErrorÚ
ValueError)r   Úparsedr   r   r   Ú_numberè  s   

ÿrÇ   c                 C   s:   t | ƒ}t|tƒr| ¡ s|d› d¡ d¡S t|ƒd›S )Nú,.2fÚ0Ú.ú,)rÇ   r¿   rÀ   rÃ   ÚrstriprÂ   )r   r-   r   r   r   Ú_format_numberö  s   rÍ   r-   r.   c                 C   s\   |dkrt | pdƒ}| ¡ dv rdS | ¡ dkrdS |S |dkr*t| ƒd d	›d
�S t| ƒS )Nrj   r¥   >   ÚreleaseÚ
productionu	   ë¦´ë¦¬ì¦ˆÚtestu	   í…ŒìŠ¤íŠ¸rŠ   iè  z,.1fÚkm)r   r¦   rÇ   rÍ   )r   r.   rj   r   r   r   Ú_format_metric_valueý  s   rÒ   ÚamountÚcurrencyc                 C   s<   t |pdƒ ¡ }t| ƒ}|dkrd|d›�S |› d|d›�S )NÚKRWu   â‚©z,.0fr£   rÈ   )r   ÚupperrÇ   )rÓ   rÔ   Úcoder   r   r   r   Ú_format_currency
  s
   rØ   é  Úlimitc                 C   s<   d  t| pdƒ ¡ ¡}t|ƒ|kr|S |d |d … › d�S )Nr£   r   é   u   â€¦)Újoinr   ÚsplitÚlen)r   rÚ   rj   r   r   r   Ú_short  s   rß   Úeventc                 C   sº  t |  d¡pdƒ}t ||pd¡}|  d¡dkrgd ddd	|  d
¡› �dt|  d¡dƒp-d› �dt|  d¡dƒp9d› �dt|  d¡dƒpEd› �dt|  d¡dƒpQd› �dt|  d¡|  d¡ƒ› �dt› �g	¡S |  d¡dk�r1|  d¡dk}ddd d!d"d#d$d%d&œ}|r…d'nd(dd)t|  d¡d*ƒp‘d› �d+t|  d¡|  d¡ƒ› �d,t|  d¡dƒpªd› �d-| |  d.¡d/¡› �g}d0 d1d2„ t |  d3¡pÅdƒ ¡ |  d4¡rÕd5|  d4¡› �ndfD ƒ¡}|rå| d6|› �¡ |�st|  d¡d7ƒ}t|  d8¡dƒ}| d9|�p|�pd:› �¡ |�r||v�r| d;|› �¡ | 	d<t|  d=¡dƒ�p#d› �dt
› �g¡ d |¡S |  d¡d>k�rÅ|  d?¡d@k}	|	�rEdAndBdd,t|  d¡dƒ�pRd› �dC|	�rZdDndE› �g}d0 dFd2„ t |  d3¡�pldƒ ¡ |  d4¡�r}d5|  d4¡› �ndfD ƒ¡}|�r�| dG|› �¡ n)|  dH¡�r¤| dGt|  dH¡dƒ› �¡ n|  dI¡�r¸| dGt|  dI¡dJƒ› �¡ | dt
› �¡ d |¡S |  d¡dKk�r¡|  d¡dLk}|�oÝt|  dM¡ƒ}
|
�rädN}n|  d.¡dOk�rô|�rñdPndQ}n|�rùdRndS}|dd)t|  d¡d*ƒ�pd› �d+t|  d¡|  d¡ƒ› �d,t|  d¡dƒ�p"d› �g}d0 dTd2„ t |  d3¡�p3dƒ ¡ |  d4¡�rDd5|  d4¡› �ndfD ƒ¡}|�rU| dG|› �¡ |�s†t|  d¡d7ƒ}t|  d8¡dƒ}| d9|�pr|�prdU› �¡ |�r†||v�r†| d;|› �¡ | 	dVt|  dW¡dƒ�p“d› �dt
› �g¡ d |¡S |  d¡dXk�rãdYdZ|› �d[t|  d¡d*ƒ�p¹d› �d\t|  d¡dƒ�pÆd]› �d^t|  d¡ƒ�pÒd› �dt› d_|› d`�g}d |¡S dadZ|› �d)t|  d¡d*ƒ�pód› �g}|  d¡d u�r| d+t|  d¡|  d¡ƒ› �¡ |  db¡�r$| dct | db ƒ ¡ › �¡ |  d¡�r8| d,t|  d¡dƒ› �¡ |  d¡�rL| ddt|  d¡d*ƒ› �¡ | dt› d_|› de�¡ d |¡S )fNr«   r   u   ì•Œ ìˆ˜ ì—†ëŠ” ì•±r™   Údomain_assistanceÚ
u'   [ë�„ë©”ì�¸ ì—°ê²° ì„¤ì • ëŒ€í–‰ ì‹ ì²­]u   ì„œë¹„ìŠ¤: ì˜¤í”¼ì…œë©”ì�¼u   ì‹ ì²­ ë²ˆí˜¸: #Úevent_idu   ë�„ë©”ì�¸: Útitleéý   r¥   u   ì‹ ì²­ìž�: Úactoré¿   u   ë�„ë©”ì�¸ êµ¬ë§¤ì²˜: ÚdetailéP   u   ì™„ë£Œ ì•Œë¦¼: Únotification_emailu   ì™„ë£Œ í›„ ê²°ì œ ì˜ˆì •: rÓ   rÔ   u   ê´€ë¦¬: Úpolar_paymentÚstatusÚ	succeededu   ìµœì´ˆ ê²°ì œu   êµ¬ë�… ì‹œìž‘u   ì •ê¸° ê°±ì‹ u   êµ¬ë�… ë³€ê²½u   ìž�ë�™ ìž¬ì‹œë�„u   ê³ ê°� ìž¬ì‹œë�„u!   ê²°ì œìˆ˜ë‹¨ ë³€ê²½ í›„ ìž¬ì‹œë�„u   ê´€ë¦¬ìž� ìž¬ì‹œë�„)r›   Úsubscription_createÚsubscription_cycleÚsubscription_updateÚretry_dunningÚretry_customerÚretry_payment_method_updateÚretry_adminu   [í•´ì™¸ ê²°ì œ ì™„ë£Œ]u   [í•´ì™¸ ê²°ì œ ì‹¤íŒ¨]u   ìƒ�í’ˆ: éx   u   ê¸ˆì•¡: u   ì‚¬ìš©ìž�: u   ê²°ì œ ìœ í˜•: Úpayment_triggeru   í•´ì™¸ ê²°ì œr£   c                 s   ó   � | ]}|r|V  qd S ©Nr   ©rž   r   r   r   r   Ú	<genexpr>?  ó   € ø
ÿz+format_app_event_message.<locals>.<genexpr>Ú
card_brandÚcard_last_fouru   â€¢â€¢â€¢â€¢ u   ì¹´ë“œ: éÜ   Údecline_reasonu   ì‹¤íŒ¨ ì‚¬ìœ : u    Polarì—�ì„œ ì‚¬ìœ  í™•ì�¸ í•„ìš”u   ì˜¤ë¥˜ ì½”ë“œ: u   ê²°ì œ ID: Úpolar_payment_idÚpayment_method_registeredÚregionÚoverseasu7   [í•´ì™¸ ê²°ì œìˆ˜ë‹¨ ë“±ë¡� ë°� ì •ê¸°ê²°ì œ í™œì„±í™”]u#   [êµ­ë‚´ ê²°ì œìˆ˜ë‹¨ ë“±ë¡� ì™„ë£Œ]u   ì œê³µìž�: ÚPolarzToss Payc                 s   r÷   rø   r   rù   r   r   r   rú   e  rû   u   ê²°ì œìˆ˜ë‹¨: Úaccount_bank_nameÚpayment_methodé    Útoss_paymentÚsuccessÚis_initial_subscription_chargeu   [êµ­ë‚´ ì •ê¸°ê²°ì œ í™œì„±í™”]Úcycleu   [êµ­ë‚´ ì •ê¸°ê²°ì œ ì™„ë£Œ]u   [êµ­ë‚´ ì •ê¸°ê²°ì œ ì‹¤íŒ¨]u   [êµ­ë‚´ ê²°ì œ ì™„ë£Œ]u   [êµ­ë‚´ ê²°ì œ ì‹¤íŒ¨]c                 s   r÷   rø   r   rù   r   r   r   rú   ‘  rû   u#   Toss Payì—�ì„œ ì‚¬ìœ  í™•ì�¸ í•„ìš”u   ì£¼ë¬¸ë²ˆí˜¸: Ú
payment_idr—   u   [ìƒˆ ë¬¸ì�˜]u   ì•±: u   ì œëª©: u   ìž‘ì„±ìž�: u   ì�µëª…u   ë‚´ìš©: ú/app/z
/inquiriesu   [ê²°ì œ ì™„ë£Œ]Úplatformu   í”Œëž«í�¼: u   ìƒ�ì„¸: z
/dashboard)r   r   r    rÜ   rß   rØ   r$   rÖ   r·   Úextendr%   rÁ   r"   )rà   r«   Ú	app_labelrí   Útrigger_labelsÚlinesÚ
card_labelÚdeclineÚreasonr  Úinitial_activationÚheadingr   r   r   Úformat_app_event_message  s   ÷ÿø
ú
ÿüþ
þÿ
ÿø

ÿüþ
ÿÿ
ÿÿû
ÿüþ
ÿþÿ
ú
ý"
r  ÚcategoryÚdatac                 C   s   t  | | ¡}ddddddœ}d|› d| |d	¡› d
�g}|dkre| d¡s,| d¡ �n¸| dt| d¡ƒ› d�dt| d¡ƒ› d�dt| d¡ƒ› d�dt| d¡ƒ› d�dt| d¡ƒ› d�g¡ �n|dkr¤| d¡pog }| d¡pvg }|rˆ| d¡ | dd„ |D ƒ¡ |r™| d¡ | d d„ |D ƒ¡ |s¢|s¢| d!¡ �n@|d"k�r| d#¡sµ| d$¡ �n/| d%t| d¡ƒ› d&�d't| d(¡ƒ› d&�d)t| d*¡ƒ› d&�d+t| d,¡ƒ› d&�g¡ | d-¡rÿ| d.¡píg }|rÿ| d/d0 d1d„ |D ƒ¡ ¡ | d2¡�r| d3d„ |d2 D ƒ¡ nÒ|d4k�rQ| d#¡�s#| d5¡ nÁ| d6t| d¡ƒ› d&�d7t| d8¡ƒ› d&�d9t| d*¡ƒ› d&�d:t| d,¡ƒ› d&�g¡ n“| d¡�pXi }	|	 d¡�r�| dt|	 d¡ƒ› d�d;t|	 d¡ƒ› d<t|	 d¡ƒ› d�g¡ n| d=¡ | d¡�p�g d d>… D ]}
| |
d? › d@t|
 dA¡|
 dBdC¡ƒ› �¡ �q’| d"¡�p³i }| d#¡�rÈ| d't| d(¡ƒ› d&�¡ | d4¡�pÏi }| d#¡�rä| d7t| d8¡ƒ› d&�¡ |d4k�rëd4ndD}| dEt› dF| › dG|› �¡ dH |¡S )INr­   r¯   r±   r³   rµ   )r¬   r®   r°   r²   r´   ú[u    Â· u   í†µê³„ú]r®   Útrackedu?   ë¡œê·¸ì�¸ ì‚¬ìš©ìž� ì¶”ì �ì�„ ì‚¬ìš©í•˜ì§€ ì•ŠëŠ” ì•±ìž…ë‹ˆë‹¤.u   ì „ì²´ ì‚¬ìš©ìž�: Útotalu   ëª…u   ì˜¤ëŠ˜ ê°€ìž…: Ú	new_todayu   ìµœê·¼ 7ì�¼ ê°€ìž…: Únew_7du   ì˜¤ëŠ˜ ì ‘ì†�: Úactive_todayu   ìµœê·¼ 7ì�¼ ì ‘ì†�: Ú	active_7dr°   ÚmetricsÚtrendsu   
í˜„ìž¬ ëˆ„ì �c              
   s   s8   � | ]}d |d › dt | d¡| dd¡ƒ› �V  qdS )õ   â€¢ r(   ú: r   Úformatr-   N)rÒ   r   ©rž   Úitemr   r   r   rú   æ  s
   € &ÿ
ÿz+format_app_stats_message.<locals>.<genexpr>u   
ìµœê·¼ 7ì�¼c                 s   s0   � | ]}d |d › dt | d¡ƒ› d�V  qdS ©r%  r(   r&  r   õ   ê±´N)rÍ   r   r(  r   r   r   rú   ì  s
   € ÿ
ÿu2   ì—°ê²°ë�œ ì„œë²„ í™œë�™ ë�°ì�´í„°ê°€ ì—†ìŠµë‹ˆë‹¤.r²   Ú	supportedu?   ì„œë²„ì—� ê¸°ë¡�ë�˜ëŠ” ê²°ì œ ë�°ì�´í„°ê°€ ì—†ëŠ” ì•±ìž…ë‹ˆë‹¤.u   ì „ì²´ ê²°ì œ ê¸°ë¡�: r+  u   ê²°ì œ ì™„ë£Œ: Úpaidu   ì˜¤ëŠ˜ ê²°ì œ: Útodayu   ìµœê·¼ 7ì�¼ ê²°ì œ: Úlast_7dÚhas_revenueÚrevenue_by_currencyu   ëˆ„ì � ê²°ì œ ê¸ˆì•¡: ú, c                 s   s&   � | ]}t | d ¡| d¡ƒV  qdS )rÓ   rÔ   N)rØ   r   r(  r   r   r   rú     s
   € ÿ
ÿÚextrac                 s   s.   � | ]}d |d › dt |d ƒ› d�V  qdS r*  )rÍ   r(  r   r   r   rú   	  s   €, r´   u2   ë¬¸ì�˜ ê¸°ëŠ¥ì�„ ì œê³µí•˜ì§€ ì•ŠëŠ” ì•±ìž…ë‹ˆë‹¤.u   ì „ì²´ ë¬¸ì�˜: u   ë¯¸ì²˜ë¦¬ ë¬¸ì�˜: Úopenu   ì˜¤ëŠ˜ ë¬¸ì�˜: u   ìµœê·¼ 7ì�¼ ë¬¸ì�˜: u   ìµœê·¼ 7ì�¼ ê°€ìž…/ì ‘ì†�: u   ëª… / u-   ì‚¬ìš©ìž�: ë¡œê·¸ì�¸ ì‚¬ìš©ìž� ì¶”ì � ì•ˆ í•¨é   r(   r&  r   r'  r-   Ú	dashboardu	   
ê´€ë¦¬: r  r#   râ   )r    r   r·   r  rÍ   rÜ   rÒ   r"   )r«   r  r  r  Útitle_by_categoryr  r#  r$  Ú
currenciesr®   r)  r²   r´   Ú
admin_pager   r   r   Úformat_app_stats_messageÉ  s²   û
ûÿ	

þ

þ
€

üÿ

þÿÿ€
üÿ	$þÿ
$ÿ
r:  c                
   @   sP  e Zd Zd(dd„Zd(dd„Zd(dd„Zd(d	d
„Zdefdd„Zde	de
fdd„Zd)de	deedf deee	ef  fdd„Zd)de	deedf dee	ef fdd„Zde	dee	ef fdd„Zde	dee	ef fdd„Zde	dee	ef fdd„Zde	dee	ef fdd „Zde	d!e	dee	ef fd"d#„Zd$ed%edeee	ef  fd&d'„ZdS )*ÚAppMasterServicer
   Nc                 C   s   d | _ tƒ | _d S rø   )Ú_poolÚsetÚ_available_tables©Úselfr   r   r   Ú__init__2  s   zAppMasterService.__init__c                 Ã   sz   �| j rd S ztjdddddœt¤ŽI d H | _ |  ¡ I d H  W n ty.   |  ¡ I d H  ‚ w t dtd t	| j
ƒ¡ d S )NrÛ   r5  é   )ÚminsizeÚmaxsizeÚconnect_timeoutz'App Master DB connected: %s (%d tables)r   r   )r<  ÚaiomysqlÚcreate_poolÚAPP_MASTER_DB_CONFIGÚrefresh_schemaÚ	ExceptionÚcloseÚloggerÚinforÞ   r>  r?  r   r   r   Ú
initialize6  s*   €ýüþýzAppMasterService.initializec                 Ã   s6   �| j r| j  ¡  | j  ¡ I d H  d | _ | j ¡  d S rø   )r<  rK  Úwait_closedr>  Úclearr?  r   r   r   rK  J  s   €
zAppMasterService.closec                 Ã   s.   �|   dtd f¡I d H }dd„ |D ƒ| _d S )NzVSELECT TABLE_NAME AS table_name FROM information_schema.tables WHERE table_schema = %sr   c                 S   s8   h | ]}|  d ¡s|  d¡rt|  d ¡p|  d¡ƒ’qS )Ú
table_nameÚ
TABLE_NAME)r   r   )rž   Úrowr   r   r   Ú	<setcomp>V  s    ýýÿz2AppMasterService.refresh_schema.<locals>.<setcomp>)Ú
_fetch_allrH  r>  )r@  Úrowsr   r   r   rI  Q  s   €
þþzAppMasterService.refresh_schemac                 Ã   s   �|   d¡I d H }|d S )NzSELECT NOW() AS valuer   )Ú
_fetch_one)r@  rS  r   r   r   Údatabase_now\  s   €zAppMasterService.database_nowr)   c                 C   s
   || j v S rø   )r>  )r@  r)   r   r   r   Ú	has_table`  s   
zAppMasterService.has_tabler   rš   Úparams.c              
   Ã   sÌ   �| j stdƒ‚| j  ¡ 4 I d H šH}| tj¡4 I d H š'}| ||¡I d H  t| ¡ I d H ƒW  d   ƒI d H  W  d   ƒI d H  S 1 I d H sIw   Y  W d   ƒI d H  d S 1 I d H s_w   Y  d S )Nz App Master DB is not initialized)	r<  ÚRuntimeErrorÚacquireÚcursorrF  Ú
DictCursorÚexecuteÚlistÚfetchall)r@  rš   rZ  ÚconnÚcurr   r   r   rU  c  s   €þÿ.ÿzAppMasterService._fetch_allc                 Ã   s$   �|   ||¡I d H }|r|d S i S r¾   )rU  )r@  rš   rZ  rV  r   r   r   rW  k  s   €zAppMasterService._fetch_oner«   c              	   Ã   sz   �t  |¡}|r|  d¡sddiS |  d|f¡I d H }dt| d¡ƒt| d¡ƒt| d¡ƒt| d	¡ƒt| d
¡ƒdœS )Nr®   r  Fa  
            SELECT
              COUNT(*) AS total,
              SUM(CASE WHEN created_at >= CURDATE() THEN 1 ELSE 0 END) AS new_today,
              SUM(CASE WHEN created_at >= CURDATE() - INTERVAL 6 DAY THEN 1 ELSE 0 END) AS new_7d,
              SUM(CASE WHEN last_login_at >= CURDATE() THEN 1 ELSE 0 END) AS active_today,
              SUM(CASE WHEN last_login_at >= CURDATE() - INTERVAL 6 DAY THEN 1 ELSE 0 END) AS active_7d
            FROM users
            WHERE app_name = %s AND (is_del = 0 OR is_del IS NULL)
            Tr  r  r   r!  r"  )r  r  r  r   r!  r"  )r¶   r   rY  rW  rÇ   )r@  r«   Úapp_namerS  r   r   r   Ú
user_statso  s   €


õúzAppMasterService.user_statsc              	   Ã   s  �g }t  |g ¡D ]5}|  |j¡sq	|jrd|j› �nd}|  d|j› d|j› d|› �¡I d H }| |j| d¡|j	dœ¡ q	g }t
 |g ¡D ]:}|  |j¡sPqGd|j› d�g}|jra| |j¡ |  d	|j› d
d |¡› �¡I d H }| |jt| d¡ƒdœ¡ qG||dœS )Nz WHERE r   zSELECT z AS value FROM `ú`r   )r(   r   r'  z` >= CURDATE() - INTERVAL 6 DAYzSELECT COUNT(*) AS value FROM `z` WHERE z AND ©r(   r   )r#  r$  )r¸   r   rY  r)   r,   rW  r+   r·   r(   r.   r¹   r4   rÜ   rÇ   )r@  r«   r#  r)  Ú	where_sqlrS  r$  Ú
conditionsr   r   r   Ú
core_stats‰  s6   €
ÿýÿ
ÿ
zAppMasterService.core_statsc                 Ã   sh   �|t vs
|  d¡sddiS |  d|f¡I d H }dt| d¡ƒt| d¡ƒt| d¡ƒt| d	¡ƒd
œS )Nr–   r,  Fa—  
            SELECT
              COUNT(*) AS total,
              SUM(CASE WHEN status IN ('pending', 'in_progress') THEN 1 ELSE 0 END) AS open_count,
              SUM(CASE WHEN created_at >= CURDATE() THEN 1 ELSE 0 END) AS today,
              SUM(CASE WHEN created_at >= CURDATE() - INTERVAL 6 DAY THEN 1 ELSE 0 END) AS last_7d
            FROM app_inquiries
            WHERE app_name = %s
            Tr  Ú
open_countr.  r/  )r,  r  r4  r.  r/  )r»   rY  rW  rÇ   r   )r@  r«   rS  r   r   r   Úinquiry_stats§  s   €	
öûzAppMasterService.inquiry_statsc                 Ã   sº  �|dkr3|   d¡sddiS |  d¡I d H }dt| d¡ƒt| d¡ƒt| d	¡ƒt| d
¡ƒddœS |dkre|   d¡s@ddiS |  d¡I d H }dt| d¡ƒt| d¡ƒt| d	¡ƒt| d
¡ƒddœS t |¡}|rr|   |j¡svddiS d dgt|jƒ ¡}t	|jƒd }|  d|› d|› d|j
› d|› d|j
› d|j› d�|¡I d H }|  d|j› d|› d�|j¡I d H }dt| d¡ƒt| d¡ƒt| d	¡ƒt| d
¡ƒd|dœ}|dk�r[|   d¡�r[|  d¡I d H }t| d¡ƒ}	|d  |	7  < |d  |	7  < |d	  t| d	¡ƒ7  < |d
  t| d
¡ƒ7  < d |	d!œg|d"< t| d#¡ƒ�r[td$d%„ |d& D ƒd ƒ}
|
�rLt|
 d'¡ƒt| d#¡ƒ |
d'< |S |d&  d(t| d#¡ƒd)œ¡ |S )*Nr:   re   r,  Fa=  
                SELECT
                  COUNT(*) AS total,
                  SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS paid,
                  SUM(CASE WHEN status = 'completed' AND purchased_at >= CURDATE() THEN 1 ELSE 0 END) AS today,
                  SUM(CASE WHEN status = 'completed' AND purchased_at >= CURDATE() - INTERVAL 6 DAY THEN 1 ELSE 0 END) AS last_7d
                FROM balancepick_purchases
                WHERE verified_at IS NOT NULL
                  AND purchase_state = 0
                  AND is_test_purchase = 0
                Tr  r-  r.  r/  )r,  r  r-  r.  r/  r0  rB   rs   a³  
                SELECT
                  COUNT(*) AS total,
                  SUM(CASE WHEN is_active = 1 AND (expiry_time IS NULL OR expiry_time > NOW()) THEN 1 ELSE 0 END) AS paid,
                  SUM(CASE WHEN purchase_time >= CURDATE() THEN 1 ELSE 0 END) AS today,
                  SUM(CASE WHEN purchase_time >= CURDATE() - INTERVAL 6 DAY THEN 1 ELSE 0 END) AS last_7d
                FROM chromakey_purchases
                r2  z%sé   z\
            SELECT
              COUNT(*) AS total,
              SUM(CASE WHEN status IN (zE) THEN 1 ELSE 0 END) AS paid,
              SUM(CASE WHEN status IN (z) AND `zS` >= CURDATE() THEN 1 ELSE 0 END) AS today,
              SUM(CASE WHEN status IN (zP` >= CURDATE() - INTERVAL 6 DAY THEN 1 ELSE 0 END) AS last_7d
            FROM `z`
            zŽ
            SELECT COALESCE(NULLIF(currency, ''), 'KRW') AS currency,
                   COALESCE(SUM(price), 0) AS amount
            FROM `z`
            WHERE status IN (zg)
            GROUP BY COALESCE(NULLIF(currency, ''), 'KRW')
            ORDER BY currency
            )r,  r  r-  r.  r/  r0  r1  r9   rœ   a¦  
                SELECT COUNT(*) AS paid_orders,
                       COALESCE(SUM(total_price), 0) AS revenue,
                       SUM(CASE WHEN approved_at >= CURDATE() THEN 1 ELSE 0 END) AS today,
                       SUM(CASE WHEN approved_at >= CURDATE() - INTERVAL 6 DAY THEN 1 ELSE 0 END) AS last_7d
                FROM babynote_kidsnote_payment_orders
                WHERE status = 'paid'
                Úpaid_ordersu   í�¬í† ë¶� ê²°ì œrg  r3  Úrevenuec                 s   s.   � | ]}t | d ¡pdƒ ¡ dkr|V  qdS )rÔ   r   rÕ   N)r   r   rÖ   r(  r   r   r   rú   '  s   € þýz2AppMasterService.purchase_stats.<locals>.<genexpr>r1  rÓ   rÕ   )rÔ   rÓ   )rY  rW  rÇ   r   rº   r)   rÜ   rÞ   r6   r8   r4   rU  Únextr·   )r@  r«   rS  ÚconfigÚstatus_placeholdersrZ  Úrevenue_rowsÚresultr3  rn  Úkrw_rowr   r   r   Úpurchase_stats¾  s¶   €

ÿú	

ÿú
	ýüüûûú
÷ýü
÷ù	
ÿ
ÿþú
ÿýÿzAppMasterService.purchase_statsr  c                 Ã   s¾   �|t vr	tdƒ‚|dkr|  |¡I d H S |dkr!|  |¡I d H S |dkr-|  |¡I d H S |dkr9|  |¡I d H S t |  |¡|  |¡|  |¡|  |¡¡I d H \}}}}|| dg ¡||dœS )Nu!   ì§€ì›�í•˜ì§€ ì•ŠëŠ” ì•±ìž…ë‹ˆë‹¤.r®   r°   r²   r´   r#  )r®   r#  r²   r´   )	r    rÅ   re  rj  rv  rl  ÚasyncioÚgatherr   )r@  r«   r  r®   Úcorer²   r´   r   r   r   Ústats8  s,   €ü
üzAppMasterService.statsÚstart_atÚend_atc              	   Ã   s¦   �g }t D ]C}|  |d ¡sq|  |d ||f¡I d H }|D ])}|d |d< |d |d< |d › d| d¡› d| d¡p=d› �|d	< | |¡ qq|jd
d„ d� |S )Nr)   rš   r˜   r™   ú:rã   rì   ÚnewÚ	event_keyc                 S   s   |   d¡ptjS )NÚ
event_time)r   r   Úmin)r)  r   r   r   Ú<lambda>]  s    z/AppMasterService.fetch_events.<locals>.<lambda>)r�   )ÚEVENT_SOURCESrY  rU  r   r·   Úsort)r@  r{  r|  Úeventsr˜   rV  rS  r   r   r   Úfetch_eventsP  s   €&ÿúzAppMasterService.fetch_events)r
   N)r   )r/   r0   r1   rA  rN  rK  rI  r   rX  r   rÁ   rY  r8   r   r`  ÚdictrU  rW  re  rj  rl  rv  rz  r†  r   r   r   r   r;  1  s    



,(z&r;  )r   )r-   )rÙ   )8rw  Úloggingr   Údataclassesr   r   Údecimalr   Útypingr   rF  Úpersistencer   Ú	getLoggerr/   rL  r   r   rÂ   rH  rÌ   r"   r$   r%   r'   r3   r5   r    r¶   r»   ÚAD_SETTING_TABLESr¸   r¡   Ú_app_keyÚ_tableÚ
setdefaultr·   r¹   rº   rƒ  r`  r‡  r¢   rª   r8   r½   rÀ   rÇ   rÍ   rÒ   rØ   rß   r  r:  r;  Úapp_master_servicer   r   r   r   Ú<module>   sö   
ù
þýþþÿþýüûúùø	÷
öõôóòñðïå÷õýÿüüúýíüüòè(ýØ-
ýÓ2üÎ8

üÈ>üÂDý¼Iý·N
ü²Tý¬Y
ü§_ü¡eü›mþýÿ

þÿ

üýû

þñÿí

þêæ

þåá þà$

þÜ(Ø)

þ×-

þÓ1

þÏ5

þË9
þÇ@
ü
üüüüüüüü�  $""  ,1h  
2