PK.!m5hierwiki/__init__.pyPK&?m5čą$hierwiki/formatter.py# Relative wiki link formatter # Anti-cache code taken from Alec Thomas's AutoWikify plugin from trac.core import * from trac.web.api import IRequestFilter from trac.wiki.api import WikiSystem, IWikiSyntaxProvider, IWikiChangeListener from trac.wiki.model import WikiPage from trac.util.html import html, escape try: set = set except: from sets import Set as set __all__ = ['RelativeWikiFormatter'] def error(msg, *args): return html.DIV(html.P(msg%args), class_='system-message') class RelativeWikiFormatter(Component): """Format links to pages relative to the current page.""" implements(IWikiSyntaxProvider, IWikiChangeListener, IRequestFilter) def __init__(self): self._all_pages() self.pagebase = None self.pages_re = '' # IWikiSyntaxProvider methods def get_wiki_syntax(self): self.log.debug('HierWikiPlugin: Adding syntax') yield self.pages_re, self._format_syntax def get_link_resolvers(self): yield 'relwiki', self._format_link yield 'rwiki', self._format_link # IWikiChangeListener methods (defeat the page cache) def wiki_page_added(self, page): self.pages.add(page.name) self.pagebase = None def wiki_page_changed(self, page, version, t, comment, author, ipnr): pass def wiki_page_deleted(self, page): if page.name in self.pages: self.pages.remove(page.name) else: self._all_pages() self.pagebase = None def wiki_page_version_deleted(self, page): pass # IRequestFilter methods def pre_process_request(self, req, handler): self.log.debug('HierWikiPlugin: In pre-req filter') if req.path_info.startswith('/wiki'): self._update(req.args.get('page', 'WikiStart')) return handler def post_process_request(self, req, template, content_type): return template, content_type # Internal methods def _format_link(self, formatter, ns, target, label): if not formatter.req.path_info.startswith('/wiki'): return error('You can only use relative wiki links on wiki pages') if target.startswith('/'): return error('"%s" is not a relative path', target) pagename = formatter.req.args.get('page', 'WikiStart').split('/')[:-1] target = target.split('/') for val in target: if val == '.': continue elif val == '..': try: del pagename[-1] except IndexError: pass # XXX: What should be done here else: pagename.append(val) dest = '/'.join(pagename) return formatter.wiki.link_resolvers['wiki'](formatter, 'wiki', dest, label) def _format_syntax(self, formatter, ns, match): page = match.group('relwiki') return html.A(escape(page), href=formatter.href.wiki(self.pagebase.rstrip('/'),page), class_='wiki') # More cache junk def _all_pages(self): self.pages = set(WikiSystem(self.env).get_pages()) def _update(self, pagename): self.log.debug('HierWikiPlugin: Running an update') pagebase = '/'.join(pagename.split('/')[:-1]) if pagebase != '': pagebase += '/' if pagebase != self.pagebase or self.pagebase is None: pages = set([p[len(pagebase):] for p in self.pages if p.startswith(pagebase)]) pattern = r'\b(?P' + '|'.join(pages) + r')\b' self.log.debug('HierWikiPlugin: pagebase=%r pages=%r pattern=%r', pagebase, pages, pattern) self.pages_re = pattern self.pagebase = pagebase WikiSystem(self.env)._compiled_rules = None PKĚ*m5AÖi,ęęhierwiki/filter.pyfrom trac.core import * from trac.web.api import IRequestFilter from trac.wiki.api import IWikiPageManipulator from trac.wiki.model import WikiPage from trac.wiki.web_ui import WikiModule __all__ = ['EnforceHierarchyModule'] class EnforceHierarchyModule(Component): """This check that all subpaths under a wiki page exist. This enforces a hierarchy, and prevents accidental misspellings.""" implements(IWikiPageManipulator) # IWikiPageManipulator methods def prepare_wiki_page(self, *args): pass # Not currently called def validate_wiki_page(self, req, page): comps = page.name.split('/') del comps[-1] # This is the component we are adding to the hierarchy check = [] for comp in comps: check.append(comp) check_page = WikiPage(self.env, '/'.join(check)) if not check_page.exists: yield ('name', 'Hierarchy component "%s" does not exist'%check_page.name) PK@m5@˜bwhierwiki/__init__.pyc;ň H6XEc@sdS(N((((s/build/bdist.linux-i686/egg/hierwiki/__init__.pys?sPK@m55ăE˙ááhierwiki/formatter.pyc;ň ¨kXEc@sšdkTdklZdklZlZlZdklZdk l Z l Z y e Z Wndk lZ nXdgZd„Zdefd„ƒYZd S( (s*(sIRequestFilter(s WikiSystemsIWikiSyntaxProvidersIWikiChangeListener(sWikiPage(shtmlsescape(sSetsRelativeWikiFormattercGs$titi||ƒddƒSdS(Nsclass_ssystem-message(shtmlsDIVsPsmsgsargs(smsgsargs((s0build/bdist.linux-i686/egg/hierwiki/formatter.pyserrorscBs“tZdZeeeeƒd„Zd„Zd„Z d„Z d„Z d„Z d„Z d„Zd „Zd „Zd „Zd „Zd „ZRS(s3Format links to pages relative to the current page.cCs |iƒt|_d|_dS(Ns(sselfs _all_pagessNonespagebasespages_re(sself((s0build/bdist.linux-i686/egg/hierwiki/formatter.pys__init__s  ccs$|iidƒ|i|ifVdS(NsHierWikiPlugin: Adding syntax(sselfslogsdebugspages_res_format_syntax(sself((s0build/bdist.linux-i686/egg/hierwiki/formatter.pysget_wiki_syntaxsccsd|ifVd|ifVdS(Nsrelwikisrwiki(sselfs _format_link(sself((s0build/bdist.linux-i686/egg/hierwiki/formatter.pysget_link_resolvers"s cCs |ii|iƒt|_dS(N(sselfspagessaddspagesnamesNonespagebase(sselfspage((s0build/bdist.linux-i686/egg/hierwiki/formatter.pyswiki_page_added'scCsdS(N((sselfspagesversionstscommentsauthorsipnr((s0build/bdist.linux-i686/egg/hierwiki/formatter.pyswiki_page_changed+scCsA|i|ijo|ii|iƒn |iƒt|_dS(N(spagesnamesselfspagessremoves _all_pagessNonespagebase(sselfspage((s0build/bdist.linux-i686/egg/hierwiki/formatter.pyswiki_page_deleted.s cCsdS(N((sselfspage((s0build/bdist.linux-i686/egg/hierwiki/formatter.pyswiki_page_version_deleted5scCsK|iidƒ|iidƒo |i|iiddƒƒn|SdS(Ns!HierWikiPlugin: In pre-req filters/wikispages WikiStart( sselfslogsdebugsreqs path_infos startswiths_updatesargssgetshandler(sselfsreqshandler((s0build/bdist.linux-i686/egg/hierwiki/formatter.pyspre_process_request9s cCs||fSdS(N(stemplates content_type(sselfsreqstemplates content_type((s0build/bdist.linux-i686/egg/hierwiki/formatter.pyspost_process_request?scCs|iiidƒ otdƒSn|idƒotd|ƒSn|iiiddƒidƒd }|idƒ}xa|D]Y}|djoqq|d jo%y |d=WqÚt j oqÚXq|i |ƒqWdi |ƒ}|iid |d ||ƒSdS( Ns/wikis2You can only use relative wiki links on wiki pagess/s"%s" is not a relative pathspages WikiStarti˙˙˙˙s.s..swiki(s formattersreqs path_infos startswithserrorstargetsargssgetssplitspagenamesvals IndexErrorsappendsjoinsdestswikislink_resolversslabel(sselfs formattersnsstargetslabelsvalsdestspagename((s0build/bdist.linux-i686/egg/hierwiki/formatter.pys _format_linkCs$%    cCsM|idƒ}tit|ƒd|ii|i i dƒ|ƒddƒSdS(Nsrelwikishrefs/sclass_swiki( smatchsgroupspageshtmlsAsescapes formattershrefswikisselfspagebasesrstrip(sselfs formattersnssmatchspage((s0build/bdist.linux-i686/egg/hierwiki/formatter.pys_format_syntaxXscCs"tt|iƒiƒƒ|_dS(N(ssets WikiSystemsselfsenvs get_pagesspages(sself((s0build/bdist.linux-i686/egg/hierwiki/formatter.pys _all_pages]scCs|iidƒdi|idƒd ƒ}|djo|d7}n||ijp |itjoŚtgi }|i D].}|i |ƒo||t|ƒƒq{q{~ƒ}ddi|ƒd}|iid|||ƒ||_||_tt|iƒ_ndS( Ns!HierWikiPlugin: Running an updates/i˙˙˙˙ss\b(?Ps|s)\bs/HierWikiPlugin: pagebase=%r pages=%r pattern=%r(sselfslogsdebugsjoinspagenamessplitspagebasesNonessetsappends_[1]spagessps startswithslenspatternspages_res WikiSystemsenvs_compiled_rules(sselfspagenamespatterns_[1]spspagebasespages((s0build/bdist.linux-i686/egg/hierwiki/formatter.pys_update`s  N  (s__name__s __module__s__doc__s implementssIWikiSyntaxProvidersIWikiChangeListenersIRequestFilters__init__sget_wiki_syntaxsget_link_resolversswiki_page_addedswiki_page_changedswiki_page_deletedswiki_page_version_deletedspre_process_requestspost_process_requests _format_links_format_syntaxs _all_pagess_update(((s0build/bdist.linux-i686/egg/hierwiki/formatter.pysRelativeWikiFormatters             N(s trac.cores trac.web.apisIRequestFilters trac.wiki.apis WikiSystemsIWikiSyntaxProvidersIWikiChangeListenerstrac.wiki.modelsWikiPagestrac.util.htmlshtmlsescapessetssetssSets__all__serrors ComponentsRelativeWikiFormatter( ssetsWikiPages__all__serrorsIRequestFiltersIWikiSyntaxProvidershtmlsRelativeWikiFormattersescapesIWikiChangeListeners WikiSystem((s0build/bdist.linux-i686/egg/hierwiki/formatter.pys?s     PK@m5Ť&E‘hierwiki/filter.pyc;ň `GXEc@s^dkTdklZdklZdklZdklZdgZ de fd„ƒYZ dS((s*(sIRequestFilter(sIWikiPageManipulator(sWikiPage(s WikiModulesEnforceHierarchyModulecBs*tZdZeeƒd„Zd„ZRS(szThis check that all subpaths under a wiki page exist. This enforces a hierarchy, and prevents accidental misspellings.cGsdS(N((sselfsargs((s-build/bdist.linux-i686/egg/hierwiki/filter.pysprepare_wiki_pagesccs||iidƒ}|d=g}xV|D]N}|i|ƒt|i di |ƒƒ}|i odd|ifVq&q&WdS(Ns/i˙˙˙˙snames'Hierarchy component "%s" does not exist( spagesnamessplitscompsscheckscompsappendsWikiPagesselfsenvsjoins check_pagesexists(sselfsreqspagescompscheckscompss check_page((s-build/bdist.linux-i686/egg/hierwiki/filter.pysvalidate_wiki_pages  (s__name__s __module__s__doc__s implementssIWikiPageManipulatorsprepare_wiki_pagesvalidate_wiki_page(((s-build/bdist.linux-i686/egg/hierwiki/filter.pysEnforceHierarchyModule s   N( s trac.cores trac.web.apisIRequestFilters trac.wiki.apisIWikiPageManipulatorstrac.wiki.modelsWikiPagestrac.wiki.web_uis WikiModules__all__s ComponentsEnforceHierarchyModule(sIWikiPageManipulatorsWikiPages__all__sIRequestFiltersEnforceHierarchyModules WikiModule((s-build/bdist.linux-i686/egg/hierwiki/filter.pys?s      PK.!m5m˛J••hierwiki/macros/parentwiki.py# Macros for the HierWiki plugin from trac.core import * from trac.wiki.api import IWikiMacroProvider, WikiSystem from StringIO import StringIO import re, string, inspect class ParentWikiMacro(Component): """ Inserts a link to the "parent" wiki entry. This only applies to wikis that have a "/" in their name indicating heirarchy. e.g. an entry named Java/Introduction will have a parent of Java. All other wiki entries have a parent of WikiStart. """ # TODO: Everything until render_macro can be removed once switched to be based on WikiMacroBase implements(IWikiMacroProvider) def get_macros(self): """Yield the name of the macro based on the class name.""" name = self.__class__.__name__ if name.endswith('Macro'): name = name[:-5] yield name def get_macro_description(self, name): """Return the subclass's docstring.""" return inspect.getdoc(self.__class__) def render_macro(self, req, name, args): db = self.env.get_db_cnx() cursor = db.cursor() buf = StringIO() prefix = None if args: prefix = args.replace('\'', '\'\'') else: prefix = req.hdf.getValue('wiki.page_name', '') + '/' parent = 'WikiStart' m = re.search("(\S+)/(\S+)$", prefix) if m: parent = m.group(1) buf.write('' % self.env.href.wiki(parent)) buf.write(parent) buf.write('\n') return buf.getvalue() PK.!m54xďőööhierwiki/macros/subwiki.py# Macros for the HierWiki plugin from trac.core import * from trac.wiki.api import IWikiMacroProvider, WikiSystem from StringIO import StringIO import re, string, inspect class SubWikiMacro(Component): """ Inserts an alphabetic list of sub-wiki pages into the output. A sub-wiki page is a page that is is deeper in the hierachy than the current page. e.g. if the current page is People, the this will return a list of all wiki entries that start with "People/" Accepts a prefix string as parameter: if provided, only pages with names that start with the prefix are included in the resulting list. If this parameter is omitted, all pages are listed. This now takes the text of the first heading and displays it as the link name. """ # TODO: Everything until render_macro can be removed once switched to be based on WikiMacroBase implements(IWikiMacroProvider) def get_macros(self): """Yield the name of the macro based on the class name.""" name = self.__class__.__name__ if name.endswith('Macro'): name = name[:-5] yield name def get_macro_description(self, name): """Return the subclass's docstring.""" return inspect.getdoc(self.__class__) def render_macro(self, req, name, args): # Args seperated by commas: # prefix,level # # Page Name prefix to search for. # how many 'levels' in the hierarchy to go down. db = self.env.get_db_cnx() cursor = db.cursor() cs = db.cursor() prefix = req.hdf.getValue('wiki.page_name', '') + '/' level = None if args: args = args.replace('\'', '\'\'') args = args.split(',') if args[0] != 'None': prefix = args[0] if len(args) > 1 and args[1] != 'None': level = args[1] sql = 'SELECT DISTINCT name FROM wiki ' if prefix: sql += 'WHERE name LIKE \'%s%%\' ' % prefix sql += 'ORDER BY name' cursor.execute(sql) buf = StringIO() buf.write('
    ') while 1: row = cursor.fetchone() if row == None: break name = row[0] if level: len_name = name.split('/') #buf.write(len_name) if len(len_name) > int(level)+1: continue # Get the latest revision only. sql = 'SELECT name,text from wiki where name = \'%s\' order by version desc limit 1' % name cs.execute(sql) while 1: csrow = cs.fetchone() if csrow == None: break name = csrow[0] text = csrow[1] (linktext,title,desc) = self._getinfo(db,name) link = self.env.href.wiki(name) buf.write('
  • ' % (title,link)) buf.write(linktext) buf.write(' %s
  • \n' % desc) buf.write('
') return buf.getvalue() def _getinfo(self, db, name): cs = db.cursor() desc = name # Get the latest revision only. cs.execute('SELECT text from wiki where name = \'%s\' order by version desc limit 1' % name) csrow = cs.fetchone() prefix = '' if csrow != None: text = csrow[0] m = re.search('=+\s([^=]*)=+',text) if m != None: desc = string.strip(m.group(1)) else: prefix = "Create " title = StringIO() title.write("%s%s"%(prefix, desc)) if prefix != '' or desc == name: desc = '' return (name,title.getvalue(),desc) PK.!m5ŹŃ‡'!!hierwiki/macros/__init__.pyimport subwiki import parentwiki PK@m5<đ$& & hierwiki/macros/parentwiki.pyc;ň H6XEc@s\dkTdklZlZdklZdkZdkZdkZdefd„ƒYZ dS((s*(sIWikiMacroProviders WikiSystem(sStringIONsParentWikiMacrocBs3tZdZeeƒd„Zd„Zd„ZRS(s Inserts a link to the "parent" wiki entry. This only applies to wikis that have a "/" in their name indicating heirarchy. e.g. an entry named Java/Introduction will have a parent of Java. All other wiki entries have a parent of WikiStart. ccs2|ii}|idƒo|d }n|VdS(s4Yield the name of the macro based on the class name.sMacroiű˙˙˙N(sselfs __class__s__name__snamesendswith(sselfsname((s8build/bdist.linux-i686/egg/hierwiki/macros/parentwiki.pys get_macross  cCsti|iƒSdS(s Return the subclass's docstring.N(sinspectsgetdocsselfs __class__(sselfsname((s8build/bdist.linux-i686/egg/hierwiki/macros/parentwiki.pysget_macro_descriptionsc CsÚ|iiƒ}|iƒ}tƒ} t}|o|i ddƒ}n|i i ddƒd}d}tid|ƒ}|o|idƒ}n| id |iii|ƒƒ| i|ƒ| id ƒ| iƒSdS( Ns's''swiki.page_namess/s WikiStarts (\S+)/(\S+)$is s (sselfsenvs get_db_cnxsdbscursorsStringIOsbufsNonesprefixsargssreplacesreqshdfsgetValuesparentsressearchsmsgroupswriteshrefswikisgetvalue( sselfsreqsnamesargssparentsmsdbscursorsprefixsbuf((s8build/bdist.linux-i686/egg/hierwiki/macros/parentwiki.pys render_macro s     (s__name__s __module__s__doc__s implementssIWikiMacroProviders get_macrossget_macro_descriptions render_macro(((s8build/bdist.linux-i686/egg/hierwiki/macros/parentwiki.pysParentWikiMacro s    ( s trac.cores trac.wiki.apisIWikiMacroProviders WikiSystemsStringIOsresstringsinspects ComponentsParentWikiMacro(sstringsIWikiMacroProvidersStringIOsinspectsresParentWikiMacros WikiSystem((s8build/bdist.linux-i686/egg/hierwiki/macros/parentwiki.pys?s PK@m5Ţ+áŃÖÖhierwiki/macros/subwiki.pyc;ň H6XEc@s\dkTdklZlZdklZdkZdkZdkZdefd„ƒYZ dS((s*(sIWikiMacroProviders WikiSystem(sStringIONs SubWikiMacrocBs<tZdZeeƒd„Zd„Zd„Zd„ZRS(s2 Inserts an alphabetic list of sub-wiki pages into the output. A sub-wiki page is a page that is is deeper in the hierachy than the current page. e.g. if the current page is People, the this will return a list of all wiki entries that start with "People/" Accepts a prefix string as parameter: if provided, only pages with names that start with the prefix are included in the resulting list. If this parameter is omitted, all pages are listed. This now takes the text of the first heading and displays it as the link name. ccs2|ii}|idƒo|d }n|VdS(s4Yield the name of the macro based on the class name.sMacroiű˙˙˙N(sselfs __class__s__name__snamesendswith(sselfsname((s5build/bdist.linux-i686/egg/hierwiki/macros/subwiki.pys get_macross  cCsti|iƒSdS(s Return the subclass's docstring.N(sinspectsgetdocsselfs __class__(sselfsname((s5build/bdist.linux-i686/egg/hierwiki/macros/subwiki.pysget_macro_descriptionscCs\|iiƒ} | iƒ}| iƒ}|iiddƒd}t }|ov|i ddƒ}|idƒ}|ddjo|d}nt|ƒd jo|d djo|d }qĂnd }|o|d |7}n|d 7}|i|ƒtƒ}|id ƒx/no'|iƒ}|t joPn|d}|o7|idƒ} t| ƒt|ƒd joqqnd|}|i|ƒxŁno›|iƒ}|t joPn|d}|d }|i| |ƒ\} } }|ii i!|ƒ} |id| | fƒ|i| ƒ|id|ƒq WqW|idƒ|i#ƒSdS(Nswiki.page_namess/s's''s,isNoneisSELECT DISTINCT name FROM wiki sWHERE name LIKE '%s%%' s ORDER BY names
    sJSELECT name,text from wiki where name = '%s' order by version desc limit 1s
  • s %s
  • s
($sselfsenvs get_db_cnxsdbscursorscssreqshdfsgetValuesprefixsNoneslevelsargssreplacessplitslenssqlsexecutesStringIOsbufswritesfetchonesrowsnameslen_namesintscsrowstexts_getinfoslinktextstitlesdescshrefswikislinksgetvalue(sselfsreqsnamesargsstextsprefixscssrowscsrowstitleslen_nameslinktextsdbslinkssqlsbufsdescslevelscursor((s5build/bdist.linux-i686/egg/hierwiki/macros/subwiki.pys render_macro#sZ  $                c Csě|iƒ}|} |id|ƒ|iƒ}d}|t joI|d}t i d|ƒ}|t joti|idƒƒ} q‘nd}tƒ}|id|| fƒ|djp | |jo d} n||iƒ| fSdS(NsESELECT text from wiki where name = '%s' order by version desc limit 1sis =+\s([^=]*)=+isCreate s%s%s(sdbscursorscssnamesdescsexecutesfetchonescsrowsprefixsNonestextsressearchsmsstringsstripsgroupsStringIOstitleswritesgetvalue( sselfsdbsnamescsrowstitlestextsmsprefixscssdesc((s5build/bdist.linux-i686/egg/hierwiki/macros/subwiki.pys_getinfo]s         ( s__name__s __module__s__doc__s implementssIWikiMacroProviders get_macrossget_macro_descriptions render_macros_getinfo(((s5build/bdist.linux-i686/egg/hierwiki/macros/subwiki.pys SubWikiMacro s     :( s trac.cores trac.wiki.apisIWikiMacroProviders WikiSystemsStringIOsresstringsinspects Components SubWikiMacro(sstringsIWikiMacroProvidersStringIOsinspectsres SubWikiMacros WikiSystem((s5build/bdist.linux-i686/egg/hierwiki/macros/subwiki.pys?s PK@m56ř…tĐĐhierwiki/macros/__init__.pyc;ň H6XEc@sdkZdkZdS(N(ssubwikis parentwiki(ssubwikis parentwiki((s6build/bdist.linux-i686/egg/hierwiki/macros/__init__.pys?s PK@m5ÉsŽŽEGG-INFO/PKG-INFOMetadata-Version: 1.0 Name: TracHierWiki Version: 1.0 Summary: Hierarchical wiki utilities for Trac. Home-page: http://trac-hacks.org/wiki/HierWikiPlugin Author: Noah Kantrowitz Author-email: coderanger@yahoo.com License: BSD Description: Various things related to using the Trac wiki in hierarchical way. Keywords: trac plugin macros wiki hierarchy Platform: UNKNOWN Classifier: Framework :: Trac PK@m5ß:1iSSEGG-INFO/SOURCES.txtsetup.py TracHierWiki.egg-info/PKG-INFO TracHierWiki.egg-info/SOURCES.txt TracHierWiki.egg-info/dependency_links.txt TracHierWiki.egg-info/entry_points.txt TracHierWiki.egg-info/top_level.txt hierwiki/__init__.py hierwiki/filter.py hierwiki/formatter.py hierwiki/macros/__init__.py hierwiki/macros/parentwiki.py hierwiki/macros/subwiki.py PK@m5“×2EGG-INFO/dependency_links.txt PK@m5…Kýé||EGG-INFO/entry_points.txt[trac.plugins] hierwiki.formatter = hierwiki.formatter hierwiki.macros = hierwiki.macros hierwiki.filter = hierwiki.filter PK@m5ţă˘ÝEGG-INFO/top_level.txthierwiki/macros hierwiki PK@m5“×2EGG-INFO/zip-safe PK.!m5¤hierwiki/__init__.pyPK&?m5čą$¤2hierwiki/formatter.pyPKĚ*m5AÖi,ę꤁fhierwiki/filter.pyPK@m5@˜bw¤€hierwiki/__init__.pycPK@m55ăE˙áᤁ2hierwiki/formatter.pycPK@m5Ť&E‘¤G.hierwiki/filter.pycPK.!m5m˛J••¤Š5hierwiki/macros/parentwiki.pyPK.!m54xďőöö¤Z<hierwiki/macros/subwiki.pyPK.!m5ŹŃ‡'!!¤ˆKhierwiki/macros/__init__.pyPK@m5<đ$& & ¤âKhierwiki/macros/parentwiki.pycPK@m5Ţ+áŃÖÖ¤DVhierwiki/macros/subwiki.pycPK@m56ř…tĐФShhierwiki/macros/__init__.pycPK@m5ÉsŽŽ¤]iEGG-INFO/PKG-INFOPK@m5ß:1iSS¤kEGG-INFO/SOURCES.txtPK@m5“×2¤ŸlEGG-INFO/dependency_links.txtPK@m5…Kýé||¤ŰlEGG-INFO/entry_points.txtPK@m5ţă˘Ý¤ŽmEGG-INFO/top_level.txtPK@m5“×2¤ŰmEGG-INFO/zip-safePKŢ n