+
    jHàjFÖ  ã                  óÌ  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIHtHtHtHtHt ^ RIHt ^ RIHt ]! 4       t^xt]P.                  ! 4       tRsR]R&   ^ sR	R
RRRRRRRRR^ /tR]R&   ]P:                  ! R]P<                  4      t]P:                  ! R]P<                  4      t ]P:                  ! R]P<                  4      t!]P:                  ! R]P<                  4      t"]P:                  ! R4      t#. ER Ot$RRRRRRRR/R R llt%. ]%! RRR R!R"R#. EROR$7      N]%! R%R&R'R!R(R). EROR$7      N]%! R*R+R,R!R-R.. EROR$7      N]%! R/R0R1R!R2. EROR67      N]%! R7R8R9R!R:R;. EROR$7      N]%! R<R=R>R!R?R@. EROR$7      N]%! RARBRCR!RDRE. EROR$7      N]%! RFRGRHRIRJRK. EROR$7      N]%! RLRMRNRIRORP. EROR$7      N]%! RQRRRSRIRTRU. EROR$7      N]%! RVRWRXRIRYRZ. ER	OR[R\7      N]%! R]R^R_RIR`Ra. ER
OR[R\7      N]%! RbRcRdRIReERER.R67      N]%! RhRiRjRIRkERER.R67      N]%! RmRnRoRIRpRq. EROR[R\7      N]%! RrRsRtRIRuRv. EROR[R\7      N]%! RwRxRyRIRzR{. EROR[R\7      N]%! R|R}R~RR€R�. EROR$7      N]%! R‚RƒR„RR…R4. EROR$7      N]%! R†R‡RˆRR‰RŠ. EROR$7      N]%! R‹RŒR�RRŽR�. EROR$7      N]%! R�R‘R’RR“ERER.R67      N]%! R•R–R—RR˜R™. EROR$7      N]%! RšR›RœRR�ERER.R[RŸ7      N]%! R R¡R¢R£R¤R¥. EROR$7      N]%! R¦R§R¨R£R©Rª. ER
OR$7      N]%! R«R¬R­R£R®R¯. EROR$7      N]%! R°R±R²R£R³R´. EROR$7      N]%! RµR¶R·R£R¸R¹. EROR$7      N]%! RºR»R¼R£R½R¾. EROR$7      N]%! R¿RÀRÁR£RÂRÃ. EROR$7      N]%! RÄRÅRÆR£RÇRÈ. EROR[R\7      N]%! RÉRÊRËRÌRÍRÎ. EROR$7      N]%! RÏRÐRÑRÌRÒRÓ. EROR$7      N]%! RÔRÕRÖRÌR×RØ. EROR$7      N]%! RÙRÚRÛRÌRÜRÝ. EROR$7      N]%! RÞRßRàRáRâRã. EROR$7      N]%! RäRåRæRáRçRè. EROR$7      N]%! RéRêRëRáRìRí. EROR$7      N]%! RîRïRðRáRñRò. EROR$7      N]%! RóRôRõRáRöR÷. EROR$7      N]%! RøRùRúRûRüRý. EROR$7      N]%! RþRÿER RûERER. EROR$7      N]%! ERERERRûERER. EROR$7      N]%! ERER	ER
RûERER. EROR$7      N]%! ERERERRûERER. ER OR$7      N]%! ERERERRûRüER. ER!OR$7      N]%! ERERERRûRORý. EROR$7      N]%! ERERERRûRÒER. ER"OR$7      N]%! ERERERRûR×ER. ER"OR$7      N]%! ERER ER!RûRâER". ER#OR$7      N]%! ER#ER$ER%R£R×ER&. ER$OR$7      N]%! ER'ER(ER)R£RpER*. ER%OR$7      N]%! ER+ER,ER-RR:ER.. EROR$7      N]%! ER/ER0ER1RáR?ER2. ER&OR$7      N]%! ER3ER4ER5RáRñER6. ER'OR$7      N]%! ER7ER8ER9ER:ER;ER<. ER(OR$7      N]%! ER=ER>ER?ER:ER@ERA. ER
OR$7      N]%! ERBERCERDER:EREERF. ER
OR$7      N]%! ERGERHERIER:ERJERK. EROR[R\7      Nt&ERL]ERM&   ERNt'EROt(^t)ERP ERQ lt*ERR ERS lt+ERT ERU lt,ERV ERW lt-ERX ERY lt.ERZ ER[ lt/ER\ ER] lt0ER^ ER_ lt1ER` ERa lt2ERb ERc lt3ER)ERd ERe llt4ER)ERf ERg llt5ERh ERi lt6ERj ERk lt7ERl ERm lt8. ER*Ot9. ER+Ot:ERn ERo lt;ERp ERq lt<ERr ERs lt=ERt ERu lt>ERv ERw lt?ERx ERy lt@ERz ER{ ltAER| ER} ltB/ R#ER~bR.ERbR3ER€bR4ER�bR5ER‚bR�ERƒbRŠER„bR;ER…bR@ER†bREER‡bRKERˆbRPER‰bRUERŠbRZER‹bRaERŒbRfER�bRgERŽb/ RlER�bRqER�bRvER‘bR{ER’bR�ER“bR™ER”bR”ER•bRžER–bR¥ER—bRªER˜bR¯ER™bR´ERšbR¹ER›bR¾ERœbRÃER�bRÈERžbRØERŸbC/ RýER bERER¡bERER¢bERKER£bRÎER¤bRÓER¥bRÝER¦bR)ER§bRãER¨bRèER©bRíERªbRòER«bR÷ER¬bERER­bERER®bERER¯bERER°bCER±ER²ER"ER³ER&ER´ER*ERµER.ER¶ER2ER·ER6ER¸ER¹ERºER<ER»ERAER¼ERFER½/CtCER¾ ER¿ ltDERÀ ERÁ ltEERÂ ERÃ ltFERÄ^ ERÅ^ ERÆRERÇR/ERÈ ERÉ lltGER,ERÊ ERË lltHR#ERÌR.ERÍR�ERÎR3ERÏR4ERÐERÑERÒR5ERÓRŠERÔ/tIRKERÕR)ERÌRãERÏRÎERÒRÓERÖRèER×RíERØR;ERÙR@ERÚREERÛRÝRÝRòRòR÷R÷/tJ. RPNRUNRZNRaNRfNRgNRlNRqNRvNR{NR�NR™NR”NRžNR¥NRªNR¯NR´NR¹NR¾NRÃNRÈNRØNRýNERNERNERNERNER±NER&NER*NER.NER2NER6NER¹NERKNtKERÜ ERÝ ltLERÞ ERß ltMERà ERá ltNERâR/ERã ERä lltOER-ERå ERæ lltPRsQERç]ERè&   ]P.                  ! 4       tRERé ERê ltSERë ERì ltTER.ERí ERî lltUERï ERð ltVER/ERñ ERò lltW]P±                  ERó4      ERô 4       tY]P±                  ERõ4      ERö 4       tZ]P±                  ER÷4      ERø 4       t[]P±                  ERù4      ERú ERû l4       t\]P»                  ERü4      ERý 4       t^]P»                  ERþ4      ERÿ 4       t_R# (0  a]  Hermes Achievements dashboard plugin backend, mounted at /api/plugins/hermes-achievements/.

Scans the session history into per-session stats (checkpointed by fingerprint so warm
scans are cheap), aggregates them, and evaluates the tiered / multi-condition catalog.
Cold scans run on a background thread; ``/achievements`` serves the last snapshot.
)ÚannotationsN)ÚPath)ÚAnyÚDictÚListÚOptionalÚSet)Ú	APIRouter)Úget_hermes_homeúOptional[dict[str, Any]]Ú_SNAPSHOT_CACHEÚstateÚidleÚ
started_atÚfinished_atÚ
last_errorÚlast_duration_msÚ	run_countúdict[str, Any]Ú_SCAN_STATUSzv\b(error|failed|failure|traceback|exception|permission denied|not found|eaddrinuse|already in use|timed out|blocked)\bz^\b(port\s+)?(3000|5173|8000|8080|9119)\b.*\b(in use|already|taken|eaddrinuse)\b|\beaddrinuse\bz-\b(npm|pnpm|yarn|pip|uv)\b.*\b(install|add)\bzO\b(success|passed|built|compiled|done|exit_code[\"']?\s*[:=]\s*0|verified|ok)\bz[(?:/home/|~/?|\./|/mnt/)[\w./-]+\.(?:py|js|ts|tsx|jsx|css|html|md|json|yaml|yml|svg|sql|sh)ÚmetricÚtiersÚrequiresÚsecretFc               ó@   € V ^8„  d   QhRRRRRRRRRRRRR	R
RRRRRR/
# )é   ÚidÚstrÚnameÚdescriptionÚcategoryÚiconr   úOptional[str]r   zOptional[list[int]]r   zOptional[list[tuple]]r   ÚboolÚreturnr   © )Úformats   "ÚU/home/ubuntu/.hermes/hermes-agent/plugins/hermes-achievements/dashboard/plugin_api.pyÚ__annotate__r(   &   sd   € ÷ ñ ØðØðØ%(ðØ47ðØ?Bðàðà)<ðð $ðð 59ðð FTñó    c               ó:  € Ve   RMVP                  R4      '       d   RMRp	RV RVRVRVR	V	R
V/p
V'       d   RV
R&   Ve    V UUu. uF  w  r¼RVRV/NK  	  uppV
R&   V
# WZR&   \        \        V4       UUu. uF  w  rÞRVRV/NK  	  uppV
R&   V
# u uppi u uppi )zÄBuild one catalog entry. ``kind`` is derived: ``requires`` -> multi_condition; a
``max_*`` metric is a per-session best (best_session); anything else accumulates over
the whole history (lifetime).Úmulti_conditionÚmax_Úbest_sessionÚlifetimer   r   r   r    Úkindr!   Tr   r   ÚgteÚrequirementsÚthreshold_metricÚ	thresholdr   )Ú
startswithÚzipÚ
TIER_NAMES)r   r   r   r    r!   r   r   r   r   r/   ÚitemÚmr0   ÚnÚts   &&&&&$$$$      r'   Ú_achr;   &   sÖ   € ð !)Ò 4ÑÈV×M^ÑM^Ð_e×MfÒMf¹>Ðlv€DØ  " f¨d°MÀ;ÐPZÐ\dÐflÐnrÐtzð  }Að  B€DßØˆˆX‰ØÒÙHPÔQÉ¹f¸a ¨1¨e°SÓ 9ÉÒQˆˆ^Ñð €Kð $*ÐÑ ÜADÄZÐQVÔAWÔXÑAW¹¸˜& ! [°!Ó4ÑAWÒXˆˆW‰Ø€Kùó	  Rùó Ys   ÁBÁ7BÚlet_him_cookzLet Him Cookz>Let Hermes run a serious autonomous tool chain in one session.zAgent AutonomyÚflameÚmax_tool_calls_in_session)r   r   Úautonomous_avalanchezAutonomous AvalanchezEAccumulate a lifetime avalanche of Hermes tool calls across sessions.Ú	avalancheÚtotal_tool_callsÚtoolchain_maxxerzToolchain Maxxerz:Use a wide spread of distinct Hermes tools in one session.ÚnodesÚmax_distinct_tools_in_sessionÚ	full_sendz	Full SendzBTerminal, files, and web/browser all get involved in one real run.ÚrocketÚmax_terminal_calls_in_sessionÚmax_file_tool_calls_in_sessionÚ max_web_browser_calls_in_session)r   Úsubagent_commanderzSubagent Commanderz Coordinate delegated agent work.ÚbranchÚtotal_delegate_callsÚbackground_process_enjoyerzBackground Process EnjoyerzDStart or control enough long-running processes to deserve the title.ÚdaemonÚtotal_process_callsÚcron_necromancerzCron Necromancerz.Raise scheduled autonomous jobs from the dead.ÚclockÚtotal_cron_callsÚred_text_connoisseurzRed Text Connoisseurz9Encounter enough errors to develop a palate for red text.zDebugging ChaosÚwarningÚtotal_errorsÚstack_trace_sommelierzStack Trace Sommelierz/Taste tracebacks by the flight, not by the sip.ÚwineÚtraceback_eventsÚactually_read_the_logszActually Read The Logsz,Inspect logs repeatedly instead of guessing.ÚscrollÚlog_read_eventsÚport_3000_takenzPort 3000 Is TakenzGDiscover dev-server port conflict patterns enough times to become numb.ÚplugÚport_conflict_eventsT)r   r   r   Úpermission_denied_any_percentzPermission Denied Any%zSpeedrun into permission walls.ÚlockÚpermission_denied_eventsÚdependency_hell_touristzDependency Hell Touristz3Package installs fail, then somehow life continues.Úpackage_skullÚinstall_error_eventsÚinstall_success_eventsÚthe_fix_was_restartingzThe Fix Was Restarting Itz;Restart after enough error clusters to call it a technique.ÚrestartÚrestart_after_error_eventsÚforgot_the_env_varzForgot The Env VarzIAuth or configuration failed because an environment variable was missing.ÚkeyÚenv_var_error_eventsÚyaml_colon_incidentzYAML Colon Incidentz Configuration syntax bites back.ÚcolonÚyaml_error_eventsÚdocker_name_collisionzDocker Name Collisionz3A container name already exists. Of course it does.Ú	containerÚdocker_conflict_eventsÚsupposed_to_be_quickzThis Was Supposed To Be Quickz(A tiny ask becomes an entire expedition.zVibe CodingÚmelting_clockÚmax_messages_in_sessionÚone_more_small_changezOne More Small ChangezLMake enough file edits in one session to invalidate the phrase small change.ÚpencilÚvibe_architectzVibe Architectz2Touch a broad surface area in one project session.Ú	blueprintÚmax_files_touched_in_sessionÚpixel_goblinzPixel Goblinz2Do sustained frontend, CSS, SVG, or visual tuning.ÚpixelÚfrontend_activity_eventsÚship_first_ask_laterzShip First, Ask Laterz(Git activity after a serious tool chain.ÚshipÚ
git_eventsÚcss_exorcistzCSS Exorcistz2Cast repeated styling demons out of the interface.Úspark_cursorÚcss_activity_eventsÚone_character_fixzOne Character Fixz7A tiny edit after a pile of errors. Painful. Beautiful.ÚneedleÚtiny_patch_after_errors_events)r   r   Ú
skillsmithÚ
Skillsmithz5Work with Hermes skills enough to leave fingerprints.zHermes NativeÚhammer_scrollÚskill_eventsÚskill_issue_skill_createdzSkill Issue? Skill Created.zACreate or patch durable procedures instead of repeating yourself.ÚanvilÚskill_manage_eventsÚmemory_keeperzMemory Keeperz3Persist durable knowledge with memory or Mnemosyne.ÚcrystalÚmemory_eventsÚmemory_palacezMemory Palacez%Build a serious durable-memory trail.ÚpalaceÚmemory_write_eventsÚcontext_dragonzContext DragonzFBrush against compression, huge context, or token pressure repeatedly.ÚdragonÚcontext_eventsÚgateway_dwellerzGateway Dwellerz0Live through gateway-connected Hermes workflows.ÚantennaÚgateway_eventsÚplugin_goblinzPlugin Goblinz9Use or develop plugins enough that the dashboard notices.ÚpuzzleÚplugin_eventsÚrollback_wizardzRollback Wizardz*Invoke rollback/checkpoint recovery magic.ÚrewindÚrollback_eventsÚrabbit_hole_certifiedzRabbit Hole CertifiedzESearch or extract enough web content to qualify as a research spiral.zResearch/WebÚspiralÚtotal_web_callsÚcitation_goblinzCitation Goblinz4Extract enough web pages to become a tiny librarian.ÚquoteÚtotal_web_extract_callsÚdocs_archaeologistzDocs Archaeologistz0Dig through documentation sources over and over.ÚcompassÚdocs_activity_eventsÚbrowser_possessionzBrowser Possessionz0Possess a browser through automation repeatedly.ÚbrowserÚbrowser_callsÚterminal_goblinzTerminal Goblinz!Spend serious time in shell-land.zTool MasteryÚterminalÚtotal_terminal_callsÚpatch_wizardzPatch Wizardz.Bend files to your will with targeted patches.ÚwandÚtotal_patch_callsÚfile_archaeologistzFile Archaeologistz3Dig through the filesystem with reads and searches.ÚfolderÚtotal_file_reads_searchesÚimage_whispererzImage Whispererz<Use image generation or vision tools enough for visual work.ÚeyeÚimage_vision_callsÚvoice_of_the_machinezVoice Of The Machinez/Use text-to-speech or voice tooling repeatedly.ÚwaveÚ	tts_callsÚmodel_hopperzModel Hopperz>Switch or inspect providers/models enough to count as a habit.z
Model LoreÚswapÚmodel_eventsÚopenrouter_enjoyerzOpenRouter Enjoyerz/Route model work through OpenRouter repeatedly.ÚrouterÚopenrouter_eventsÚcodex_conjurerzCodex Conjurerz;Summon Codex-flavored assistance often enough for a ritual.ÚcodexÚcodex_eventsÚmulti_model_magezMulti-Model Magez@Use a real spread of distinct model names across Hermes history.ÚprismÚdistinct_model_countÚfive_model_flightzFive-Model FlightzQTry at least five distinct LLMs instead of marrying the first model that answers.Úprovider_polyglotzProvider Polyglotz9Use models from multiple providers across Hermes history.Údistinct_provider_countÚmodel_sommelierzModel SommelierzATaste enough model/provider conversations to develop preferences.Úclaude_confidantzClaude Confidantz=Bring Claude-flavored reasoning into the workflow repeatedly.Úclaude_eventsÚgemini_cartographerzGemini Cartographerz8Map enough Gemini-related workflows to know the terrain.Úgemini_eventsÚopen_weights_pilgrimzOpen Weights PilgrimzLActually chat with local/open-weight models through Hermes session metadata.Úlocal_model_chat_sessionsÚtoolset_cartographerzToolset CartographerzJNavigate Hermes toolsets deliberately instead of treating tools as a blur.Útoolset_eventsÚconfig_surgeonzConfig Surgeonz]Operate on real config files, manifests, env files, and dashboard settings without flinching.Úconfig_eventsÚrebase_acrobatzRebase AcrobatzFHandle real git history surgery: rebase, conflict, merge, fetch, push.Úgit_history_eventsÚtest_suite_tamerzTest Suite TamerzLRun enough verification commands that green text becomes part of the ritual.Útest_eventsÚscreenshot_hunterzScreenshot HunterzLCapture, inspect, and polish visual proof instead of just claiming it works.Úscreenshot_eventsÚmarathon_operatorzMarathon Operatorz/Accumulate a serious number of Hermes sessions.Ú	LifestyleÚmarathonÚsession_countÚweekend_warriorzWeekend Warriorz;Run Hermes on weekends enough times to make it a lifestyle.ÚcalendarÚweekend_sessionsÚnight_shift_operatorzNight Shift Operatorz-Run sessions during gremlin hours repeatedly.ÚmoonÚnight_sessionsÚcache_hit_appreciatorzCache Hit Appreciatorz-Notice or benefit from prompt/cache behavior.ÚcacheÚcache_eventsúlist[dict[str, Any]]ÚACHIEVEMENTSzscan_snapshot.jsonzscan_checkpoint.jsonc               ó   € V ^8„  d   QhRR/# )r   r$   r   r%   )r&   s   "r'   r(   r(   “   s   € ÷ ñ �4ñ r)   c                 óœ   €  ^ RI Hp  V ! R4      #   \         d1    \        4       R,          R,          pTP	                  RRR7       Tu # i ; i)zÙDurable data root (``<hermes home>/plugin-data/hermes-achievements/``). State used to
live in the install tree and died on ``hermes plugins remove``/``update``; legacy files
migrate on first read (see ``_data_file``).)Úplugin_data_dirúhermes-achievementszplugin-dataT©ÚparentsÚexist_ok)Úplugins.plugin_storagerë   Ú	Exceptionr
   Úmkdir)rë   Úroots     r'   Ú	_data_dirrô   “   sM   € ðÝ:ÙÐ4Ó5Ð5øÜô äÓ  =Õ0Ð3HÕHˆØ�
‰
˜4¨$ˆ
Ô/ØŠð	ús   ‚ �8AÁ
Ac               ó    € V ^8„  d   QhRRRR/# )r   r   r   r$   r   r%   )r&   s   "r'   r(   r(   ¡   s   € ÷ ñ �Sð ˜Tñ r)   c                ó2  € \        4       V ,          pVP                  4       '       g^   \        4       R ,          R,          V ,          pVP                  4       '       d)    VP                  RR7      pVP	                  VRR7       V# V#   \
         d     T# i ; i)Úpluginsrì   ú	utf-8-sig©Úencodingúutf-8)rô   Úexistsr
   Ú	read_textÚ
write_textrñ   )r   ÚpathÚlegacyÚlegacy_texts   &   r'   Ú
_data_filer  ¡   sŠ   € Ü‹;˜Õ€DØ�;‰;�=Š=Ü Ó" YÕ.Ð1FÕFÈÕMˆØ�=‰=�?Š?ðð %×.Ñ.¸Ð.ÓD�Ø—‘ °g�Ô>ð €Kˆ4€Køô ô ØØ€Kðús   Á%B ÂBÂBc               ó    € V ^8„  d   QhRRRR/# )r   r   r   r$   r   r%   )r&   s   "r'   r(   r(   °   s   € ÷ ñ �Sð ˜Sñ r)   c                óŠ   € \        V 4      p \        P                  ! VP                  RR7      4      #   \         d     R# i ; i)z6Parsed data file, or ``None`` when missing/unreadable.rø   rù   N)r  ÚjsonÚloadsrý   rñ   )r   rÿ   s   & r'   Ú
_read_jsonr  °   s=   € ä�dÓ€DðÜ�zŠz˜$Ÿ.™.°+˜.Ó>Ó?Ð?øÜô Úðús   �%3 ³AÁAc               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r   Údatar   r$   ÚNoner%   )r&   s   "r'   r(   r(   ¹   s&   € ÷ ^ñ ^�cð ^ ð ^¨ñ ^r)   c                ó¼   € \        V 4      pVP                  P                  R R R7       VP                  \        P
                  ! \        V4      ^R R7      RR7       R# )Trí   )ÚindentÚ	sort_keysrû   rù   N)r  Úparentrò   rþ   r  ÚdumpsÚ
_json_safe)r   r	  rÿ   s   && r'   Ú_write_jsonr  ¹   sF   € Ü�dÓ€DØ‡K�K×Ñ˜d¨TÐÔ2Ø‡O�O”D—J’Jœz¨$Ó/¸ÀTÔJÐU\€OÖ]r)   c               ó    € V ^8„  d   QhRRRR/# )r   Úvaluer   r$   r%   )r&   s   "r'   r(   r(   ¿   s   € ÷ ñ �cð ˜cñ r)   c                ób  € \        V \        4      '       d/   V P                  4        UUu/ uF  w  rV\        V4      bK  	  upp# \        V \        \
        34      '       d   V  Uu. uF  p\        V4      NK  	  up# \        V \        4      '       d   \        R  V  4       4      # V # u uppi u upi )c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5i©N)r  )Ú.0Úvs   & r'   Ú	<genexpr>Ú_json_safe.<locals>.<genexpr>Å   s   é € Ð3©U¨”j —m�m«Uùs   ‚)Ú
isinstanceÚdictÚitemsr  ÚlistÚtupleÚsetÚsorted)r  Úkr  s   &  r'   r  r  ¿   sŠ   € Ü�%œ×ÒØ-2¯[©[¬]Ô;©]¡T Q�”:˜a“=Ò ©]Ò;Ð;Ü�%œ$¤˜×'Ò'Ù',Ó-¡u !”
˜1–¡uÑ-Ð-Ü�%œ×ÒÜÑ3©UÓ3Ó3Ð3Ø€Lùó <ùâ-s   ªB&Á%B,c               ó   € V ^8„  d   QhRR/# ©r   r$   r   r%   )r&   s   "r'   r(   r(   É   s   € ÷ 5ñ 5�Nñ 5r)   c                 ó,   € \        R 4      p V f   R/ /# T # )ú
state.jsonÚunlocks)r  ©r	  s    r'   Ú
load_stater)  É   s   € Ü�lÓ#€DØ"šlˆI�rˆ?Ð4°Ð4r)   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r$   r
  r%   )r&   s   "r'   r(   r(   Î   s   € ÷ %ñ %�nð %¨ñ %r)   c                ó   € \        R V 4       R# )r&  N)r  )r   s   &r'   Ú
save_stater,  Î   s   € Ü�˜eÖ$r)   c               ó   € V ^8„  d   QhRR/# r$  r%   )r&   s   "r'   r(   r(   Ò   s   € ÷ ]ñ ]˜ñ ]r)   c                 ó  € \        \        4      p \        V \        4      '       d^   V P	                  R ^4       V P	                  R^ 4       V P	                  R/ 4       \        V P                  R4      \        4      '       d   V # R \        R^ R/ /# )Úschema_versionÚgenerated_atÚsessions)r  ÚCHECKPOINT_FILEr  r  Ú
setdefaultÚgetÚ_CHECKPOINT_SCHEMA_VERSIONr(  s    r'   Úload_checkpointr6  Ò   st   € Ü”oÓ&€DÜ�$œ×ÒØ�‰Ð(¨!Ô,Ø�‰˜¨Ô*Ø�‰˜
 BÔ'Ü�d—h‘h˜zÓ*¬D×1Ò1ØˆKØÔ8¸.È!ÈZÐY[Ð\Ð\r)   c               ó    € V ^8„  d   QhRRRR/# )r   Úmetar   r$   r%   )r&   s   "r'   r(   r(   Ý   s   € ÷ wñ w˜nð w°ñ wr)   c           
     óÔ   € R V P                  R 4      RV P                  R4      RV P                  R4      RV P                  R4      ;'       g    V P                  R4      ;'       g    R/# )Úlast_activer   ÚmodelÚtitleÚpreviewÚUntitled©r4  )r8  s   &r'   Úsession_fingerprintr@  Ý   s§   € Ø˜4Ÿ8™8 MÓ2°LÀ$Ç(Á(È<ÓBXÐZaÐcg×ckÑckÐlsÓctÐv}ð  @D÷  @Hñ  @Hð  IPó  @Q÷  @vð  @vð  UY÷  U]ñ  U]ð  ^gó  Uh÷  @vð  @vð  lvð  wð  wr)   c               ó    € V ^8„  d   QhRRRR/# )r   ÚnowÚintr$   r#   r%   )r&   s   "r'   r(   r(   á   s   € ÷ ^ñ ^˜ð ^ ñ ^r)   c                óJ   € \         R J;'       d    V \        ,
          \        8*  # r  )r   Ú_SNAPSHOT_CACHE_ATÚSNAPSHOT_TTL_SECONDS)rB  s   &r'   Ú_cache_is_freshrG  á   s!   € Ü $Ð&×]Ð]¨CÔ2DÕ,DÔI]Ñ+]Ð]r)   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úsnapshotr   rB  úOptional[int]r$   r#   r%   )r&   s   "r'   r(   r(   å   s(   € ÷ Lñ LÐ!9ð LÀð LÐY]ñ Lr)   c                ó   € \        V \        4      '       d%   \        V P                  R 4      ;'       g    ^ 4      M^ pV^ 8*  ;'       g7    \        T;'       g    \        P                  ! 4       4      V,
          \
        8„  # )r0  )r  r  rC  r4  ÚtimerF  )rI  rB  Útss   && r'   Ú_is_snapshot_stalerN  å   s\   € Ü3=¸hÌ×3MÒ3MŒˆX�\‰\˜.Ó)×.Ð.¨QÔ	/ÐST€BØ�‰7×KÐK”s˜3×-Ð-¤$§)¢)£+Ó.°Õ3Ô7KÑKÐKr)   c               ó    € V ^8„  d   QhRRRR/# )r   rB  rJ  r$   r   r%   )r&   s   "r'   r(   r(   ê   s   € ÷ 	=ñ 	=˜mð 	=°~ñ 	=r)   c                ód  € \        T ;'       g    \        P                  ! 4       4      p\        \        \        4      '       d   \        MR pV'       d%   \        VP                  R4      ;'       g    ^ 4      M^ p/ \        CR\        RT;'       g    R RV'       d	   W,
          MR R\        W!4      /C# )Nr0  Úttl_secondsÚsnapshot_generated_atÚsnapshot_age_secondsÚsnapshot_stale)	rC  rL  r  r   r  r4  r   rF  rN  )rB  ÚcurrentÚsnapr0  s   &   r'   Ú_scan_status_payloadrW  ê   s�   € Ü�#×$Ð$œŸš›Ó%€GÜ(¬¼$×?Ò?�?ÀT€Dß9=”3�t—x‘x Ó/×4Ð4°1Ô5À1€Lð=Ü
ð=àÔ+Ø ×!5Ð!5°Ø¿L Ö!7ÈdØÔ,¨TÓ;ñ=ð =r)   c               ó    € V ^8„  d   QhRRRR/# )r   Úcallr   r$   r"   r%   )r&   s   "r'   r(   r(   ø   s   € ÷ Hñ H˜sð H }ñ Hr)   c                ó¸   € \        V \        4      '       g   R # V P                  R4      ;'       g+    V P                  R4      ;'       g    / P                  R4      # )Nr   Úfunction)r  r  r4  )rY  s   &r'   Ú_tool_name_from_callr\  ø   sE   € Ü�dœD×!Ò!ÙØ�8‰8�FÓ×GÐG §¡¨Ó 4× :Ð :¸×?Ñ?ÀÓGÐGr)   c               ó    € V ^8„  d   QhRRRR/# )r   Úmsgr   r$   r   r%   )r&   s   "r'   r(   r(   þ   s   € ÷ 	ñ 	�.ð 	 Sñ 	r)   c                óÆ   € V P                  R 4      pVf   R# \        V\        4      '       d   V#  \        P                  ! V4      #   \
         d    \        T4      u # i ; i)ÚcontentÚ )r4  r  r   r  r  rñ   )r^  r`  s   & r'   Ú_contentrb  þ   sW   € Ø�g‰g�iÓ €GØ‚ÙÜ�'œ3×ÒØˆðÜ�zŠz˜'Ó"Ð"øÜô Ü�7‹|Òðús   ±A ÁA ÁA c               ó$   € V ^8„  d   QhRRRRRR/# )r   Ú
tool_namesz	list[str]Úneedlesr   r$   rC  r%   )r&   s   "r'   r(   r(   
  s&   € ÷ Sñ S˜Ið S°ð S¸ñ Sr)   c                ót   a€ V  Uu. uF  q"P                  4       NK  	  pp\        V3R  lV 4       4      # u upi )c              3  ó®   <a"  € T FI  o\         ;QJ d    V3R  lS 4       F  '       g   K   RM	  RM! V3R  lS 4       4      '       g   KE  ^x € KK  	  R# 5i)c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5ir  r%   )r  r„   r   s   & €r'   r  Ú(_count_tool.<locals>.<genexpr>.<genexpr>  s   øé € Ð+QÉ¸v°d®NËùó   ƒTFN)Úany)r  r   re  s   &@€r'   r  Ú_count_tool.<locals>.<genexpr>  s0   ùé € ÐR™W�T¯«Ô+QÉÓ+Q¯¯ªÔ+QÉÓ+Q×(Q�qŠq›Wùs   „A”A«AÁ
A)ÚlowerÚsum)rd  re  r   Úlowereds   &j  r'   Ú_count_toolrp  
  s1   ø€ Ù(2Ó3©
 �z‰zŽ|©
€GÐ3ÜÔR™WÓRÓRÐRùò 4s   †5c               ó    € V ^8„  d   QhRRRR/# )r   Ú
model_namer   r$   r"   r%   )r&   s   "r'   r(   r(     s   € ÷ 	2ñ 	2˜sð 	2 }ñ 	2r)   c                óX  € T ;'       g    R P                  4       P                  4       pV'       d   VR8X  d   R# RV9   d   VP                  R^4      ^ ,          # \         F  pW!9   g   K  VR8X  d   Ru # Tu # 	  VP                  R^4      ^ ,          P                  R^4      ^ ,          # )ra  ÚnoneNÚ/ÚgeminiÚgoogleÚ:Ú-)Ústriprm  ÚsplitÚ_PROVIDER_MARKERS)rr  r   Úproviders   &  r'   Úmodel_providerr~    s–   € Ø×Ð˜"×#Ñ#Ó%×+Ñ+Ó-€Dß�4˜6”>ÙØ
ˆd„{Ø�z‰z˜#˜qÓ! !Õ$Ð$ß%ˆØÖØ'¨8Ô3�8ÒA¸ÒAñ &ð �:‰:�c˜1Ó˜aÕ ×&Ñ& s¨AÓ.¨qÕ1Ð1r)   c               ó    € V ^8„  d   QhRRRR/# )r   rr  r   r$   r#   r%   )r&   s   "r'   r(   r(     s   € ÷ ^ñ ^ Cð ^¨Dñ ^r)   c                ó  a€ T ;'       g    R P                  4       P                  4       o\        S4      ;'       dP    SR8g  ;'       dC    \        ;QJ d#    V3R l\         4       F  '       g   K   R# 	  R# ! V3R l\         4       4      # )ra  rt  c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5ir  r%   )r  Úmarkerr   s   & €r'   r  Ú&is_local_model_name.<locals>.<genexpr>!  s   øé € Ð0]ÉnÀF¸4¶Ënùrj  TF)rz  rm  r#   rk  Ú_LOCAL_MARKERS)rr  r   s   &@r'   Úis_local_model_namer…    sc   ø€ Ø×Ð˜"×#Ñ#Ó%×+Ñ+Ó-€DÜ�‹:×]Ð]˜$ &™.×]Ð]¯S«SÔ0]ÍnÓ0]¯S¬SÐ]ªSÐ]¨SÔ0]ÍnÓ0]Ó-]Ð]r)   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Ú
session_idr   r<  Úmessagesrç   r$   r   r%   )r&   s   "r'   r(   r(   $  s0   € ÷ _ñ _ ð _¨Sð _Ð<Pð _ÐUcñ _r)   c                óÂ
  a€ \        4       p. p\        4       p. p^ pV EFt  p\        V4      p	VP                  V	4       VP                  R4      '       dK   \	        VR,          4      p
VP                  V
4       VP                  R4      R8w  d   VP                  V
4       VP                  R4      ;'       g    .  F:  p\        V4      p
V
'       g   K  VP                  V
4       VP                  V
4       K<  	  \        P                  V	4      '       d
   V^,          pT	pVP                  R4      '       d:   VR\        P                  ! VP                  R4      \        R7      ,           ,          pVP                  \        P                  V4      4       EKw  	  RP                  V4      oSP                  4       pR V3R	 llp\!        VR
R4      p\!        VR4      p/ RV bRT;'       g    RbR\#        V4      bR\#        V4      bRVbR\#        V4      bRVbR\!        VR4      bRVbR\!        VR4      bRVbRVV,           bR\!        VR4      bR\!        VRR4      bR \!        VRR!RR4      bR"\#        V4      bR#\!        VR$4      b/ R%\!        VR&4      V! R'4      ,           bR(\!        VR)4      bR*\!        VR+R,4      bR-\!        VR.R/4      bR0\!        VR14      \#        \$        P                  ! R2V4      4      ,           bR3\!        VR44      bR5\!        VR6R74      bR8\!        VR9R64      bR:\'        \(        P                  S4      4      bR;\(        P                  S4      '       d   ^M^ bR<V! R=4      bR>V! R?4      bR@V! RA4      bRB\*        P                  S4      '       d   \        P                  S4      '       d   ^M^ bRC\*        P                  S4      '       d   \,        P                  S4      '       d   ^M^ bRDV'       d/   \$        P                  ! RES\$        P.                  4      '       d   ^M^ bRFV! RG4      bC/ RH\        P                  S4      '       d	   V! RI4      M^ bRJV! RK4      bRLV! RM4      bRNV! RO4      bRPV! RQ4      bRRV^8¼  d/   \$        P                  ! RSS\$        P.                  4      '       d   ^M^ bRTV! RU4      bRVV! RW4      bRXV! RY4      bRZV! R[4      bR\V! R]4      bR^V! R_4      bR`V! Ra4      bRbV! Rc4      bRdV! Re4      bRfV! Rg4      bRhV! Ri4      bCRjV! Rk4      RlV! Rm4      RnV! Ro4      RpV! Rq4      RrV! Rs4      RtV! Ru4      RvV! Rw4      Rx\        4       /C# )yé    Ú	tool_nameÚroleÚtoolÚ
tool_callsÚ )ÚdefaultÚ
c               ó    € V ^8„  d   QhRRRR/# )r   Úpatternr   r$   rC  r%   )r&   s   "r'   r(   Ú&analyze_messages.<locals>.__annotate__C  s   € ÷ Bñ B�cð B˜cñ Br)   c                ób   <€ \        \        P                  ! V S\        P                  4      4      # r  )ÚlenÚreÚfindallÚ
IGNORECASE)r“  Ú	full_texts   &€r'   ÚhitsÚanalyze_messages.<locals>.hitsC  s   ø€ Ü”2—:’:˜g y´"·-±-Ó@ÓAÐAr)   Ú
web_searchÚweb_extractr©   r‡  r<  zUntitled sessionÚmessage_countÚtool_call_countrd  Údistinct_tool_countÚerror_countÚterminal_callsr¬   Ú	web_callsÚweb_extract_callsrª   Úweb_browser_callsÚpatch_callsÚpatchÚfile_reads_searchesÚ	read_fileÚsearch_filesÚfile_tool_callsÚ
write_fileÚfiles_touched_countÚdelegate_callsÚdelegate_taskÚprocess_callsÚprocesszbackground\s*=\s*trueÚ
cron_callsÚcronjobr¶   ÚimageÚvisionr¹   ÚttsÚtext_to_speechr‰   Úskillz\bskillrŒ   Úskill_manager�   ÚmemoryÚ	mnemosyner’   Úmnemosyne_rememberÚport_conflictr^   rX   ztraceback|exceptionr[   z6gateway\.log|errors\.log|agent\.log|/api/logs|\blogs\bra   z0permission denied|eacces|operation not permittedrd   re   rh   z\brestart|reload|kill|start\brk   zKmissing .*env|api key|environment variable|not configured|unauthorized|authrn   zyaml|yml|colon|parse errorrq   zRdocker.*(name|container).*already|container name conflict|Conflict\. The containerr|   z+\.(css|svg|tsx|jsx)|frontend|tailwind|reactr‚   z%\.css|tailwind|style|className|visualr   z.\bgit\s+(commit|push|merge|rebase|status|diff)r…   z#one character|single character|typor•   z#compress|context window|token|cacher˜   z)gateway|discord|telegram|slack|api_serverr›   z7plugin|dashboard-plugins|__HERMES_PLUGIN|manifest\.jsonrž   zrollback|checkpointr§   z$docs|documentation|docusaurus|READMEr¼   zkmodel|provider|openrouter|codex|gemini|claude|anthropic|openai|mistral|qwen|deepseek|llama|ollama|vllm|ggufr¿   Ú
openrouterrÂ   rÁ   rË   zclaude|anthropicrÍ   zgemini|google ai|google modelÚlocal_model_eventszCollama|llama\.cpp|gguf|vllm|local model|open[- ]weight|open weightsrÑ   zFtoolset|enabled_toolsets|browser tool|terminal tool|file tool|web toolrÓ   z‚config\.ya?ml|\b[a-z0-9_-]+config\.(?:js|ts|json|ya?ml)|\.env(?:\b|\.)|manifest\.json|settings\.json|pyproject\.toml|package\.jsonrÕ   zb\bgit\s+(rebase|merge|fetch|pull|push|tag|checkout)|merge conflict|conflict\s*\(|rebase --continuer×   zapytest|unittest|vitest|playwright|npm test|pnpm test|node --check|py_compile|tests? passed|\bOK\brÙ   zDscreenshot|playwright|vision_analyze|browser_vision|\.png|image dataÚrelease_eventsz>\bgit\s+tag|release|version bump|changelog|publish|pushed? tagræ   z#cache hit|prompt caching|cache_readÚmodel_names)r   rb  Úappendr4  r   Úaddr\  ÚERROR_REÚsearchr  r  ÚupdateÚFILE_REr˜  Újoinrm  rp  r–  r—  r#   ÚPORT_REÚ
INSTALL_REÚ
SUCCESS_REr™  )r‡  r<  rˆ  rd  Útool_sequenceÚfiles_touchedÚfull_text_partsr¢  r^  Útextr   rY  Úblobrm  r›  r¤  rª   rš  s   &&&              @r'   Úanalyze_messagesrÒ  $  sŽ  ø€ Ü›5€JØ!€MÜ!›e€MØ!#€OØ€KÜˆÜ˜‹}ˆØ×Ñ˜tÔ$Ø�7‰7�;×ÒÜ�s˜;Õ'Ó(ˆDØ�N‰N˜4Ô ð �w‰w�v‹ &Ô(Ø×$Ñ$ TÔ*Ø—G‘G˜LÓ)×/Ð/¨RÒ/ˆDÜ'¨Ó-ˆDß‰tØ—‘˜tÔ$Ø×$Ñ$ TÖ*ñ	 0ô
 �?‰?˜4× Ò Ø˜1ÕˆKØˆØ�7‰7�<× Ò Ø�Cœ$Ÿ*š* S§W¡W¨\Ó%:ÄCÔHÕHÕHˆDØ×ÑœWŸ_™_¨TÓ2×3ñ) ð, —	‘	˜/Ó*€IØ�O‰OÓ€E÷Bð Bä˜M¨<¸ÓG€IÜ ¨yÓ9€Mð;Ø�jð;à�×,Ð,Ð,ð;ð 	œ˜X›ð;ð 	œ3˜}Ó-ð	;ð
 	�jð;ð 	œs :›ð;ð 	�{ð;ð 	œ+ m°ZÓ@ð;ð 	�Yð;ð 	œ[¨¸ÓFð;ð 	˜ð;ð 	˜Y¨Õ6ð;ð 	”{ =°'Ó:ð;ð 	œ{¨=¸+À~ÓVð;ð 	œ; }°kÀ<ÐQXÐZhÓið;ð  	œs =Ó1ð!;ð" 	œ+ m°_ÓEñ#;ð$ 	œ ]°IÓ>ÁÐF^ÓA_Õ_ð%;ð& 	”k -°Ó;ð';ð( 	œk¨-¸À(ÓKð);ð* 	”[ °Ð7GÓHð+;ð, 	œ M°7Ó;¼cÄ"Ç*Â*ÈZÐY^ÓB_Ó>`Õ`ð-;ð. 	œ{¨=¸.ÓIð/;ð0 	œ ]°H¸kÓJð1;ð2 	œ{¨=Ð:NÐPXÓYð3;ð4 	œœgŸn™n¨YÓ7Ó8ð5;ð6 	¤W§^¡^°I×%>Ò%>¡ÀAð7;ð8 	™DÐ!7Ó8ð9;ð: 	™4Ð YÓZð;;ð< 	#¡DÐ)\Ó$]ð=;ð> 	¤Z×%6Ñ%6°y×%AÒ%AÄhÇoÁoÐV_×F`ÒF`¡Ðfgð?;ð@ 	!¤z×'8Ñ'8¸×'CÒ'CÌ
×HYÑHYÐZc×HdÒHd¡!ÐjkðA;ðB 	%¯;¼2¿9º9ÐEeÐgpÔrt×rÑr÷  <Aò  <A¡að  GHðC;ðD 	¡Ð%sÓ tòE;ðF 	ÄHÇOÁOÐT]×D^ÒD^™TÐ"?Ô@ÐdeðG;ðH 	!¡$Ð'|Ó"}ðI;ðJ 	#¡DÐ)WÓ$XðK;ðL 	™tÐ$LÓMðM;ðN 	‘dÐLÓMðO;ðP 	)¨{¸aÔ/?ÄBÇIÂIÐNtÐvô  BD÷  BOñ  BO÷  EPò  EP©!ð  VWðQ;ðR 	™$ÐEÓFðS;ðT 	™$ÐKÓLðU;ðV 	™ÐXÓYðW;ðX 	™4Ð 6Ó7ðY;ðZ 	¡Ð%LÓ Mð[;ð\ 	™ð  Ló  Mð];ð^ 	™T -Ó0ð_;ð` 	™˜X›ða;ðb 	™Ð1Ó2ðc;ðd 	™Ð>Ó?ðe;ðf 	™dÐ#iÓjñg;ðh 	™$ÐhÓiØ™ð  dó  eØ™dð  $Ió  JØ‘tð  Aó  BØ™TÐ"iÓjØ™$Ð`ÓaØ™ÐCÓDØ”s“uñw;ð ;r)   c               ó4   € V ^8„  d   QhRRRRRRRRRRR	RR
R/# )r   Úunlockedr#   Ú
discoveredr   r   ÚprogressrC  Únext_thresholdÚprogress_pctr$   r   r%   )r&   s   "r'   r(   r(   ˆ  sQ   € ÷ Hñ H˜ð H¨4ð H¸ð HÈSð HÐmpð Hð  ADð Hð  IWñ Hr)   c                ó&   € RV RVRVRVRVRVRVRV/# )	z@Uniform evaluation result (key order is part of the wire shape).rÔ  rÕ  r   ÚtierrÖ  Ú	next_tierr×  rØ  r%   ©rÔ  rÕ  r   rÚ  rÖ  rÛ  r×  rØ  s   $$$$$$$$r'   Ú_resultrÝ  ˆ  sL   € à˜ ,°
¸GÀUÈFÐTXÐZdÐfnÐp{ð  ~Gð  IYð  [ið  kyð  {Gð  Hð  Hr)   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Ú
definitionr   rÔ  r#   Úany_progressr$   ztuple[str, bool]r%   )r&   s   "r'   r(   r(   �  s)   € ÷ -ñ -�~ð -°ð -ÀTð -ÐN^ñ -r)   c                ó–   € \        V P                  R4      4      pV'       d   RMV'       d   V'       g   RMRpYB;'       g    V'       * 3# )zS``(state, discovered)``: secret badges stay hidden until the first matching signal.r   rÔ  rÕ  )r#   r4  )rß  rÔ  rà  r   r   s   &&&  r'   Ú_staterâ  �  s8   € ä�*—.‘. Ó*Ó+€Fß"‰J·VÇL©ÐVb€EØ×,Ð, f¤*Ð,Ð,r)   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   rß  r   Ú	aggregater$   r%   )r&   s   "r'   r(   r(   ”  s&   € ÷ Eñ E ð E¸>ð EÈnñ Er)   c                óN  € \        VP                  V R ,          ^ 4      ;'       g    ^ 4      p\        V P                  R. 4      R R7      pV Uu. uF  qBVR,          8¼  g   K  VNK  	  ppV Uu. uF  qBVR,          8  g   K  VNK  	  ppV'       d   V^ ,          R,          MV'       d   VR,          R,          M^pV'       d   VR,          R,          M^ p\        ^Wx,
          4      p	V'       g   V'       d   ^dM=\        ^ \	        ^c\
        P                  ! W(,
          V	,          ^d,          4      4      4      p
\        V \        V4      V^ 8„  4      w  r¼\        \        V4      YËV'       d   VR,          R,          MRY&'       d   V^ ,          R,          MRWzR7      # u upi u upi )	r2   r   c                ó   € V R ,          # ©r3   r%   ©r:   s   &r'   Ú<lambda>Ú!evaluate_tiered.<locals>.<lambda>–  s   € À1À[Æ>r)   ©rj   r3   r   NrÜ  éÿÿÿÿ)
rC  r4  r!  ÚmaxÚminÚmathÚfloorrâ  r#   rÝ  )rß  rå  rÖ  Ú
tiers_listr:   ÚachievedÚ
next_tiersr×  Úcurrent_thresholdÚdenomÚpctr   rÕ  s   &&           r'   Úevaluate_tieredrø  ”  sR  € Ü�9—=‘= Ð,>Õ!?ÀÓC×HÐHÀqÓI€HÜ˜
Ÿ™ w°Ó3Ñ9QÔR€JÙ%ÓD™:�a°Q°{µ^Ñ)C—�™:€HÐDÙ'ÓE™Z˜°a¸µnÑ+D—!�!™Z€JÐEß3=�Z •] ;Ö/×cmÀJÈrÅNÐS^ÖD_Ðst€Nß5=˜ � [Ö1À1ÐÜ��>Õ5Ó6€Eß§H‰#´#°a¼¸RÄÇÂÈhÕNjÐnsÕMsÐwzÕLzÓA{Ó9|Ó2}€CÜ˜z¬4°«>¸8Àa¹<ÓHÑ€EÜÜ�h“¨J×bjÈ(ÐSUÍ,ÐW]ÖJ^ÐptØ¾j Z°¥]°6Ö%:ÈdÐcqôEð Eùò EùÚEs   ÁFÁ#FÁ/F"ÂF"c               ó$   € V ^8„  d   QhRRRRRR/# rä  r%   )r&   s   "r'   r(   r(   £  s'   € ÷ Lñ L nð LÀð LÐTbñ Lr)   c                ó”  € V P                  R . 4      pV'       g"   \        V RR4      w  r4\        RWCR^ R^^ R7      # . pRpRpV F“  p\        VP                  VR,          ^ 4      ;'       g    ^ 4      p	\        VP                  R^4      4      p
T;'       g    V	^ 8„  pT;'       d    Wš8¬  pVP	                  \        RV	\        ^V
4      ,          4      4       K•  	  \        P                  ! \        V4      \        V4      ,          ^d,          4      p\        WV4      w  r4\        YtTRTR^dV'       d   ^dR7      # \        ^cV4      R7      # )r1   FNrÜ  Tr   r0   g      ð?)r4  râ  rÝ  rC  rÃ  rï  rî  rð  rñ  rn  r–  )rß  rå  r1   r   rÕ  Úpartsrà  ÚcompleteÚrequirementr  r3   r÷  s   &&          r'   Úevaluate_requirementsrþ  £  sI  € Ø—>‘> .°"Ó5€LßÜ" :¨u°eÓ<ÑˆÜ °*ÐPTÐ_`Ðlpð  BCð  RSô  Tð  	TØ€EØ€LØ€HÛ#ˆÜ�I—M‘M +¨hÕ"7¸Ó;×@Ð@¸qÓAˆÜ˜Ÿ™¨¨qÓ1Ó2ˆ	Ø#×0Ð0 u¨q¡yˆØ×2Ð2 Ñ 2ˆØ�‰”S˜˜e¤c¨!¨YÓ&7Õ7Ó8Ö9ñ $ô �*Š*”c˜%“j¤3 u£:Õ-°Õ4Ó
5€CÜ˜z°\ÓBÑ€EÜØ¸ÀDÐSVÐbfØ·¨ôLð Lä>AÀ"Àc»lôLð Lr)   c               ó$   € V ^8„  d   QhRRRRRR/# rä  r%   )r&   s   "r'   r(   r(   ¸  s"   € ÷ 8ñ 8 Nð 8¸~ð 8ÐR`ñ 8r)   c                ó<   € R V 9   d   \        W4      # \        W4      # )r2   )rø  rþ  )rß  rå  s   &&r'   Úevaluate_definitionr  ¸  s    € Ø˜ZÔ'Ü˜zÓ5Ð5Ü  Ó7Ð7r)   ztool calls in one sessionz)distinct Hermes tools used in one sessionzterminal calls in one sessionz&file/search/patch calls in one sessionz2web search/extract or browser calls in one sessionzmessages in one sessionzfiles touched in one sessionzlifetime delegate_task callsz&lifetime background process operationsz!lifetime scheduled-job operationsz(error/failed/traceback messages observedztraceback or exception mentionszlog inspectionsz#dev-server port conflict detectionszpermission-denied errorszpackage-install failuresz.successful package installs after package workz+restart/reload actions after error clustersz/missing auth/config/environment-variable eventszYAML/config parse incidentszDocker/container-name conflictsz(frontend/CSS/SVG/React activity mentionsz-CSS, styling, Tailwind, or className activityzgit workflow commandsz*tiny typo-style fixes after error clustersz!Hermes skill mentions or tool usez+skill_manage create/patch/delete operationszmemory or Mnemosyne tool eventszdurable memory writesz7context, compression, token, or cache-pressure mentionsz"gateway/API/chat-platform activityz-dashboard plugin development or usage signalsz%rollback/checkpoint recovery mentionsz"documentation/README/docs activityzmodel/provider-related activityzOpenRouter mentionszCodex mentionszprompt-cache/cache-hit mentionsz%lifetime web_search/web_extract callszlifetime web_extract callsz!lifetime browser automation callszlifetime Hermes tool callszlifetime terminal callszlifetime targeted patch editsz%lifetime read_file/search_files callsz%image generation or vision tool callsz"text-to-speech or voice tool callsz-distinct model names seen in session metadataz7distinct model providers inferred from session metadatazClaude/Anthropic model mentionszGemini/Google model mentionsrÀ  z local/open-weight model mentionsz9Hermes sessions whose model metadata is local/open-weightztoolset or tool-family mentionsz+configuration/environment/manifest activityzAgit history operations such as rebase, merge, fetch, push, or tagz(test/check/verification command mentionsz:screenshot, Playwright, PNG, or vision-inspection activityrÁ  z,release, version, publish, or git tag eventszHermes sessionszsessions started on weekendsz*sessions started late night or before dawnc               ó    € V ^8„  d   QhRRRR/# )r   r   r   r$   r%   )r&   s   "r'   r(   r(   ÿ  s   € ÷ ?ñ ?˜ð ? ñ ?r)   c                óL   € \         P                  W P                  R R4      4      # )Ú_r�  )ÚMETRIC_LABELSr4  Úreplace)r   s   &r'   Úmetric_labelr  ÿ  s   € Ü×Ñ˜V§^¡^°C¸Ó%=Ó>Ð>r)   c               ó    € V ^8„  d   QhRRRR/# )r   rß  r   r$   r   r%   )r&   s   "r'   r(   r(     s   € ÷ Añ A˜^ð A°ñ Ar)   c                ó¶  € V P                  R 4      '       d   V P                  R4      R 8X  d   R# RV 9   dZ   \        V P                  R. 4      R R7      pV'       g   R# RP                  R	 V 4       4      pR
\        V R,          4       RV R2# V P                  R4      ;'       g    . pV'       d'   R
RP                  R V 4       4      ,           R,           # R# )r   r   z³Secret: exact requirement hidden until Hermes sees the first matching signal. Keep using Hermes across debugging, tools, memory, skills, plugins, and model workflows to reveal it.r2   r   c                ó   € V R ,          # rè  r%   ré  s   &r'   rê  Úcriteria_for.<locals>.<lambda>  s   € ÀqÈÆ~r)   rì  z1Requirement: use Hermes in the matching workflow.z, c              3  óJ   "  € T F  qR ,           RVR,           2x € K  	  R# 5i)r   r�  r3   Nr%   )r  r:   s   & r'   r  Úcriteria_for.<locals>.<genexpr>
  s"   é € ÐOÁJ¸q �i˜[¨¨!¨K­.Ð)9Õ:ÃJùó   ‚!#zRequirement: z. Tier ladder: Ú.r1   z; c           	   3  ó‚   "  € T F5  p\        VR ,          4       R\        VP                  R^4      4       2x € K7  	  R# 5i)r   u    â‰¥ r0   N)r  rC  r4  )r  Úrs   & r'   r  r    s>   é € Ð*{ÑnzÐij¬l¸1¸X½;Ó.GÐ-HÈÌcÐRS×RWÑRWÐX]Ð_`ÓRaÓNbÐMcÕ+dÓnzùs   ‚=?z3Requirement: complete the matching Hermes behavior.)r4  r!  rÉ  r  )rß  rò  Úladderr1   s   &   r'   Úcriteria_forr    sÌ   € Ø‡~�~�h×Ò J§N¡N°7Ó$;¸xÔ$Gñ EØ˜ZÔ'Ü˜JŸN™N¨7°BÓ7Ñ=UÔVˆ
ßÙFØ—‘ÑOÁJÓOÓOˆØœ|¨JÐ7IÕ,JÓKÐLÈOÐ\bÐ[cÐcdÐeÐeØ—>‘> .Ó1×7Ð7°R€LßØ §¡Ñ*{ÑnzÓ*{Ó!{Õ{ð  Bõ  Bð  	BÙ@r)   c               ó    € V ^8„  d   QhRRRR/# )r   r7   r   r$   r%   )r&   s   "r'   r(   r(     s   € ÷ ñ ˜nð °ñ r)   c           	     ó’   € \        V 4      pVP                  R 4      R8X  d   / VCRRRRR\        V4      RR/C# \        V4      VR&   V# )r   r   r   z???r   zdSecret achievement: hidden until Hermes detects the first relevant behavior in your session history.Úcriteriar!   )r  r4  r  )r7   Úcleans   & r'   Údisplay_achievementr    s€   € Ü�‹J€EØ‡y�y�Ó˜XÔ%ð R�%ð  R˜ ¨ð  8^ð  `jô  lxð  y~ó  lð  AGð  IQñ  Rð  	RÜ$ UÓ+€Eˆ*ÑØ€Lr)   Ú	rescannedÚreusedÚscanned_so_farÚexpected_totalc               ó4   € V ^8„  d   QhRRRRRRRRRRR	RR
R/# )r   Úmoder   ÚtotalrC  r  r  r  rJ  r  r$   r   r%   )r&   s   "r'   r(   r(     sH   € ÷ ñ �Sð  ð °Cð ÀSð Ð^kð ð  ERð ð  ^lñ r)   c               óF   € R V RVRVRV/pVe   VP                  WER7       V# )r  Úsessions_totalÚsessions_rescannedÚsessions_reused)Úsessions_scanned_so_farÚsessions_expected_total)rÇ  )r  r  r  r  r  r  r8  s   &&$$$$ r'   Ú
_scan_metar&    s5   € Ø�DÐ*¨EÐ3GÈÐTeÐgmÐn€DØÒ!Ø�‰¨NˆÔcØ€Kr)   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   ÚlimitrJ  Úprogress_callbackúOptional[Any]Úprogress_everyrC  r$   r   r%   )r&   s   "r'   r(   r(   #  s:   € ÷ JJñ JJ˜ð JJÀ-ð JJÐhkð JJð  wEñ JJr)   c                óô  €  ^ RI Hp V! RR7      p\	        4       pTR,          p\        TP                  R4      ;'       g    ^ 4      \        8H  p^ ;ršT e   T ^ 8:  d   R M
\        T 4      p TP                  TRRR7      p\        T4      p. p/ p\        T^R7       EFƒ  w  ppTP                  R4      pT'       g   K"  \        T4      pTP                  T4      p\        T\        4      '       d   TM/ pTP                  R4      ;'       g    TP                  R4      pT'       dX   \        TP                  R4      \        4      '       d3   TP                  R4      T8X  d   \        TR,          4      pT	^,          p	M1\        TT;'       g    RTP                  TRR7      4      pT
^,          p
TP!                  TT;'       g    TP                  R4      ;'       g    RTP                  R4      TP                  R4      TP                  R4      R7       TP                  R4      '       d’   \#        TP                  R4      4      pTP%                  R\'        4       4      p\        T\&        4      '       d   TP)                  T4       M5\        T\*        4      '       d   TT9  d   TP-                  T4       MT0TR&   TP-                  T4       RTR\/        T4      /TT&   Tf   EKJ  T^ 8”  g   EKT  TT,          ^ 8X  g   EKe  TT8  g   EKo   T! \+        T4      TT4       EK†  	  \1        \2        R\        R\        \4        P4                  ! 4       4      RT/4       TP7                  4        RTR\9        T4      R\        T	^ 8”  d   RMR\        T4      Y©\        T4      TR7      /#   \         d"   pR. R/ RRT 2R\        R	^ 4      /u R
p?# R
p?ii ; i  \         d     EKF  i ; i  TP7                  4        i ; i)!a   Scan Hermes sessions and build per-session achievement stats.

``limit=None`` (default) scans the ENTIRE history (SQLite ``LIMIT -1``); a former cap
of 200 silently shrank lifetime totals on long-running installs. The checkpoint stores
per-session stats keyed by ``(started_at, last_active)`` fingerprint so warm scans only
re-analyze changed sessions. ``progress_callback(partial_sessions, scanned_so_far,
total)`` fires every ``progress_every`` sessions so background scans can publish
intermediate snapshots.
)Ú	SessionDBT)Ú	read_onlyr1  rå  ÚerrorzCould not open SessionDB: Ú	scan_metaÚfailedNr/  F)r(  Úinclude_childrenÚproject_compression_tips)Ústartr   r<  r=  ÚstatsÚfingerprintr>  )Úinclude_compactedr   r:  Úsource)r‡  r<  r   r:  r8  r;  rÂ  r0  ÚincrementalÚfull)r  r  r  r  rí  )Úhermes_stater-  rñ   r&  r6  rC  r4  r5  Úlist_sessions_richr–  Ú	enumerater@  r  r  rÒ  Úget_messagesrÇ  r   r3  r   rÄ  r  rÃ  r  r  r2  rL  ÚcloseÚaggregate_stats)r(  r)  r+  r-  ÚdbÚexcÚprevious_checkpointÚprevious_sessionsÚcheckpoint_is_currentr  r  Údb_limitÚsessions_metaÚtotal_sessionsr1  Úcheckpoint_sessionsÚidxr8  ÚsidÚfpÚcachedr<  r5  r;  Únamess   &&&                      r'   Úscan_sessionsrO  #  sà  € ðDÝ*ñ
  Ô&ˆô *Ó+ÐØ+¨JÕ7ÐÜÐ 3× 7Ñ 7Ð8HÓ I× NÐ NÈQÓOÔSmÑmÐØÐ€FØ’m u°¤z‰r¼¸E»
€Hð+Ø×-Ñ-°HÈtÐnsÐ-ÓtˆÜ˜]Ó+ˆØ)+ˆØ.0ÐÜ" =¸×:Ð:‰IˆC�Ø—(‘(˜4“.ˆCßÙÜ$ TÓ*ˆBØ&×*Ñ*¨3Ó/ˆFÜ)¨&´$×7Ò7‘V¸RˆFØ—H‘H˜WÓ%×<Ð<¨¯©°)Ó)<ˆEß$¬°F·J±J¸wÓ4GÌ×)NÒ)NÐSY×S]ÑS]Ð^kÓSlÐprÔSrÜ˜V G�_Ó-�Ø˜!•‘ô
 )¨¨e×.AÐ.A°zÀ2Ç?Á?ÐSVÐjnÀ?ÓCoÓp�Ø˜Q•�	Ø�L‰L C¨u×/XÐ/X¸¿	¹	À'Ó8J×/XÐ/XÈjÐei×emÑemÐnzÓe{ð  JN÷  JRñ  JRð  S`ó  Jað  jn÷  jrñ  jrð  s{ó  j|ˆLô  }Ø�x‰x˜× Ò ä˜DŸH™H WÓ-Ó.�Ø×(Ñ(¨¼»Ó>�Ü˜e¤S×)Ò)Ø—I‘I˜eÕ$Ü ¤t×,Ò,Ø EÔ)ØŸ™ UÔ+øà,1¨7�E˜-Ñ(Ø�O‰O˜EÔ"Ø(5°r¸7ÄJÈuÓDUÐ'VÐ Ñ$Ø Õ,°À!×1CÈÈ~ÕI]Ðab×IbÐhkÐn|×h|ðÙ%¤d¨8£n°c¸>×JñC ;ôH 	”OÐ&6Ô8RÐTbÔdgÔhl×hqÒhqÓhsÓdtð  wAð  CVð  &Wô  	Xà
�‰Œ
à�HØ”_ XÓ.Ø”ZØ# aœZ‰M¨V´S¸³]ÈiÜ˜x›=¸ôIðJð Jøôi ô DØ˜B ¨R°Ð<VÐWZÐV[Ð:\Ð^iÔkuÐv~ð  ABó  lCð  Dõ  	DûðDûô^ !ô Ûðûð 	�‰�
ús‡   ‚N# Á+BO% ÄO% Ä%A%O% Æ6O% ÇO% ÇAO% È*B5O% Ë%O% Ë/O% Ì O% ÌOÌ;O% Î#OÎ.O
ÏOÏ
OÏO"ÏO% Ï!O"Ï"O% Ï%O7r   r¡  rŸ  r£  r¬  Úmax_web_calls_in_sessionr¤  r¦  r®  r¢  r¥  r§  r©  r¯  r±  r³  c               ó    € V ^8„  d   QhRRRR/# )r   r1  rç   r$   r   r%   )r&   s   "r'   r(   r(   �  s   € ÷ ñ Ð2ð °~ñ r)   c           	     ó^  € R \        V 4      /p. \        O\        ORNRNRNRNRN\        O F  p^ W&   K	  	  \	        4       p\	        4       pV  EF  p\        P                  4        F)  w  r&\        W,          VP                  V^ 4      4      W&   K+  	  \        P                  4        F)  w  r&W;;,          VP                  V^ 4      ,          uu&   K+  	  \         F'  pW;;,          VP                  V^ 4      ,          uu&   K)  	  VP                  R4      ;'       g    \	        4       pVP                  V4       VP                  \        RR V 4       4      4       \        ;QJ d    R	 V 4       F  '       g   K   R
M	  RM! R	 V 4       4      '       d   VR;;,          ^,          uu&   VP                  R4      '       g   EKv   \        P                  ! \        VP                  R4      4      4      pVP                  ^8¼  d   VR;;,          ^,          uu&   VP                  ^8  g   VP                  ^8¼  d   VR;;,          ^,          uu&   EK  EK  	  \        V U	u0 uF  q™'       g   K  V	R8w  g   K  V	kK  	  up	4      VR&   \        V4      VR&   V#   \          d     EKY  i ; iu up	i )rÝ   rÅ   rÈ   rÏ   rà   rã   rÂ  Nc              3  óJ   "  € T F  p\        \        V4      4      x € K  	  R # 5ir  )r~  r   ©r  r8   s   & r'   r  Ú"aggregate_stats.<locals>.<genexpr>Ÿ  s   é € Ð+[ÉNÀq¬N¼3¸q»6×,BÐ,BËNùr  c              3  óJ   "  € T F  p\        \        V4      4      x € K  	  R # 5ir  )r…  r   rT  s   & r'   r  rU     s   é € ÐC±N¨qÔ"¤3 q£6×*Ð*³Nùr  TFr   r
  )r–  Ú_SESSION_MAX_METRICSÚ_SESSION_SUM_METRICSÚ_SESSION_EVENT_KEYSr   r  rî  r4  rÇ  Úfilterrk  rL  Ú	localtimeÚfloatÚtm_wdayÚtm_hourrñ   )
r1  Úaggrj   rÂ  Úprovider_namesÚsÚstatÚsession_modelsÚltr8   s
   &         r'   r@  r@  �  sR  € à*¬C°«MÐ:€Cð JÔ%ð  JÔ(<ð  JÐ>Tð  JÐVoð  Jð  rMð  Jð  Oað  Jð  csð  Jô  vIó  JˆØˆ‹ñ Jä›E€KÜ"›u€NÜˆÜ-×3Ñ3Ö5‰IˆCÜ˜3�8 Q§U¡U¨4°£^Ó4ˆC‹Hñ 6ä-×3Ñ3Ö5‰IˆCØ�H˜Ÿ™˜d A›Õ&�Hñ 6ç&ˆCØ�H˜Ÿ™˜c 1›Õ%�Hñ 'àŸ™˜}Ó-×6Ð6´³ˆØ×Ñ˜>Ô*Ø×Ñœf TÑ+[ÉNÓ+[Ó\Ô]ß‹3ÑC±NÓC�3�3Š3ÑC±NÓC×CÒCØÐ+×,°Õ1Ó,Ø�5‰5�×ÕðÜ—^’^¤E¨!¯%©%°Ó*=Ó$>Ó?�Ø—:‘: ”?ØÐ*×+¨qÕ0Ó+Ø—:‘: ”> R§Z¡Z°2Ô%5ØÐ(×)¨QÕ.Ö)ò &6ñ# ô* #&±+Ó&S±+¨QÃ¤qÀqÈFÁ{§q q±+Ñ&SÓ"T€CÐÑÜ%(¨Ó%8€CÐ!Ñ"Ø€Jøô	 ô Ûðüâ&Ss%   ÇBJÉ 	J*É.J*É7J*ÊJ'Ê&J'c               ó$   € V ^8„  d   QhRRRRRR/# )r   rß  r   r1  rç   r$   r   r%   )r&   s   "r'   r(   r(   °  s(   € ÷ `ñ `˜^ð `Ð7Kð `ÐPhñ `r)   c           	     óö   a€ \         P                  V P                  R 4      4      oV'       d   Sf   R# \        VV3R lR7      pRVP                  R4      RVP                  R4      RVP                  S^ 4      /# )r2   Nc                ó(   <€ V P                  S^ 4      # )rŠ  r?  )Úxrj   s   &€r'   rê  Úevidence_for.<locals>.<lambda>´  s   ø€  A§E¡E¨#¨q¤Mr)   rì  r‡  r<  r  )rW  r4  rî  )rß  r1  ra  rj   s   && @r'   Úevidence_forrj  °  sh   ø€ Ü
×
"Ñ
" :§>¡>Ð2DÓ#EÓ
F€Cß�s’{ÙÜˆHÔ1Ô2€AØ˜!Ÿ%™% Ó-¨w¸¿¹¸g»ÈÐQR×QVÑQVÐWZÐ\]ÓQ^Ð_Ð_r)   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Ú	evaluatedrç   Úscanr   rB  rC  r$   r%   )r&   s   "r'   r(   r(   º  s*   € ÷ ñ Ð-ð °^ð È#ð ÐR`ñ r)   c                ó  € RV RVP                  R. 4      RVP                  R/ 4      RVP                  R/ 4      RVP                  R4      R\        R V  4       4      R\        R	 V  4       4      R
\        R V  4       4      R\        V 4      RV/
# )z?Wire payload shared by finished, partial and pending snapshots.Úachievementsr1  rå  r0  r/  Úunlocked_countc              3  óF   "  € T F  qR ,          '       g   K  ^x € K  	  R# 5i)rÔ  Nr%   ©r  Úas   & r'   r  Ú_snapshot.<locals>.<genexpr>Â  s   é € ÐD© A¸
·m±mŸaša«ùs   ‚!—
!Údiscovered_countc              3  óT   "  € T F  qP                  R 4      R8X  g   K  ^x € K   	  R# 5i)r   rÕ  Nr?  rr  s   & r'   r  rt  Ã  s   é € ÐW©9 a¿¹¸g»È,Ñ8V§¢«9ùó   ‚(ž
(Úsecret_countc              3  óT   "  € T F  qP                  R 4      R8X  g   K  ^x € K   	  R# 5i)r   r   Nr?  rr  s   & r'   r  rt  Ä  s   é € ÐO¡y !·E±E¸'³NÀhÑ4NŸAšA£yùrw  Útotal_countr0  )r4  rn  r–  )rl  rm  rB  s   &&&r'   Ú	_snapshotr{  º  s�   € ð 	˜	Ø�D—H‘H˜Z¨Ó,Ø�T—X‘X˜k¨2Ó.Ø�T—X‘X˜k¨2Ó.Ø�—‘˜'Ó"Øœ#ÑD©ÓDÓDØœCÑW©9ÓWÓWØœÑO¡yÓOÓOØ”s˜9“~Ø˜ð
ð 
r)   Ú
is_partialc               ó$   € V ^8„  d   QhRRRRRR/# )r   rm  r   r|  r#   r$   r%   )r&   s   "r'   r(   r(   É  s!   € ÷ +ñ +˜^ð +¸Dð +È^ñ +r)   c               ó¤  € V P                  R/ 4      p\        4       pVP                  R/ 4      p\        \        P                  ! 4       4      p. p\
         EFY  p\        Wr4      pVR,          p	V'       gH   VR,          '       d9   W”9  d3   RVRVP                  R4      R\        WpP                  R	. 4      4      /WI&   W”9   dS   VR,          '       gD   TP                  R
R
RVP                  R4      ;'       g    WI,          P                  R4      R7       / VCVCp
VR,          '       dl   VP                  V	/ 4      P                  R4      V
R&   VP                  V	/ 4      P                  R4      ;'       g    \        WpP                  R	. 4      4      V
R&   VP                  \        V
4      4       EK\  	  V'       g   \        V4       \        W`V4      # )uç  Evaluate every achievement definition against a scan result. Used by ``compute_all``
for finished scans AND by the background progress callback for in-flight snapshots;
``is_partial=True`` skips persisting ``state.json`` unlocks â€” an "unlock time" from
half a scan could be invalidated by a later session. Persisted unlocks are still read
for partials: the background scan publishes them to the cache, so an earned badge would
otherwise render as locked for the whole rescan (#112273).rå  r'  r   rÔ  Úunlocked_atÚ
first_tierrÚ  Úevidencer1  T)rÔ  rÕ  r   rÚ  )r4  r)  r3  rC  rL  rè   r  rj  rÇ  rÃ  r  r,  r{  )rm  r|  rå  r   r'  rB  rl  rß  ÚresultÚ	unlock_idr7   s   &$         r'   Ú_compute_from_scanr„  É  sµ  € ð —‘˜ bÓ)€IÜ‹L€EØ×Ñ˜y¨"Ó-€GÜ
Œd�iŠi‹kÓ
€CØ€Iß"�lˆ
Ü$ ZÓ;ˆØ˜tÕ$ˆ	ß˜f Z×0Ô0°YÔ5MØ"/°°lÀFÇJÁJÈvÓDVÐXbÔdpÐq{÷  ~Fñ  ~Fð  GQð  SUó  ~Vó  eWð  "XˆGÑð Ô¨¨z×(:Ô(:Ø�M‰M 4°DÀ
Ø%Ÿz™z¨&Ó1×YÐY°WÕ5G×5KÑ5KÈLÓ5Yð ô [à'�*Ð' Ð'ˆØ�*×ÔØ")§+¡+¨i¸Ó"<×"@Ñ"@ÀÓ"OˆD�ÑØ&Ÿ{™{¨9°bÓ9×=Ñ=¸jÓI×ÐÌ\ÐZd×fnÑfnÐoyÐ{}Óf~ÓMˆD�ÑØ×ÑÔ,¨TÓ2×3ñ #÷ Ü�5ÔÜ�Y cÓ*Ð*r)   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r)  r*  r+  rC  r$   r   r%   )r&   s   "r'   r(   r(   é  s"   € ÷ 6ñ 6 =ð 6Èð 6ÐWeñ 6r)   c                ó4   € \        WR 7      p\        VRR7      # ))r)  r+  F©r|  )rO  r„  )r)  r+  rm  s   && r'   Úcompute_allrˆ  é  s   € ÜÐ+<Ô\€DÜ˜d¨uÔ5Ð5r)   zOptional[threading.Thread]Ú_BACKGROUND_SCAN_THREADc               ó    € V ^8„  d   QhRRRR/# )r   rB  rC  r$   r   r%   )r&   s   "r'   r(   r(   ò  s   € ÷ 	]ñ 	] ð 	]¨ñ 	]r)   c                óš  € \          Uu. uFœ  p\        / VCRRRRRVP                  R4      '       d   RMRR^ R^ RVP                  R	4      ;'       g    / .^ ,          P                  R
4      RVP                  R	4      ;'       g    / .^ ,          P                  R^4      RR/C4      NKž  	  pp\        VR\	        R^ 4      RR/V 4      # u upi )z”Structurally-complete placeholder served while the first-ever scan runs, so the UI
renders an empty list + spinner without special-casing "no data".rÔ  FrÕ  r   r   rÖ  rØ  rÛ  r   r   r×  r3   rÚ  Nr0  Úpendingr/  )rè   r  r4  r{  r&  )rB  Údrl  s   &  r'   Ú_build_pending_snapshotrŽ  ò  sç   € õ óñ
 ˆAô	 	ð ]Øð]Ø˜U L°%¸ÈaÏeÉeÐT\ÏoÊoÁ(ÐcoÐq{Ð}~Ø˜A˜{¨Q¯U©U°7«^×-CÐ-CÀ¸tÀQÕ,G×,KÑ,KÈFÓ,SØ˜qŸu™u W›~×5Ð5°"°°qÕ9×=Ñ=¸kÈ1ÓMÈvÐW[ñ]ö 	^ñ ð ð ô �Y ¬j¸ÀAÓ.FÈÐQUÐ VÐX[Ó\Ð\ùòs   ‰ACÁ1CÂ'Cc               ó$   € V ^8„  d   QhRRRRRR/# )r   rI  r   ÚatrC  r$   r
  r%   )r&   s   "r'   r(   r(   þ  s!   € ÷ ñ ˜ð ¨Sð °Tñ r)   c                ó    € \        V 4      sVsR # r  )r  r   rE  )rI  r�  s   &&r'   Ú
_set_cacher’  þ  s   € ä  Ó*€OØÒr)   c               ó    € V ^8„  d   QhRRRR/# )r   Úpublish_partial_snapshotsr#   r$   r
  r%   )r&   s   "r'   r(   r(     s   € ÷ ^ñ ^¸$ð ^È$ñ ^r)   c                ó  € \         ;_uu_ 4        \        \        P                  ! 4       4      p\        P	                  RVRR7       R p \        \        V '       d   TMRR7      4      p\        T\        VP                  R4      ;'       g    \        \        P                  ! 4       4      4      4       \        \        \        4       R\        R&   \        \        P                  ! 4       4      p\        P	                  V\        WQ,
          R,          4      \        \        P                  R^ 4      4      ^,           R7        RRR4       R#   \         d+   p\        P	                  R	\        T4      R
7        Rp?L«Rp?ii ; i  \        \        P                  ! 4       4      p\        P	                  T\        YQ,
          R,          4      \        \        P                  R^ 4      4      ^,           R7       i ; i  + '       g   i     R# ; i)aE  Execute a scan + snapshot update (synchronously or from a thread). With
``publish_partial_snapshots`` (background scans) the scanner periodically publishes
in-progress snapshots to ``_SNAPSHOT_CACHE`` so a long cold scan unlocks badges
incrementally; synchronous /rescan callers pass ``False`` since they block on the result.ÚrunningN)r   r   r   c                ó”   €  R V R\        V 4      R\        RWVR7      /p\        \        VRR7      ^ 4       R#   \         d     R# i ; i)r1  rå  r0  Úin_progress)r  r  Tr‡  N)r@  r&  r’  r„  rñ   )Úpartial_sessionsr  r  Úpartial_scans   &&& r'   Ú_publish_partialÚ4_run_scan_and_update_cache.<locals>._publish_partial  sT   € ð
àÐ 0Ø¤Ð1AÓ!BØ¤¨M¸>Ðy~Ô!ð �ô Ô-¨lÀtÔLÈaÖPøÜô Úðús   ‚48 ¸AÁA)r)  r0  r   r   r1  )r   r   éè  r   )r   r   r   )Ú
_SCAN_LOCKrC  rL  r   rÇ  r  rˆ  r’  r4  r  ÚSNAPSHOT_FILEr   rñ   r   )r”  Ústartedr›  ÚcomputedrB  Úfinisheds   &     r'   Ú_run_scan_and_update_cacher£    s¾  € ÷
 
ŽÜ”d—i’i“kÓ"ˆÜ×Ñ )¸ÈDÐÔQò	ð		^Ü!¤+×TmÑ@PÐswÔ"xÓyˆHÜ�x¤ X§\¡\°.Ó%A×%UÐ%UÄSÌÏÊËÓEUÓ!VÔWÜœ¤Ô7Ø$*ŒL˜Ñ!ô œ4Ÿ9š9›;Ó'ˆHÜ×Ñ¨HÄsÈHÕL^ÐbfÕKfÓGgÔsvô  xD÷  xHñ  xHð  ITð  VWó  xXó  tYð  \]õ  t]Ðõ  ^÷5 
‰øô, ô 	EÜ×Ñ h¼3¸s»8Ð×DÑDûð	Eûô œ4Ÿ9š9›;Ó'ˆHÜ×Ñ¨HÄsÈHÕL^ÐbfÕKfÓGgÔsvô  xD÷  xHñ  xHð  ITð  VWó  xXó  tYð  \]õ  t]Ðõ  ^ú÷5 
�ˆúsK   �:G8Á
AEÂAEÃA0G8ÅF Å E;Å6FÅ;F Æ FÆA2G5Ç5G8Ç8H		c               ó   € V ^8„  d   QhRR/# )r   r$   r
  r%   )r&   s   "r'   r(   r(   &  s   € ÷ 	ñ 	 ñ 	r)   c            	     ó  € \         ;_uu_ 4        \        p V e"   V P                  4       '       d    RRR4       R# \        P                  ! \
        RR/RRR7      pVsVP                  4        RRR4       R#   + '       g   i     R# ; i)zIKick off a daemon-thread scan unless one is already running (idempotent).Nr”  Tzhermes-achievements-scan)ÚtargetÚkwargsr   rN   )Ú_BACKGROUND_SCAN_LOCKr‰  Úis_aliveÚ	threadingÚThreadr£  r4  )ÚexistingÚthreads     r'   Ú_start_background_scanr®  &  sy   € ÷ 
Ö	Ü*ˆØÒ H×$5Ñ$5×$7Ò$7Ø÷ 
Ñ	ô ×!Ò!Ô)CÐMhÐjnÐLoð  wQð  Z^ô  _ˆØ"(ÐØ�‰Œ÷ 
×	×	Ò	ús   � A7°A7»2A7Á7B	c               ó    € V ^8„  d   QhRRRR/# )r   Úforcer#   r$   r   r%   )r&   s   "r'   r(   r(   2  s   € ÷ \ñ \˜ð \¨ñ \r)   c                óÜ  € \        \        P                  ! 4       4      pV '       g"   \        V4      '       d   \        ;'       g    / # \        fV   \	        \
        4      p\        V\        4      '       d1   Vs\        VP                  R4      ;'       g    ^ 4      ;'       g    Ts	V '       d   \        RR7       M\        V4      '       g   \        4        \        e   \        # \        V4      # )a¤  Return the current achievements payload: a fresh in-memory cache is returned as is;
a stale on-disk snapshot is served while a background rescan runs (UI decorates it with
``is_stale=True``); with no snapshot yet an empty-but-valid "pending" payload is served
while the first scan runs; ``force=True`` (manual /rescan) scans synchronously. Cold
scans on 8000+ session databases take minutes, hence the background thread.r0  F)r”  )rC  rL  rG  r   r  rŸ  r  r  r4  rE  r£  r®  rŽ  )r°  rB  Ú	persisteds   &  r'   Úevaluate_allr³  2  sª   € ô Œd�iŠi‹kÓ
€Cß”_ S×)Ò)Ü×$Ð$ "Ð$äÒÜœ}Ó-ˆ	Ü�i¤×&Ò&Ø'ˆOÜ!$ Y§]¡]°>Ó%B×%GÐ%GÀaÓ!H×!OÐ!OÈCÐßä"¸UÖCÜ˜S×!Ò!ô 	Ô Ü-Ò9Œ?Ð[Ô?VÐWZÓ?[Ð[r)   z/achievementsc               ƒ  óà   "  € \        4       p R Uu/ uF  qV 9   g   K  WV,          bK  	  pp\        V 4      VR&   / V P                  R4      ;'       g    / CR\        4       /CVR&   V# u upi 5i)ro  Úis_staler0  Ústatus)ro  rp  ru  rx  rz  r/  r0  )r³  rN  r4  rW  )r	  r"  Úpayloads      r'   ro  ro  N  sŒ   é € ä‹>€Dñ $Ró  `ñ  $R˜að  [_ñ  V_Œzˆq�q•'Šzñ  $R€Gð  `Ü,¨TÓ2€GˆJÑØ^˜tŸx™x¨Ó4×:Ð:¸Ð^¸XÔG[ÓG]Ñ^€GˆKÑØ€Nùò `ùs   ‚A.‘A)žA)«(A.ÁA.z/scan-statusc               ƒ  ó   "  € \        4       # 5ir  )rW  r%   r)   r'   Úscan_statusr¹  W  s   é € äÓ!Ð!ùs   ‚z/recent-unlocksc               ƒ  ó¢   "  € \        4       p \        V R ,           Uu. uF  qR,          '       g   K  VNK  	  upR RR7      R,          # u upi 5i)ro  rÔ  c                ó8   € V P                  R 4      ;'       g    ^ # )r  r?  )rs  s   &r'   rê  Ú recent_unlocks.<locals>.<lambda>_  s   € ÐTU×TYÑTYÐZgÓTh×TmÐTmÐlmÐTmr)   T)rj   Úreverse:Né   N)r³  r!  )r	  rs  s     r'   Úrecent_unlocksr¿  \  sN   é € ä‹>€DÜ˜d >Ö2ÓDÑ2˜¸
·m±m—1�1Ñ2ÑDÑJmÐw{Ô|ð  ~Aõ  Bð  BùÒDùs   ‚A�A
²A
¸Az/sessions/{session_id}/badgesc               ó   € V ^8„  d   QhRR/# )r   r‡  r   r%   )r&   s   "r'   r(   r(   c  s   € ÷ xñ x Sñ xr)   c              ƒ  óR  a "  € \        4       p\        V 3R  lVR,           4       R4      pV'       g   RS R. /# \        V.4      p\         Uu. uF  qD\	        WC4      3NK  	  ppRS RV UUu. uF%  w  rFVR,          '       g   K  \        / VCVC4      NK'  	  upp/# u upi u uppi 5i)c              3  óF   <"  € T F  qR ,          S8X  g   K  Vx € K  	  R# 5i)r‡  Nr%   )r  ra  r‡  s   & €r'   r  Ú!session_badges.<locals>.<genexpr>e  s   øé € ÐQÑ/˜!°\µ?ÀjÑ3P—A’AÓ/ùs   ƒ!—
!r1  Nr‡  ÚbadgesrÔ  )r³  Únextr@  rè   r  r  )r‡  r	  Úsessionrå  r�  Úresultsr  s   f      r'   Úsession_badgesrÈ  b  s«   øé € ä‹>€DÜÔQ˜t JÖ/ÓQÐSWÓX€GßØ˜j¨(°BÐ7Ð7Ü  	Ó*€IÝ?KÓL¹|¸!Ô& qÓ4Ó5¹|€GÐLØ˜* hÑ]dÔ0vÑ]dÑUYÐUVÐhiÐjt×huÑhuÔ1PÔ1DÀZÈÀZÈQÀZÖ1PÑ]dÒ0vÐwÐwùò MùÛ0vùs$   ƒA
B'ÁBÁ"
B'Á,B!ÂB!ÂB'z/rescanc               ƒ  ó*   "  € R R/\        RR7      C# 5i)ÚokT)r°  )r³  r%   r)   r'   ÚrescanrË  m  s   é € à�$Ð3œ,¨TÔ2Ð3Ð3ùs   ‚z/reset-statec               ƒ  óê   "  € \        R / /4       Rs^ s\        P	                  RRRRRR7       \
        \        3 F  p  \        V 4      P                  RR7       K!  	  RR/#   \         d     K5  i ; i5i)r'  Nr   )r   r   r   r   r   T)Ú
missing_okrÊ  )
r,  r   rE  r   rÇ  rŸ  r2  r  Úunlinkrñ   )r   s    r'   Úreset_staterÏ  r  s‚   é € ô �	˜2ˆÔØ€OØÐÜ×Ñ˜f°À4ÐTXÐkoÐÔpÜ¤Ó0ˆð	Ü�tÓ×#Ñ#¨tÐ#Ö4ñ 1ð
 �$ˆ<Ðøô ô 	Úð	üs(   ‚;A3¾A!ÁA3Á!A0Á,A3Á/A0Á0A3)ÚCopperÚSilverÚGoldÚDiamondÚOlympian)éÈ   éô  é°  é¸  é@  )r�  rØ  rÙ  é N  éPÃ  )é   é   é-   éF   éd   ))rG   é´   )rH   éx   )rI   é<   )é   é(   rà  r�  éˆ  )é,  é   éÐ  ép  é˜:  )éÜ  é   é'  é¨a  iø$ )rç  r�  rØ  rÙ  rÚ  )é   rå  rà  rç  r�  )é   éK   rÕ  éX  rì  )rd   rñ  )re   é
   )rh   é2   )rU   rí  )ræ  rë  i@œ  i † i�Ð )rò  rÕ  ró  rì  rí  )rç  ró  r×  iÄ	  rê  )é–   é�  r�  rØ  rÙ  )rç  i¼  rì  rí  rî  )rÚ  rÛ  iÀÔ ià“ i 5 )r   rõ  )r>   rÖ  )rî  i0u  i€8 i@ i ¡ )r…   rä  )rà  rç  r�  rØ  rÙ  )rÖ  rì  rí  rî  rï  )r÷  r×  rØ  rÙ  rÚ  )éî  ré  rê  rë  rÛ  )éú   rø  ré  rê  rë  )rô  é   rà  rç  rè  )rô  r¾  rå  éP   é    )rä  rô  r¾  rå  rû  )r   é   rä  é   é   )rõ  rö  rÖ  rì  rí  )é   rý  rô  rú  rà  )r¾  rã  rÕ  ró  rì  )rà  rç  r�  rØ  rî  )rà  rç  rè  i`	  rê  )rõ  rö  rÖ  rì  ræ  )rò  rÕ  rÖ  rì  ræ  r  )ÚopenaiÚ	anthropicrw  rv  Úmistralr8  ÚqwenÚdeepseekÚxaiÚnousÚollamaÚgroqr¿  rÁ   )r  z	llama.cppÚ	localhostz	127.0.0.1zlocal/zlocal:Úggufz
vllm-local)NNrù  )Nrù  )T)F)`Ú__conditional_annotations__Ú__doc__Ú
__future__r   r  rð  r—  rª  rL  Úpathlibr   Útypingr   r   r   r   r   Úfastapir	   Úhermes_constantsr
   r¾   rF  ÚLockrž  r   Ú__annotations__rE  r   Úcompiler™  rÅ  rÊ  rË  rÌ  rÈ  r6   r;   rè   rŸ  r2  r5  rô   r  r  r  r  r)  r,  r6  r@  rG  rN  rW  r\  rb  rp  r|  r„  r~  r…  rÒ  rÝ  râ  rø  rþ  r  r  r  r  r  r&  rO  rW  rX  rY  r@  rj  r{  r„  rˆ  r‰  r¨  rŽ  r’  r£  r®  r³  r4  ro  r¹  r¿  rÈ  ÚpostrË  rÏ  )r  s   @r'   Ú<module>r     sQ  øðôõ #ã Û Û 	Û Û Ý ß 1Õ 1å å ,á	‹€àÐ Ø�^Š^Ó€
Ø,0€Ð)Ó 0ØÐ à '¨°¸tÀ]ÐTXÐZfÐhlð  oAð  CGð  ITð  VWð   X€ˆnó  Xà�:Š:ð  Pð  RT÷  R_ñ  R_ó  `€Ø
�*Š*ÐvÐxz÷  yFñ  yFó  G€Ø�ZŠZÐHÈ"Ï-É-ÓX€
Ø�ZŠZÐjÐln×lyÑlyÓz€
Ø
�*Š*ÐsÓ
t€ã@€
ðà ðà?Cðð '+ðð <A÷ð&O&áˆ˜Ð)iÐk{ð  ~Eð  Nió  qMô  NðO&ñ 	Ð	Ð!7ð  :Að  CSð  U`ð  i{ó  Ccô  dðO&ñ 	Ð	Ð/Ð1mÐoð  BIð  Rqó  yNô  Oð	O&ñ
 	ˆ�kÐ#gÐiyð  |Dó  OJô  KðO&ñ 	Ð	Ð3Ð5WÐYiÐksð  }Só  [sô  tðO&ñ 	Ð	%Ð'Cð  FLð  N^ð  `hð  qFó  Nkô  lðO&ñ 	Ð	Ð/Ð1aÐcsÐu|ð  FXó  `@ô  AðO&ñ 	Ð	Ð!7Ð9tð  wHð  JSð  \jó  rSô  TðO&ñ 	Ð	 Ð"9Ð;lÐnð  BHð  Qcó  kIô  JðO&ñ 	Ð	!Ð#;Ð=kÐm~ð  AIð  Rcó  kKô  LðO&ñ 	Ð	Ð0Ð2{ð  ~Oð  QWð  `vó  ~Vð  _cô  dðO&ñ 	Ð	(Ð*BÐDeÐgxð  {Að  Jdó  lDð  MQô  RðO&ñ  	Ð	"Ð$=Ð?tð  wHð  JYñ  eAñ  Cað  dbô  cð!O&ñ" 	Ð	!Ð#>Ð@}ð  @Qð  S\ñ  hJñ  Lbð  gcô  dð#O&ñ$ 	Ð	Ð3ð  6Að  CTð  V[ð  dzó  Bfð  osô  tð%O&ñ& 	Ð	Ð 5Ð7YÐ[lÐnuð  Ró  Zzð  CGô  Hð'O&ñ( 	Ð	 Ð"9Ð;pð  sDð  FQð  Zró  zTð  ]aô  bð)O&ñ. 	Ð	Ð!@ÐBlÐn{ð  ~Mð  Voó  wSô  Tð/O&ñ0 	Ð	 Ð"9ð  <Jð  LYð  [cð  lLó  Tpô  qð1O&ñ2 	Ð	Ð+Ð-aÐcpÐr}ð  Geó  mJô  Kð3O&ñ4 	ˆ˜Ð)]Ð_lÐnuð  Yó  aGô  Hð5O&ñ6 	Ð	Ð!8Ð:dÐfsÐu{ñ  HZñ  \~ð  Gô  @ð7O&ñ8 	ˆ˜Ð)]Ð_lÐn|ð  F[ó  cHô  Ið9O&ñ: 	Ð	Ð1Ð3lÐn{ð  ~Fñ  Rwñ  yOð  QPð  Y]ô  ^ð;O&ñ@ 	ˆ�|Ð%\Ð^mÐo~ð  HVó  ^Bô  CðAO&ñB 	Ð	$Ð&Cð  FIð  KZð  \cð  lAó  Iaô  bðCO&ñD 	ˆ˜/Ð+`ÐbqÐs|ð  FUó  ]yô  zðEO&ñF 	ˆ˜/Ð+RÐTcÐemð  wLó  Tpô  qðGO&ñH 	Ð	Ð+Ð-uð  xGð  IQð  Zjó  rVô  WðIO&ñJ 	Ð	Ð-Ð/aÐcrÐt}ð  GWó  _Cô  DðKO&ñL 	ˆ˜/Ð+fÐhwð  zBð  KZó  bBô  CðMO&ñN 	Ð	Ð-Ð/[Ð]lÐnvð  @Qó  Yxð  AEô  FðOO&ñT 	Ð	 Ð"9ð  <Cð  ESð  U]ð  fwó  ]ô  ^ðUO&ñV 	Ð	Ð-Ð/eÐguÐw~ð  Haó  iEô  FðWO&ñX 	Ð	Ð3Ð5gÐiwð  zCð  Lbó  jNô  OðYO&ñZ 	Ð	Ð3Ð5gÐiwð  zCð  L[ó  c}ô  ~ð[O&ñ` 	Ð	Ð-Ð/RÐTbÐdnð  xNó  Vuô  vðaO&ñb 	ˆ˜Ð)YÐ[iÐkqð  {Nó  Vsô  tðcO&ñd 	Ð	Ð3Ð5jÐlzð  }Eð  Nió  qPô  QðeO&ñf 	Ð	Ð-Ð/mÐo}ð  @Eð  Nbó  jFô  GðgO&ñh 	Ð	Ð!7Ð9jÐlzð  }Cð  LWó  _vô  wðiO&ñn 	ˆ˜Ð)iÐkwÐyð  IWó  _Dô  EðoO&ñp 	Ð	Ð3Ñ5fÐhtÑv~ñ  H[ó  c@ô  AðqO&ñr 	Ñ	Ñ+Ñ-jÐlxñ  {Bñ  KYó  a@ô  AðsO&ñt 	Ñ	Ñ/Ñ1sð  vBñ  DKñ  Tjó  rGô  HðuO&ñv 	Ñ	Ñ1ñ  4Gð  IUñ  W^ñ  g}ó  EXô  YðwO&ñx 	Ñ	Ñ1Ñ3nÐp|ð  Eñ  Ngó  oô  @ðyO&ñz 	Ñ	Ñ-Ñ/rð  uAð  CIð  R`ó  hEô  Fð{O&ñ| 	Ñ	Ñ/Ñ1pÐr~ð  AHñ  Q`ó  hBô  Cð}O&ñ~ 	Ñ	Ñ 5Ñ7qÐsð  BKñ  Tcó  kEô  FðO&ñ@ 	Ñ	Ñ!7ñ  :Hð  JVð  Xbñ  kFó  Naô  bðAO&ñF 	Ñ	Ñ!7ñ  :Fð  HWð  Ybñ  k{ó  C[ô  \ðGO&ñH 	Ñ	Ñ+ñ  .Mð  O^ð  `eñ  n}ó  Ebô  cðIO&ñJ 	Ñ	Ñ+Ñ-uð  xEð  GOñ  Xló  tKô  LðKO&ñL 	Ñ	Ñ/Ñ1ð  BPð  RZñ  cpó  xSô  TðMO&ñN 	Ñ	Ñ1ñ  4Bð  DRð  TYñ  buó  }Wô  XðOO&ñT 	Ñ	Ñ1Ñ3dÑfqÑs}ñ  GVó  ^xô  yðUO&ñV 	Ñ	Ñ-Ñ/lÑnyñ  |Fñ  Oaó  iAô  BðWO&ñX 	Ñ	Ñ!7Ñ9hÑjuÑw}ñ  GWó  _wô  xðYO&ñZ 	Ñ	 Ñ"9Ñ;jÑlwñ  zAñ  JXó  `|ð  EIô  Jð[O&€Ñ"ô Oñf %€Ù(€ð Ð ÷÷÷÷^÷÷5÷
%÷]÷w÷^÷Lò L÷
	=ò 	=÷H÷	÷Só
 _Ð Ûl€÷	2÷^÷
_÷HH÷
-÷E÷L÷*8ð>DØÑ!<ð>Dà#Ñ%Pð>Dð $Ñ%Dð>Dð %Ñ&Nð	>Dð
 'Ñ(\ð>Dð Ñ8ð>Dð #Ñ$Bð>Dð Ñ:ð>Dð ÑCð>Dð Ñ;ð>Dð Ñ>ð>Dð Ñ9ð>Dð Ñ(ð>Dð ÑAð>Dð Ñ :ð>Dð  Ñ6ð!>Dð" ÑNñ#>Dð$ !Ñ"Oð%>Dð& ÑMð'>Dð( Ñ6ð)>Dð* Ñ?ð+>Dð, Ñ Jð->Dð. ÑJð/>Dð0 Ñ)ð1>Dð2 %Ñ&Rð3>Dð4 Ñ7ð5>Dð6 ÑHð7>Dð8 Ñ6ð9>Dð: Ñ2ð;>Dð< ÑOð=>Dð> Ñ:ð?>Dð@ ÑDðA>DðB Ñ>ðC>DðD Ñ@òE>DðF Ñ5ðG>DñH Ñ.ðI>DñJ Ñ$ðK>DñL Ñ5ðM>DðN Ñ>ðO>DðP Ñ;ðQ>DðR Ñ8ðS>DðT Ñ4ðU>DðV Ñ5ðW>DðX Ñ8ðY>DðZ  Ñ!Hð[>Dð\ ÑAð]>Dð^ Ñ5ð_>Dñ` ÑKða>Dñb ÑXðc>Dñd Ñ6ðe>Dñf Ñ3ñg>Dñh Ñ<ÙÑ!\ÙÑ7ÙÑBÙÑ]ÙÑ=ÙÑUÙÑDÙÑ&ÙÑ6ÙÑBñ}>D€÷B?÷A÷ñ¸!ñ È1ñ Ðnrñ ð  UY÷ ñ ÷JJò JJð^  Ñ!2Ø#Ñ%:Ø™Ø#Ñ%5Ø$Ñ&7Ù¡Ø&Ñ(;Ø"Ñ$9ð;Ð ð ‘MØÑ)ØÑ,Ø‘{ØÑ2Ø™ØÑ!6ØÑ,Ø™?Ø™Ø�_ØÐ.Ø�ðÐ ðØðØ)ðØ+AðØC]ðØ_uðð xPðð Rnðð pFðð H[ðð ]uðð wQðð Shðð jvðð xXðð Zhðð jðð APðð Rgðð iyðð {Kðð M\ðð ^oðð qGðð IWðñ Ylðñ n|ðñ ~M	ðñ O	^	ðñ `	t	ðñ v	F
ðñ H
W
ðñ Y
m
ðñ o
|
ðñ ~
Qðñ Scðñ esðÐ ÷
÷B`÷ñ+À5÷ +ñ +÷@6ò 6ð
 7;Ð Ñ3Ô :Ø!ŸšÓ(Ð ÷	]÷÷^ò ^÷D	÷\ò \ð8 ‡�‰OÓòó ðð ‡�‰NÓò"ó ð"ð ‡�ÑÓòBó ðBð
 ‡�Ñ+Ó,öxó -ðxð ‡�‰YÓò4ó ð4ð ‡�‰^Óòó òr)   