lightproof-1.5+git20140515/0000755000175000017500000000000012335137641013606 5ustar renerenelightproof-1.5+git20140515/make.py0000644000175000017500000000343512335137465015106 0ustar renerene# -*- encoding: UTF-8 -*- import sys, os, zipfile, traceback, Dialog import configparser as cp import pythonpath.lightproof_compile___implname__ from string import Template def dist(fn, a): a['locales'] = a["locales"].replace("_", "-") a['loc'] = str(dict([[i, [i[0:2], i[3:5], ""]] for i in a["locales"].split(" ")])) distname = a['implname'] + "-" + a['version'] + '.oxt' z = zipfile.ZipFile(distname, mode='w', compression = zipfile.ZIP_DEFLATED) f = open(fn + ".dat", 'r', encoding="utf-8") code = pythonpath.lightproof_compile___implname__.c(f.read(), a['lang']) a["code"] = code["code"] a['data'] = code["rules"] for i in ["META-INF/manifest.xml", "description.xml", "Linguistic.xcu", "Lightproof.py", \ "pythonpath/lightproof_handler___implname__.py", "pythonpath/lightproof_impl___implname__.py", \ "pythonpath/lightproof___implname__.py" ]: z.writestr(i.replace("__implname__", a["implname"]), Template(open(i, "r", encoding="utf-8").read()).safe_substitute(a)) for i in a["extras"].split(","): z.writestr(i.strip().replace("../", "").replace("__implname__", a["implname"]), \ open(fn[:fn.rfind("/")+1] + i.strip(), 'rb').read()) try: d = open(fn + ".dlg", "r", encoding="utf-8").readlines() Dialog.c(a["implname"], d, z, a["lang"]) except: z.writestr("pythonpath/lightproof_opts_%s.py"%a["implname"], "") if len(sys.argv) == 1: print ("""Synopsis: python make.py config_file eg. python make.py src/en/en.cfg""") sys.exit(0) fArgs = cp.SafeConfigParser() for i in sys.argv[1:]: try: fArgs.read(i) dist(i[:-4], fArgs._sections['args']) except: print (traceback.format_exc()) print ("missing config file or options: " + str(i)) sys.exit(0) lightproof-1.5+git20140515/.pc/0000755000175000017500000000000012171062050014253 5ustar renerenelightproof-1.5+git20140515/.pc/applied-patches0000644000175000017500000000000012171062050017227 0ustar renerenelightproof-1.5+git20140515/.pc/.quilt_patches0000644000175000017500000000001712171062050017117 0ustar renerenedebian/patches lightproof-1.5+git20140515/.pc/.version0000644000175000017500000000000212171062050015731 0ustar renerene2 lightproof-1.5+git20140515/.pc/.quilt_series0000644000175000017500000000000712171062050016761 0ustar renereneseries lightproof-1.5+git20140515/NEWS0000644000175000017500000000537712054114507014313 0ustar renerene2012-08-23: Version 1.5 - capitalization based on the underlined group (on 2012-07-09) - fix positioning of the blue underline (on 2012-07-09) - alternative separator (|) for suggestions and URL suggestions - rule fixes 2012-02-04: Version 1.5 beta 3 - bug fix in suggestion formatting 2012-02-02: Version 1.5 beta 2 - rule editor (Writer extension) - code cleanups, only Python dependency in config system 2011-12-05: Version 1.5 beta (1.4.3) - Improved English and Hungarian rules - See ChangeLog 2011-07-12: Version 1.4.1 - fix option saving in LibreOffice - fix localization of the name of the grammar checker in OpenOffice.org/LibreOffice Options - multiple options in the same line in the Options dialog - new functions: stem(), generate() - improved Hungarian rules 2010-02-19 Version 1.4 - user code support ([code] sections in the rule files) - fix Mac OS X PyUNO problem 2009-12-16 Version 1.3 - Lightproof is a grammar checker extension generator (see doc/manual.txt): the result of the generation is a single Lightproof or vendor specific grammar checker language package, eg. lightproof-en_US.oxt or your-grammar-checker-en_US.oxt. - native OpenOffice.org Options support (see Options->Language Settings after the installation of en_US or hu_HU oxt packages of the Lightproof distribution). Documentation: doc/dialog.txt - new, simplified rule syntax: - rule sections ([Word], [word], [Char], [char]): - word rules: patterns with default word boundaries - [Word]: ignore case - [word]: case sensitive simplified syntax: [Word] (default) foo -> bar # bar is far better instead of the old (?i)\bfoo\b -> bar # bar is far better - character rules: old default - [Char]: ignore case - [case]: case sensitive - expressions in suggestions: specified by a starting equal sign foo\w+ -> =\0.upper() # suggest with uppercase letters - new library functions: spell: spelling (Boolean function) suggest: suggestion affix: morph variant (only with affix fields) calc: Calc function access (see NUMBERTEXT example in data/hu_HU.dat) 2009-10-23 Version 1.2.2 - a small improvement in Hungarian grammar checking 2009-10-20 Version 1.2.1 - small improvements in Hungarian grammar checking 2009-10-19 Version 1.2 - Hunspell integration and - extended syntax for grammar checking based on morphological analysis (see data/hu_HU.dat) - multi-line rules - extended Hungarian rules 2009-09-03 Version 1.1 - fixed multiple space detection beetween sentences - Translated and extended Russian rule sets from Yakov Reztsov - small improvements (see ChangeLog) lightproof-1.5+git20140515/Linguistic.xcu0000644000175000017500000000113712054114507016435 0ustar renerene ${locales} lightproof-1.5+git20140515/VERSION0000644000175000017500000000000412054114507014642 0ustar renerene1.5 lightproof-1.5+git20140515/THANKS0000644000175000017500000000013712054114507014514 0ustar renereneThanks to András Tímár Olivier Ronez Michael Meeks See ChangeLog for other contributors. lightproof-1.5+git20140515/.gitignore0000644000175000017500000000001312054114507015562 0ustar renerene*.pyc *.oxtlightproof-1.5+git20140515/ChangeLog0000644000175000017500000001765712335137465015404 0ustar renerene2014-05-15 László Németh : - Python 3.3 port of the measurement conversion in the English and Hungarian modules 2013-11-20 László Németh : - Python 3.3 port of build environment of the editor 2013-10-14 Olivier Ronez : - Python 3.3 port of the build environment - Workaround for paragraph chunking in LO 4, see http://nabble.documentfoundation.org/Grammar-checker-Undocumented-change-in-the-API-for-LO-4-td4030639.html 2012-12-04 László Németh : - Python 3.3 port 2012-11-23 László Németh : - fix strange false positives resulted by a synchronization problem (missing alternatives with unloaded dictionary), the problem reported by Olivier Ronez 2012-09-18 László Németh : - fix suggest() splitting 2012-08-24 László Németh : - fix URL splitting - update URLs in English rules 2012-08-23 László Németh : - fix fdo#46542 ("an usability" instead of "a usability") reported by Roman Eisele - fix fdo#46549 (allow "an habitual", too), reported by jacobwwood at fdo - fixes for English and Hungarian modules 2009-08-21 Yakov Reztsov * src/ru_RU/*: fixes and new Russian grammar rules 2012-07-09 László Németh : - fix positions of underlining of part of the matched pattern: (foo) (bar) -2> baz # Did you mean? - "|" as alternative separator of suggestions foo -> bar|baz # Did you mean? - print depends from PYUNO_DEBUG_LEVEL (fix for Windows) - print() for future Python 3 support 2012-05-27 Olivier Ronez : - fix: suggestion with capital is based on selected back reference group 2012-02-15 Olivier Ronez : - new: error positioning, underline a back reference group instead of the full pattern 2012-02-12 Olivier Ronez : - back references in explanations, eg. # \1 should be... - display message without suggestion, eg. foo -> _ # Message - function word() returns '' instead of None - add .gitignore 2012-02-04 László Németh : - fix multiple suggestions, the problem reported by Yakov Reztsov 2012-02-02 László Németh : - Lightproof editor (rule development extension for LibreOffice) - use template and config system, based on the work of Olivier Ronez, author of French grammar checker Grammalecte. - code cleanups - move user code to different module to speed up its load (submodules use Python pyc format) 2011-12-16 László Németh : - add FullCommentURL support - remove " [" from reversed space and punctuation - remove traceback.print_exc (problems on Windows reported by Olivier Ronez) - license: LGPL -> MPL/GPL/LGPL - remove tabulators for LibreOffice Git - options only in extension manager (temporarily) - help separator in dlg: now "\n" instead of "/" - long comments (\n), eg. # Did you mean:\nExplanation... - expressions in comments, eg. # =expression({word}) - \u00AD (soft hyphen is not word boundary) - print traceback in LibreOffice - LOCALE, TEXT in rules, see doc. * lightproof_py.py: fix hasLocale() for LibreOffice 3.5 - data/en_US.dat: improved English rules (a/an) rules * Complile.py: support "_" in pattern names. - add ^ for sentence beginning 2011-07-12 László Németh : * lightproof_handler_py.py: fix for LibreOffice Problem with option settings reported by Péter Benedek on openscope.org and others * Dialog.py: support for multiple options in a line. syntax in dlg files: space and comma separated list, comma means new line: item1 item2 ..., itemx itemz ..., itemA itemB ... * Dialog.py: tooltip support, syntax in dlg files: slash separation item = option caption/tooltip * Dialog.py: fix localization of the extension name in the Options * lightproof_py.py: - stem(): new function for stemming, see doc/syntax.txt. Problems with the experimental version reported by Olivier Ronez. - generate(): new function for morphological generation, see doc/syntax.txt - extended functions: optional "all" parameter of functions morph() and affix(), see doc/syntax.txt * Compile.py: fix for [code] (handling "\n" in strings) 2010-02-19 László Németh : * Compile.py, make.py: add user code support by [code] sections in the rule files, see end of the doc/manual.txt * Lightproof_handler.py: fix Mac OS X PyUNO problem (problem with helper classes in the same file) 2009-12-16 László Németh : * make.py: vendor/language specific grammar checker generator * *_{py,xcu,xml}.py: - template files for code generation * Makefile, Compile.py: - modified for code generation * Dialog.py: - Options dialog data generator (see doc/dialog.txt) * data/{en_US,hu_HU}.dat: - optional rules: word duplication etc. * Lightproof.py: - fix getAlternatives() handling (morphological analysis of unknown words resulted in unchecked sentences) - extended, simplified syntax: rule sections ([Word], [word], [Char], [char]): see NEWS - expressions in suggestions: specified by a starting equal sign (see doc/syntax.txt): - new library functions (see doc/syntax.txt): option(): return the value of the option (see doc/dialog.txt) spell(): spelling (Boolean function) suggest(): suggestion affix(): morph variant (only with affix fields) calc(): Calc function access 2009-10-23 László Németh : * data/hu_HU.dat: - fix rule article "a". The problem with "13-a óta" reported by kiazaki at openscope.hu. 2009-10-20 László Németh : * data/hu_HU.dat: - add the rule "mellet" for irregular nouns, too (eg. "a ház mellet") - add -ban/-ben affixes to the rule "helyett kap", reported by József Barna. - fix digit separator rules for decimal digits, reported by joghurt at OOo Wiki. * Lightproof.py: - add words with dots to word(). The problem with version numbers (eg. in OpenOffice.org 3.1) reported by Kami. 2009-10-19 László Németh : * Lightproof.py: - Hunspell integration - processing conditional rules by eval() - helper functions: morph() and word() (see doc/syntax.txt) - add try-except for proofing rule compiling (bad regexes of the conditional rules detected only in loading phase yet, see stdout of OpenOffice.org) * Compile.py: - conditional rules (see doc/syntax.txt and hu_HU.dat) - multi-line rules * data/hu_HU.dat: - new Hungarian rules 2009-09-03 László Németh : * Lightproof.py: - fix: multiple space detection beetween sentences - data/*.dat: modified rule for space detection beetween sentences * data/en*.dat: - fix: de *juro -> de jure, also extended by "de luxe" - using "typographic apostrophe" message instead of "apostrophe". Ambiguous warning message reported by Dave Pitts (davidmpitts at gmail) * data/hu_HU.dat: - add "döntetlenre" to the suggestions for "egyelőre" * doc/manual.txt: reported by Olivier Ronez - replace Convert.py with Compile.py - suggesting yourname.dat argument instead of parameter substitution for manual compilation under Windows 2009-09-01 Yakov Reztsov * data/ru_RU.dat: Russian translation of template.dat 2009-04-25 László Németh : * first release lightproof-1.5+git20140515/pythonpath/0000755000175000017500000000000012335137472016006 5ustar renerenelightproof-1.5+git20140515/pythonpath/lightproof___implname__.py0000644000175000017500000000012112075257522023205 0ustar renerene# -*- encoding: UTF-8 -*- from __future__ import unicode_literals dic = ${data} lightproof-1.5+git20140515/pythonpath/lightproof_impl___implname__.py0000644000175000017500000001737012075257522024244 0ustar renerene# -*- encoding: UTF-8 -*- from __future__ import unicode_literals import uno, re, sys, os, traceback from com.sun.star.text.TextMarkupType import PROOFREADING from com.sun.star.beans import PropertyValue pkg = "${implname}" lang = "${lang}" locales = ${loc} version = "${version}" author = "${author}" name = "${name}" import lightproof_handler_${implname} # loaded rules (check for Update mechanism of the editor) try: langrule except NameError: langrule = {} # ignored rules ignore = {} # cache for morphogical analyses analyses = {} stems = {} suggestions = {} # assign Calc functions calcfunc = None # check settings def option(lang, opt): return lightproof_handler_${implname}.get_option(lang.Language + "_" + lang.Country, opt) # filtering affix fields (ds, is, ts etc.) def onlymorph(st): if st != None: st = re.sub(r"^.*(st:|po:)", r"\\1", st) # keep last word part st = re.sub(r"\\b(?=[dit][sp]:)","@", st) # and its affixes st = re.sub(r"(?" + word + "", rLoc, ()) if not x: return None t = x.getAlternatives() if not t: if not analyses: # fix synchronization problem (missing alternatives with unloaded dictionary) return None t = [""] analyses[word] = t[0].split("")[:-1] a = analyses[word] result = None p = re.compile(pattern) for i in a: if onlyaffix: i = onlymorph(i) result = p.search(i) if result: result = result.group(0) if not all: return result elif all: return None return result def morph(rLoc, word, pattern, all=True): return _morph(rLoc, word, pattern, all, False) def affix(rLoc, word, pattern, all=True): return _morph(rLoc, word, pattern, all, True) def spell(rLoc, word): if not word: return None return spellchecker.isValid(word, rLoc, ()) # get the tuple of the stem of the word or an empty array def stem(rLoc, word): global stems if not word: return [] if not word in stems: x = spellchecker.spell(u"" + word + "", rLoc, ()) if not x: return [] t = x.getAlternatives() if not t: t = [] stems[word] = list(t) return stems[word] # get the tuple of the morphological generation of a word or an empty array def generate(rLoc, word, example): if not word: return [] x = spellchecker.spell(u"" + word + "" + example + "", rLoc, ()) if not x: return [] t = x.getAlternatives() if not t: t = [] return list(t) # get suggestions def suggest(rLoc, word): global suggestions if not word: return word if word not in suggestions: x = spellchecker.spell("_" + word, rLoc, ()) if not x: return word t = x.getAlternatives() suggestions[word] = "|".join(t) return suggestions[word] # get the nth word of the input string or None def word(s, n): a = re.match("(?u)( [-.\w%%]+){" + str(n-1) + "}( [-.\w%%]+)", s) if not a: return '' return a.group(2)[1:] # get the (-)nth word of the input string or None def wordmin(s, n): a = re.search("(?u)([-.\w%%]+ )([-.\w%%]+ ){" + str(n-1) + "}$", s) if not a: return '' return a.group(1)[:-1] def calc(funcname, par): global calcfunc global SMGR if calcfunc == None: calcfunc = SMGR.createInstance( "com.sun.star.sheet.FunctionAccess") if calcfunc == None: return None return calcfunc.callFunction(funcname, par) def proofread( nDocId, TEXT, LOCALE, nStartOfSentencePos, nSuggestedSentenceEndPos, rProperties ): global ignore aErrs = [] s = TEXT[nStartOfSentencePos:nSuggestedSentenceEndPos] for i in get_rule(LOCALE).dic: # 0: regex, 1: replacement, 2: message, 3: condition, 4: ngroup, (5: oldline), 6: case sensitive ? if i[0] and not str(i[0]) in ignore: for m in i[0].finditer(s): try: if not i[3] or eval(i[3]): aErr = uno.createUnoStruct( "com.sun.star.linguistic2.SingleProofreadingError" ) aErr.nErrorStart = nStartOfSentencePos + m.start(i[4]) # nStartOfSentencePos aErr.nErrorLength = m.end(i[4]) - m.start(i[4]) aErr.nErrorType = PROOFREADING aErr.aRuleIdentifier = str(i[0]) iscap = (i[-1] and m.group(i[4])[0:1].isupper()) if i[1][0:1] == "=": aErr.aSuggestions = tuple(cap(eval(i[1][1:]).replace('|', "\n").split("\n"), iscap, LOCALE)) elif i[1] == "_": aErr.aSuggestions = () else: aErr.aSuggestions = tuple(cap(m.expand(i[1]).replace('|', "\n").split("\n"), iscap, LOCALE)) comment = i[2] if comment[0:1] == "=": comment = eval(comment[1:]) else: comment = m.expand(comment) aErr.aShortComment = comment.replace('|', '\n').replace('\\n', '\n').split("\n")[0].strip() aErr.aFullComment = comment.replace('|', '\n').replace('\\n', '\n').split("\n")[-1].strip() if "://" in aErr.aFullComment: p = PropertyValue() p.Name = "FullCommentURL" p.Value = aErr.aFullComment aErr.aFullComment = aErr.aShortComment aErr.aProperties = (p,) else: aErr.aProperties = () aErrs = aErrs + [aErr] except Exception as e: if len(i) == 7: raise Exception(str(e), i[5]) raise return tuple(aErrs) def cap(a, iscap, rLoc): if iscap: for i in range(0, len(a)): if a[i][0:1] == "i": if rLoc.Language == "tr" or rLoc.Language == "az": a[i] = u"\u0130" + a[i][1:] elif a[i][1:2] == "j" and rLoc.Language == "nl": a[i] = "IJ" + a[i][2:] else: a[i] = "I" + a[i][1:] else: a[i] = a[i].capitalize() return a def compile_rules(dic): # compile regular expressions for i in dic: try: if re.compile("[(][?]iu[)]").match(i[0]): i += [True] i[0] = re.sub("[(][?]iu[)]", "(?u)", i[0]) else: i += [False] i[0] = re.compile(i[0]) except: if 'PYUNO_LOGLEVEL' in os.environ: print("Lightproof: bad regular expression: " + str(traceback.format_exc())) i[0] = None def get_rule(loc): try: return langrule[pkg] except: langrule[pkg] = __import__("lightproof_" + pkg) compile_rules(langrule[pkg].dic) return langrule[pkg] def get_path(): return os.path.join(os.path.dirname(sys.modules[__name__].__file__), __name__ + ".py") # [code] ${code} lightproof-1.5+git20140515/pythonpath/lightproof_handler___implname__.py0000644000175000017500000000773412054114510024705 0ustar renereneimport uno import unohelper import lightproof_opts_${implname} from lightproof_impl_${implname} import pkg from com.sun.star.lang import XServiceInfo from com.sun.star.awt import XContainerWindowEventHandler # options options = {} def load(context): try: l = LightproofOptionsEventHandler(context) for i in lightproof_opts_${implname}.lopts: l.load(i) except: pass def get_option(page, option): try: return options[page + "," + option] except: try: return options[page[:2] + "," + option] except: return 0 def set_option(page, option, value): options[page + "," + option] = int(value) class LightproofOptionsEventHandler( unohelper.Base, XServiceInfo, XContainerWindowEventHandler ): def __init__( self, ctx ): p = uno.createUnoStruct( "com.sun.star.beans.PropertyValue" ) p.Name = "nodepath" p.Value = "/org.openoffice.Lightproof_%s/Leaves"%pkg self.xConfig = ctx.ServiceManager.createInstance( 'com.sun.star.configuration.ConfigurationProvider' ) self.node = self.xConfig.createInstanceWithArguments( 'com.sun.star.configuration.ConfigurationUpdateAccess', (p, ) ) self.service = "org.openoffice.comp.pyuno.LightproofOptionsEventHandler." + pkg self.ImplementationName = self.service self.services = (self.service, ) # XContainerWindowEventHandler def callHandlerMethod(self, aWindow, aEventObject, sMethod): if sMethod == "external_event": return self.handleExternalEvent(aWindow, aEventObject) def getSupportedMethodNames(self): return ("external_event", ) def handleExternalEvent(self, aWindow, aEventObject): sMethod = aEventObject if sMethod == "ok": self.saveData(aWindow) elif sMethod == "back" or sMethod == "initialize": self.loadData(aWindow) return True def load(self, sWindowName): child = self.getChild(sWindowName) for i in lightproof_opts_${implname}.lopts[sWindowName]: sValue = child.getPropertyValue(i) if sValue == '': if i in lightproof_opts_${implname}.lopts_default[sWindowName]: sValue = 1 else: sValue = 0 set_option(sWindowName, i, sValue) def loadData(self, aWindow): sWindowName = self.getWindowName(aWindow) if (sWindowName == None): return child = self.getChild(sWindowName) for i in lightproof_opts_${implname}.lopts[sWindowName]: sValue = child.getPropertyValue(i) if sValue == '': if i in lightproof_opts_${implname}.lopts_default[sWindowName]: sValue = 1 else: sValue = 0 xControl = aWindow.getControl(i) xControl.State = sValue set_option(sWindowName, i, sValue) def saveData(self, aWindow): sWindowName = self.getWindowName(aWindow) if (sWindowName == None): return child = self.getChild(sWindowName) for i in lightproof_opts_${implname}.lopts[sWindowName]: xControl = aWindow.getControl(i) sValue = xControl.State child.setPropertyValue(i, str(sValue)) set_option(sWindowName, i, sValue) self.commitChanges() def getWindowName(self, aWindow): sName = aWindow.getModel().Name if sName in lightproof_opts_${implname}.lopts: return sName return None # XServiceInfo method implementations def getImplementationName (self): return self.ImplementationName def supportsService(self, ServiceName): return (ServiceName in self.services) def getSupportedServiceNames (self): return self.services def getChild(self, name): return self.node.getByName(name) def commitChanges(self): self.node.commitChanges() return True lightproof-1.5+git20140515/pythonpath/lightproof_compile___implname__.py0000644000175000017500000002124712075257522024731 0ustar renerenefrom __future__ import unicode_literals import sys, re, traceback repl = {} tests = [] comp = [] modes = ["[Word]", "[word]", "[Char]", "[char]", "[code]"] mode = "[Word]" code = u"" language = "" oldlinenums = {} def prepare_for_eval(s): s = re.sub("(affix|spell|morph|stem|option|suggest|generate)\(", r'\1(LOCALE,', s) s = re.sub(r"word\(\s*(\d)", r'word(s[m.end():],\1', s) # word(n) s = re.sub(r"word\(\s*-(\d)", r'wordmin(s[:m.start()],\1', s) # word(-n) s = re.sub(r"[\\](\d)", r'm.group(\1)', s) s = re.sub("[{]([^}]+)}", r'm.group("\1_1")', s) return s def mysplit(s, line, oldline, debug): global repl global tests global comp global modes global mode orig = s if s[0:1] == '[': if s.strip() in modes: mode = s.strip() return None elif re.match(r"\[\w+\]$", s.strip()): #sys.stderr.write("Unknown mode: " + s + "\n") return oldline dec = 0 exprep = 0 # replacement is a Python expression (beginning with sign =) condition = False ngroup = 0 # back reference group number that will be used for error positioning # description c = re.search("\s#\s", s) com = u"" if c: try: c = c.start(c.lastindex - 1) except: c = c.start() com = s[c+2:].strip() if com[0:1] == "=": com = prepare_for_eval(com) s = s[:c] m1 = re.search("<-", s) m2 = re.search("-\d*>", s) if m1 and m2: condition = prepare_for_eval(s[m1.end(0): m2.start(0)].strip()) s = s[0:m1.start(0)] + s[m2.start(0):] if s[0:1] == '"': # quoted pos = s[1:].find('"') while pos > 0 and s[pos] == '\\': pos = s[pos:].find('"') s1 = s[1:pos+1] s2 = s[pos+2:].strip() else: m = re.compile("-\d*>").search(s) if not m: m = re.compile("[_a-zA-Z][_a-zA-Z0-9]*").match(s) if not m: # syntax error return oldline s1 = m.group(0) s2 = s[m.end(0):].strip() # replace previous definitions for i in repl: ire = re.compile("[{]" + i + "}") if re.search(ire, s2): s2 = ire.sub(repl[i], s2) # make named group s2 = "(?P<" + m.group(0) + ">" + s2 + ")" dec = 1 else: s1 = s[0:m.start(0)].strip() if re.match("TEST: ", s1): # deprecated tests += [[s1[5:].strip(), s[m.end(0):].strip(), oldline]] return None s2 = s[m.start(0):].strip() m = re.compile("-(\d*)>").match(s2) if dec!= 1 and m: s2 = s2[m.end(0):].strip() if m.group(1): ngroup = int(m.group(1)) elif dec!=1: # syntax error return oldline if s2[0:1] == '=': exprep = 1 if s2[0:1] == '"' and s2[-1:]=='"': s2 = s2[1:-1] if dec==1: repl[s1] = s2 return None else: for i in repl: s1 = re.sub("[{]" + i + "}", repl[i], s1) # modes if mode == "[Word]" or mode == "[word]": if s1[0] == '^': s1 = r"((?<=[!?.] )|^)" + s1[1:] + r"(?![-\w\u2013\u00AD])" else: s1 = r"(? 3 and s1[i-3:i]=="(?P": state = 2 if state == 2 and c == ">": state = 0 if c == "?" and i > 0 and s1[i-1:i]=="(": state = 5 if state == 5 and c == ")": state = 0 if lu.match(c) and c.islower() and state == 0: if c=="i" and (language == "tr" or language == "az"): s3 += u"[\u0130" + c + "]" else: s3 += "[" + c.upper() + c + "]" elif lu.match(c) and c.islower() and state == 1 and s1[i+1:i+2] != "-": if s1[i-1:i] == "-" and s1[i-2:i-1].islower(): # [a-z] -> [a-zA-Z] s3 += c + s1[i-2:i-1].upper() + "-" + c.upper() elif c=="i" and (language == "tr" or language == "az"): s3 += u"\u0130" + c else: s3 += c.upper() + c else: s3 += c if c == "\\": state = 4 elif state == 4: state = 0 s1 = s3 s1 = renum("[?]P<([^<_]*)>", s1, "?P<") if exprep == 0: s2 = re.sub("[{]([_a-zA-Z][_a-zA-Z0-9]*)}", r"\\g<\1>", s2) s2 = renum(r"\\g<([^<_]*)>", s2, r"\\g<") else: s2 = prepare_for_eval(s2) # check if re.compile("[(][?]iu[)]").match(s1): cap = True sc = re.sub("[(][?]iu[)]", "(?u)", s1) else: cap = False sc = s1 try: compr = re.compile(sc) if not condition: comp += [[compr, s2, com, cap, line]] except Exception as e: raise Exception(str(e), oldline) if debug: return [s1, s2, com, condition, ngroup, oldline] return [s1, s2, com, condition, ngroup] # group renum ( -> etc.) def renum(regex, s1, beg): j={} mr = re.compile(regex) m = mr.search(s1) nl = s1.find("\\n") while m: # restart numbering in new lines if nl > -1 and m.start(0) > (nl + 1): j={} nl = s1[m.start(0):].find("\\n") if nl > -1: nl = m.start(0) + nl n = m.group(1) if n in j: j[n] += 1 else: j[n] = 1 s1 = re.sub(mr, beg + n + "_" + str(j[n]) + ">", s1, 1) m = mr.search(s1) return s1 def cap(a, iscap): global language if iscap: for i in range(0, len(a)): if a[i][0:1] == "i": if language == "tr" or language == "az": a[i] = u"\u0130" + a[i][1:] elif a[i][1:2] == "j" and language == "nl": a[i] = "IJ" + a[i][2:] else: a[i] = "I" + a[i][1:] else: a[i] = a[i].capitalize() return a def c(rules, lang, debug = False): global language global code global oldlinenums language = lang r = re.compile("[\n#]") code = "" dic = [] oldlinenums = {} lines = rules.split("\n") lines2 = [] result = {} cm = 0 lnums = 1 for i in lines: if i.strip() in modes: if i.strip() == "[code]": cm = 1 continue else: cm = 0 if cm == 1: code = code + i + "\n" elif len(i.strip()) > 0: lines2 = lines2 + [i] oldlinenums[i] = lnums lnums = lnums + 1 lines = lines2 # concatenate multiline commands # last tabulator + comment is the message l = u"" comment = 0 for i in range(len(lines)-1, -1, -1): if re.match("\t", lines[i]): if not (comment and re.match("\t+#", lines[i])): l = lines[i].strip() + " " + l if re.search("#", lines[i]): comment = 1 del lines[i] elif l != "": lnums = oldlinenums[lines[i]] lines[i] = lines[i].strip() + " " + l oldlinenums[lines[i]] = lnums l = "" comment = 0 # processing for i in range(0, len(lines)): if not r.match(lines[i]): item = mysplit(lines[i].strip(), i + 1, oldlinenums[lines[i]], debug) if item != None: if type(item) == type(1): raise Exception("Syntax error in line ", item) dic = dic + [item] result["rules"] = dic code = re.sub(r"(?D/.E+]rn%,e [xqc8J>2@<}L9ڂ՟vU>b<2b5aw"ҟ:a1ޙ(s 1\6&@Y(]mdDQv^ CZo׫ԟpxH@ D߄/x/8hi˃a}\}f݉^y~Zұxda^E0UCCF ߇dvrV3;W_@ ?s?-N L/Sa2N\eɒe!y^8/FNߑ :g9rOR½X%)R|(N0LC=߿^ 뇫 z-͵$ڰdł8J$BbR$NxM9Y2lD(ٌ% M<|u{-MKm2O/ NwVfe8kR$m}wj`+LpΧv=$pG%/46JcUk|`5mٗƇ9gŠm_^3= Hǟ9rAB32vQIw|yyikt4tLXAbwg@x@]PFwZ2R<be s[_JIf܃W H͔YW-CNj"_nSImmDY ;~(bKa4jƵ&҃Y0~A=dMWվ%BhS0\C;!f ^fjgjZeMQEɄ; 7NXz Gv"V~*g㷻n 8On? .4壳*Jm0D3"~C/CJ\ I"e#e^)RɐeDHi$ࠄݚ918C8FHY7.'b/gj1$LE<^gתܖ.&DD Pfc* _p#c=1+(<2JZ~rD|~7յ$H5Ǟ:+o'qO1y(} nkA-ht cfL9ySt4>l[s( M+~¨[Va[2Tl 0>6\ی ^Udn&˚|µ3?(W~n-p8HnDKٷ}<.>97WpuELmpeQ?M Rf\?IP[%K_6DnM/SՍWFtD ='`htʱ=xA[ͧ cקJ. W)0T#oҒۜxp ]g6YٓhO-E HhHt[C5&%|q լ)8C=,1 hXNV.{w"!Nm%W%u׀Â1-!Q1{,$CUVqrsg > P׾u^EAfD Uu دU}eLЊ2羍եz3 #삍.!! mtB~_b4ݬF&:Z-A_3\ *s;gK{Slt(rw$cWLZJ qv4,oktRZS"-4Uʽ9}Uko9ݼuӫŜVnەv;n;vR͚oU׶ʃGnv6f3!ZҠY=Vdp xuviD@s -ǯmۃ8nsiẁAw{%r?J1Rz -i!b,ra&*%EG*5ʼk5n߁8-ֶ%9 ŗ-9sۃ=;^-tz[]3*n@F!IqntJ!St]hv A+ĂJ O);5JDfV] X :j} ^ӵ{Y{ce'?=}7zpǣn5уߌr#=piI>n/p[TFpT{AVsg{^n-5͓Gx{R2H^En,{\ W%f5y$d"Z Kb4%âZ?tȞ]orolϣ*)p3hzro/hC1EA|0;? ꃠ>deXڃW,a~-J-%mw3tV$J'xFM'V;=[~@[?et^3 AuPlw?ɯ^=6woަVⓟf3Ѯ^K5Щaú)vpQ >n/hl ( hLѰF^+-ht|{:㛜czیy{vAkhG.ZN^Ъ-wk[.;w;vj7;M?uv7hۣGqkc`h/ nБH)N00z: > MN^^>avwѓPMM-j\h5vgwf ضY?Ш6~0pAP|o:"T;zƽڱCEI)}?@ÞZ]^b"rszNw۪mHRt[6 AFLֆU^#|]αin@f5ҳ/UU:=Ϯ1sg6;,-_74kD'8aC;?[)ys`ܶkwK3zN7k~D}Wa;C`i̦;ZFFf1&3sˍ9U@X9-.woZZ_|͋/={!L&E9˿ްIA6}oSukӮ # ;UIV=giނ̙eҏ6rM>[>m[ys kݒ3zRJTYH3 M72:q" cMj0s?NM{!Xs,v~iBark.q̖BF <3_ h1uZ<jլrPГ֕LRָAzsswiRM祝ZgmY)v] 刪1++6k}1W񃌆t%ZE( BD'IwNC\^{W.@e[ |+Q_NI 2 ~ p밸 ;z M2 ~;z?#wKnnXTr4/d({Bͨc{LDkS8L6IYd9>3&!P%TtY|_TaIB0'kV`U]iB2<)#Z,!%IS%h WRo <AJK+mRDG.JJ F}2MNJ`Y Kf̔LLl/4 Qǩ,TMӆe+R$ZJFS8^Yev~6g֞6򫳹5ݬ*VVhŗ_TVNOp)Z|y#{VGR/-/ウwtޗߚLjl巏i㠚RnL/;@jպgI˾9ݻg7|_OTmCH3 hc\'.!e-Sm$) R{Y;+RFaN3q&s?˫39ZPY;X_҆grQHp(-@zCZVmtƙDf@ْH^({N6Zd,Evp]bZa^Zmyod>7Egro--~O}cz]i_+ţ|aN{dY}F/91=׳\F6h=W=4ګ=;G9*0'8BGxkbX pX!X"d#=~N2X:&16Efh'P1PV)1ND+ 2]5*o>85}p͵/rJ}bXb]1$bݘy)a@n`XH!?s- d1 %ނ^v6hj%„6ENPz]s"D XG#:+NYb)\2AmdZ#(ykOYjР1ި7 HFMyNINcBvDD)R1dl('qp4g=9Ҙ.&FȓoTCy#>Y. 3y .y@-~:oB,)loj;pX"hcy,X<}M / 0Asw܌kY.>Y]>M(MXpo/wHc+7b퓜ڭb^}l#Z'3r+/(R~O@uGPħXò+D_TS$`B7(nlڬjM6{N9`<1L㷇+hh鶱$DSiz>pTǘ8@"mdFI v:qX @vqWw3P*ÓOTC~"% :$7›v K A:u?f(\Oۖ:h.AD;76Jx[*ZUk4 ˪Umb5&ZeՖ6=IHIC1}xS(/Q[^( U[yΪ8T3B,޸Q H@ͪ\F: 2+જZ͸ _$ <_\,zٞb(aԚ)33*]r<1txC Će(Ϯ/IǸK_&f JM(ޅ)7iweWu,-jW “V hqH'%%@GcYF ?ٱ'sqY0N'{ u|ꌞ,,=>eJ:Ģ9E+jgNQRXJlGO""@Nv1?4+y=<| 绦OWJLbߖFmyDFZF 1*dceTrm]Wt42ż'{p'ԘZk+-A! ),uƟ4/\)`ǣgw6["HH1h4v\qd7}3i?=N?zF;N?vDOZLεyzzF%?9Rv7 is3rn6W7 )OmGlӶVLWm9^sU[;W ܓ봽q2:ee4'-MH@KOήb,%{弅-#bC&ov-:!3{2NYPlzBn hT{8lFiO% NLбʤ28X=Jxgﵩ5,ır%!HeD؍ME1]%Q&AGN" rmsaNuZE980U~ćP9H0v\8 & #j G„u(w֕+R^oaQ]@t= +6n8]3~e/ 0{KYYrXhϡ&Ƅ!~䜲ka_Ћx+ 0 5ì^z-##~ (AzP0FF,Ql9%Ѽ"MVƫ3e]$Ve zs;Rf$Z /7Lmn(5 ݇aGJ> 8 :dh?Ua'*]}>_y̨gY%Ӭ6gS0b cZKu N#7W&MǞhx5s!bB1lt,,R'YЯDi5zF06G@ۤqF4b ̆ʆMl fnrZr ܈<᎔=!h54 >T-K^PLm?ʉ^ mvXTIPꓞ7hQ_+ż>v8(A,KXƜuOghemNIYt^\VA)Ԓ6ML4kƒlLR5LTѳp^E13;rՄQS&84>(GVE9koa{0_MJLP\|eѷ%V6]v,";i.xNDX~NKqdiiNV |=$%R*y_X7n @g=Wx, N8F\r~qĀWG_oF~B =FNDݽ=C7{ ь0!qQLF:+"_{-r vx#`rP|!Yȍev˜bR==- o H>C(i'5RؽjfYejbCܡ'SٯPI rBd l >Gr|&*fJ(V}D4D %#3 #O/0$NF9s,i8M50C sG=(EQ헗K1KA9\w%]m%a)09fMP11hN[[hYEpZX 3 40: ҜX6mnB^T ͣK%)_ɳ)'͋Q]KHPb ɤN* iGv .L:OlቄÝWH*ԭռHM73eŖ8.b:EIY@xi!0S!3~+<%Kds"Dã.E_zܞ(U.W4w'iPUwÏV y$,ROXwR$,PJ"ԤIT'K j\@1r#hC\~˛d9d`'7?RC?'S7GrZF1xL?q=) (r&O'@>#ğ7/'.idh&ia4rynN\UI[B,xzOWMB>LX{28cVj}̛DžAρFy_<S RIYN'&a"U8;;`U*&Ehev3Rh3XEPA i@y2[䛓, :Z`eR wT2 :vFNFt(}A(YGP: TIXeb`)k&BP?–*,ab8քyo;b%a:kQB`&lԟ0YR t;*RSg!2Іc`<"Q$$m==mÅ:G3< eUd7cEh^BVRtʟ}0gzM,gkmisLl> 2*|w|szXbOD}O4 tM5c8Q ;lbe3u'kLo)ӀQwGDd2/$I;P.("ܭ*}VaU3,waU`hU%z`m|8`Gń/Gv{_6U5 UC55CZ;b9kP3sxQ>6e #lD~"\xFT_KUdP? Ԣ_φ%hb^_lox\*{HyĀ@X8'1k%fgH/ʗɗ9ژNa#31!9q|(/9YMvhiÙMք4(V'!꾁Mӵ>36\0>٬\cÊTn?fYh輬,)^']7GQK\$|uAI'w ;zސ0tq߂tz[xޤ)`p >=Nթïn=NͲ}ktN'2SQp:AfALфa.| fGoY$Axe 5Ƽ@~#S|#Iъ064J] 9{xFTRg[p&Z4)]w >%nJ 'V];\TܾFH쇃o+:ˁ@| k n෹/d%e:YaT-#<.1R"39l|K@?߱;nyCdp#?\R\Gs"6/5ST.M ˏIf7+x?ᔹ͇'k2y1DxuOp<ˤ|lt@ =G.ZePxt?q 0kóesvlt(}xE\EBNi30l4+d‰m1GxUa[ݞlÿ655 @/|t@ldȴu-@WgBw{g!#pDp[g0ƭk7nWqTqf (8kA-@ 5.0 8ZgLgdfV6>}m&nlRelT'1j-(>0Uqw?Y8 :)5=/#tá[i@>p )2ߕQ o | qd8vO޼'S'"KM[j֧.¸&=(Q7jt25t +0ˬ4tpի\_e`k–Hr) iޙDs-3(9L,q:|2;J~/NTNئ|D0̦?>-t9֨AHQDnVuҘDۉ7e..%O熱Dh DoA"o11ȰaD4/ @XODZwۑv.T) g8npթ|zpwpƆ wo*/wsF!aH)84퉉r*]V!6=o7=V?COσ7c.D^w۞+5I//pf0cUs@%pJUuWyiL0q[9YOa |)N ?'H~$È-0| IF?)hq?$#4%>jJPř'ﮞ;=(v0 Ә];\Eп+|w0)NrXX) rdb:$s`6%roI#ZD'"0a`1:3U8('L_&!C_p 3'i-{>X1Cg ϾV$} f(2ȒYZfmH3n$ALmWs]1}ysX "d[4BVCv⇗,l)=ݜ '!)h&1w&DĀY%Q?c8%d=醦ۉ-PS(UwI ']楫qb+ˆ5O@-16*i.Q 6&Bl"'ޖG쫄Tb PD'7nBH`oXBjtqs۫Q*Y'1A q'3p{FeL ,:ÒėXR m@Ȍ}_nZ=sX/fM F$N(t18f~N$ҵ\} 34+ !_)/ƥ6H ډ'lKD䊆 }=z">V)ʩ6 &X9ˎ5D%cXU" r[!*p{vf$] th8OutBkɹ%1Ai%vݭ"NPt%<e& wq x@Ut}V@q;ozްF"c7l̪Xײm6D4BӃ Cg}NH(.xS8j4}Ͽ =z- jٽO1 .چ%"ĻE_Lj@Wuu/#iħs壯59zL)p*UL1 .墐zռIf $EGXL`z]4-ҁ% BxCj!}m>-'l:ll" c&c%-AnEO+a%qMcLņ8ut 2V3Brcڊ^~O>5ώYXHN?^yRSeD3 k'V8XA=G7͂tYtavS;=2b agʈ3١LaF1 z(2 %xbaeeOc3y3;i\?HK7a\[Y>3 N[ FՍ.rט;(x?S-獉--aKdxI8Ԥ`W"BEBb0Q;0w^{pFlrofcP+:/@ϕOԠvΣ2Ȝ-hs< )[yIܲ_R9EWνStzN //ܲT){vNK/m)rS OPsBr(a%/!4!lqEh0NSKR1LL-I,qʚ4^V¬|Z.L'LċQK1z)d0+cM!ڼY-5{RbK4:B_r i0v$1h;_4~G2 &$C=dbL qi28>db3`]9:MudTs"0T--Lr DQ>VpsHRW3[Cj32܌,ސ=j:?ܹ}>|pK-&|Ru%斸~t}|pw<s >'pH|@A RHا (w"6P^ߕz>3}NdD*+}rz>x_o$` q1!o ]Ӈ0á_ce?&('O ! b"zZܘie4/~իCsf6ė! ÐbCN`j8OajSZ+ƕ8=ŏ W^f\//ȜfV5U=W|pq?Q2ItuM;~cpξ7M^;N/^m03kx2LR̫BG2c۾fgIc<ßL?*'YՉؚMӃAVbvF_<λW"]!4LA$-b@uNҌujиեkL6%cD0kEd^hb=l5'z1j>.m{(KVOԱ ߷Q( $2T#sM1%R7ü]92j%_B0R܁[)F 3c!Ww->uإ} y8 g^=2#pqk\89Cދ[q ވqT *ϙldfjiax\:jF<-vӬn*fw~t7ǷWZu8pկ%1W .r2o" ޳MS-mW eZ e:8 nz5ؖ:Pr }>7Zպc-Yc!Pқ}J2Y}K>E-[+ok7^'WxmI @pMR8So<lightproof-1.5+git20140515/.git/objects/0b/0000755000175000017500000000000012335137464016404 5ustar renerenelightproof-1.5+git20140515/.git/objects/0b/79b324dd53b619d52febee993dacf7516757df0000444000175000017500000004016412335137464023733 0ustar renerenex՝msו+PRnHDe1Y-E[r4&^hP$ت2naFN6lkVjFi}ιݍnPd%lt߾/{瞷6;Uw.VwzVTGe|gպ5:lQ=e2gooȔ8s*X;셌O^k Z۝}n,ܲv~d2l7LmY"9Y2UuoQ.8ܭ jV2rmm5S|JZiXs]ǥ8W۵E[^in;c{gsR*7r{y^W9i׭Vݶ+%vV^5hw\59ߪ-mMw쒕mfvCp'ŵ3FA?zZFɤ:]lj9)Z_۶Y;$p6@K 0~b.#@O[YC!-Y1-MTJUJ1j>=?y!=j8ZqZnmK r //x[.s(/Xs{^w[fU ލC]6B^ЖFW̉3H>SMwjbV!쭺oA>1S;uu՞{ ^ӵ{Y{ce'?=}7zpǣn5уߌr#=piI>n/p[TFpT{AVsg{^n-5͓Gx{R2H^En,{\ W%f5y$d"Z Kb4%âZ?tȞ]orolϣ*)p3hzro/hC1EA|0;? ꃠ>deXڃW,a~-J-%mw3tV$J'xFM'V;=[~@[?et^3 AuPlw?ɯ^=6woަVⓟf3Ѯ^K5Щaú)vpQ >n/hl ( hLѰF^+-ht|{:㛜czیy{vAkhG.ZN^Ъ-wk[.;w;vj7;M?uv7hۣGqkc`h/ nБH)N00z: > MN^^>avwѓPMM-j\h5vgwf ضY?Ш6~0pAP|o:"T;zƽڱCEI)}?@ÞZ]^b"rszNw۪mHRt­D bp\X{k*|.47~ `D UsϚSL*wgW٘3\eK;Mo0 NXPV w:d(ka`ŌM'8~y}|.gN>?zYAr̾v|rANyNKK0A[嵷V_~o^%~Qο7l;mf_|+{ikˆ*k`Uius8s&k&ܼaS)fϖO[VޜB>ǚv}`d팞ADL&HSƁ NBX{܏x^(kuP@,w9Mfr!#og/٘:-KH q5YjVfuP(IOM&)k r^9»4)æHgPrDUB昕]sAFCYgmREe;]Ρ?` o=+ xݲW{C}'$iU?uuX\م\Nx&V|S?Z\;%t\,*`2JՌjMMOfT=&)lKE @^ZO kڐ*r,?` /e*0$!Xٵ+}0p4@AYpђg4+KR BZY6 pB#mu%h>ݦc_,%3fJR&G\&z6LTÄTi2sq)Y b-%#ߩXN2jR?k{ܚnVo++~/\*+Z'{P-̼xAPzpޑ@./ウwtޗߚLjl巏i㠚RnL/;@jպgI˾9ݻg7|_OTmC⥼H3 hc\'.!e-Sm$) R{Y;+RFaN3q&s?˫39ZPY;X_҆grQHp(-@zCZVmtƙDf@ْH^({N6Zd,Evp]bZa^Zmyod>7Egro--~O}cz=i_+ţ|aN{dY}F/91=׳\F6h=W=4ګ=;G9*0'8BGxkbXXSi7mַDӯM5RMD8{1Zr 8v[^AyR QS"5x9-KS~ ,UK\3B375кr}"6[laCgf n Y,ГThUJ|C<1{㿤"WGջvE}ܥ"}9iԙqO䐂QEbX;m]?zEF}g.dN%„e,T4vM<)ǬX "ʑ|RB>^ cD pX!X"d#=~N2X:&16Efh'P1PV)1ND+ 2]5*o>85}p͵/rJ}bXb]1$bݘy)a@n`XH!?s- d1 %ނ^v6hj%„6ENPz]s"D XG#:+NYb)\2AmdZ#(ykOYjР1ި7 HFMyNINcBvDD)R1dl('qp4g=9Ҙ.&FȓoTCy#>Y. 3y .y@-~:oB,)loj;pX"hcy,X<}M / 0Asw܌kY.>Y]>M(MXpo/wHc+7b퓜ڭb^}l#Z'3r+/(R~O@uGPħXò+D_TS$`B7(nlڬjM6{N9`<1L㷇+hh鶱$DSiz>pTǘ8@"mdFI v:qX @vqWw3P*ÓOTC~"% :$7›v K A:u?f(\Oۖ:h.AD;76Jx[*ZUk4 ˪Umb5&ZeՖ6=IHIC1}xS(/Q[^( U[yΪ8T3B,޸Q H@ͪ\F: 2+જ]2`qA0{<2$G 7~qf{NQk̨ΨFvQ$o 9/\O>W: Kojb/D]{kxWv%Q"*9;v P&c3B1V6\A*z{%NwK3(sX}rGϬ|B/h kARg9I•pDH1Y Vk8&Cy\.E]z jT55ao]q r;,}9h8@8]ʒͤB}MH01& '}]@^4no[\iafoA&K@Q 2+!@,0227e b'-)慮iB2^y.˄%*k@8S!2X&!~|I)dhtCaD> ;,>}UiQ!C 8Q:] cFM>, fŞ=35?N S G*_Zu[p61l/xh,>\M G#S y Ge O{fa<~%J]39E&5k`6T6lbC\ M6sdԒSF wUD8}D oQeȦm!H\bjTNl"hhtO$\|O…2UA+g׽ΞWZ)QA 2gY55lS}/BjɨeQa2,'˼q!Oiy|8C+;hsHʪ J1zpuՍ_f7'o4A1#ʔ 4Lj$L`YbS Iۓ8zG 8,nM '1N5d*S"+bg=&%Xq\6a_̩ih/0!ӢF#=t"ˁvR# XʋMff9UF&j(fX9z|2up^ j Q1@!(/DV F89s.gZbN)RliG:NCP22c0"\Nd3Wyi ̒T[_S3ʜ@ ;wԃR%!~y?#d[yuW2&H*P2ca4 u洵UWـ?1`HӺKoM0M)/͉esKF;,4qEpRykvU4AMǻϿ L"PEiL)JLL!,3 KgQrec!N$ ޒE%pejvwm9"=w c`4OZSw `X'S,M83G-Y- ^`c9r̙݃eƺO?8gGr,1dҌ>B(T+Q\&')DOh -5Pw$N[wB-L(fs DQ!c(H*D>5ڊ4>WWl{.3QBoaoP|"zzFҴ\wx9H˷Nw'ZjvmF9?lX/Gxv6D:^rbS]X] q7չqx^o->!Q Bw0;4'|7^0FΫcIfUIzeaIWU} 4*_"2WP&V"5߄D [Nǻ$K%Mg᥅OJ[(.nonDI,̥0 e3-r{CW\MѺ>AU ?Z&䙒H=CS?a=I=@=*S&Q..WrYQ;Z߼ܟRhqӉ+ s'OyyC.-V 0̎ݳWp jr,W=%kF㪖 1UU&ɇ̆Et|>YiJ &!oѓo:Ζ7Z]R:"4*?GY0&gi\×q|/X@=oZPjTIQ!jRE>W5&5B-T$+T- kwjBUvf+NL֣|hX2L0:"MXrC"P5dRhe⒏aN T P'e”ɏ%4 :1IXw jIʛ!MGԗ9 p=WT)&m =" )K<]5 0ab|#Y1oa>nf~L)HAS$g:y^"VNl{{šHȇ T@ULM_*zcriR>JZhw8Hb2bIBa#2E:loN44hAI/IBPK+'"9YdѢB(P%)Kb1@Ϛ IZC [fĪpIp@XvM툕IGi U5wPJofIY2?KLM BD݃!;7ϋ_FE Zn,k , | Xɘ͗pEI %aJ(n)¡4% І<|e9,zRgG动'$ ,ߗU% ߌբy* YX9K ҩ~*`5]q3IG ||Ȩ F5be>=ф*7M_4Xa3D-sز;Խ3CȢ+OFDA M&YLbCJ>rªEXއU L܅U98_P1sʷyUC9r1>ut2}"\,- gw?~PW,W{װ7R AkhJA>qt@!E8!#DN p1O-;QS`JZH/6V[vA(2S~=x}qiڪi#= cf{Tׯ͗G!ُ|(_N$_T~[jc:A`B|0B^hBd7i g6YҠX9b^4Nؤ~Ss *f~p+RH6f z3t݊NC:E d*jZ/q f%Xv)Xh|"[?ߪW{Cz GšB| z^pmyx|M/TTOjC8U~{8a7n ;Ο4ZNSFi%4R!0E1 ʾe݊B-c_s{ 3i6gyŏ,N}ݏ$aG+<?*.]QCkD5JbN;؂3ѢqN1LΧ誯k)iu`Vb>b׷7ENg?eL\;`_Ա^CYNp}-D +i/ g |TA~miۙp+E@o+d+p[izVކeQz/K̜/| ԊÊu6s* cϓ3|V6`EE$?D*5JFO3qo1Ǡd@R*h$^? Bl" R`IuR&7!艅F(8quS/L֎CȂ:Q^>œʖx.nq w!Xa[ww7q?ȣG"YaB <:Ğ }r9lRX~L2_l\ m>$?Y9M̋!~CGY&E+fbd8uh*8³(NY`-.fC LG|D?//uO\\g;]1'@No+0υ\> {0e`= )dXz{b]&C];md:x;'c~ ;-}ߒwmw~ ʼOώ5qE\ƙ^ Uombq)XOI:=`,f:'3밲8K4Xm3O7au3`,[u0IFZſQ,N( \.G XƀXf񦋿;^y ݦq`@JyK<$0)k^D\-{\Ig4ihaAVN ܜr֎y)1SYh^JdM ZJ:q_xi# F0+4=h>4/k2&U>E *(;B2-(NH\k%+U2`yKa{fcIL߻1$Q8J1LLr UU1#A9;1ՀhqN`e6 %NVO&sG/щԉ۔ϙ&V7'}?Q.5I 2Jͪ[ßh;f̥0h_M@2(Y-&F6l&%kIH+n;΅b:O.<80xz^nΈ53 7&=1QNj6Ć ުtQwWgɝypF찔1n}&Eά?v̾jR=$ܡ,T*< <p+@#C84iW43x8܉$ϞdB^QO2HU'-1qP$z$bGM 58s{&a<[kTqKwO]&e}Ik+%~\zQl['dLºئDNm4 z[+D& 4ƜQgjՄ">wx|Nc=Mcv§Y+"qL^Arٗ݊ݷ80ҌEY2`bzRˬ pf2()׽j.+3Y/~`k1p$@blk@h cNRm43_#aV#4"̈́9fvqޤh0V2$JqP6Gq gd0't;ؿez 3|.=t¼t5N Ӕpve%&F%%*aSMH}JLa3ƭP TBBm.nn{5J%2&R\!7CwX޻l4QVΔ=,iN|%̨68=95bVpmJbB׉ӏctH"]%g_p?J2b\j$8p` O _" W4LTL@u@0&HQNY0YvШ!*úf= Ufߛe찋0 b 7pG;g؞0~J_L- 4N;()nqېf/e7E~(3Q&>cﬢcxd7LacVňx8h N\ +}mmɱܬ3`N Sqe9oX8w)ԃM6nx&W(r<24bi,IDW D$m= J鍞উfm?AvUKrwNG&#j/Jen'&u 0 ;YcN?s;|8ieq_ZAb]^?5-<4"Ε/7^ Zl7憹O ZH+c5V _$lвئI/ҩ&TbXA*1,s d9g L|<6U"v<7ݣvg~Lo脗FR_f%u"$N$R}/ǀ=W t^6.+ ?ApGe9u;[Ѧxl5Se;?O-I01$%+kx[ Vabj&2Y0?$/F-da_%/_1ul -j٫g/\ l xUOqC=& AJ5{?iL0y$?%C=dbOL$C=eS좥/i{' W miaCg؈'?jwC R;fdiQSۥ^ n96no+5[@[q=AE bϖ:uD>mEYY33pw"#R1]q;_zc %! e}smOpF8R>?-\7Ai0\'  IH HWrHd%oV\F?M9fkWbf [#?\yq4 sYT- |^D$ׁ7Eۣ/;{yxv4$3=& `3LOu ^'"+`gpeWd)2}1Ά{ipy?~TJ .O]5oYA3`"y wE>BhH.S[Ub6ԠqKU]Klݭᩙm:5/ZKLj|a8G7ȼ44v {jOb$9}\f7.|[Q2=bßc5#oPrH\e.\GdcJPq(n@GÇyUrhieJD&aF3SS#2g8g|!0B8,=jG[|&K'%pμzx dYG[`-*KYDA6ߵrupAj-u"7`|>n1ª ?\p=B^Z}G>ŋ-[ 7 ߓ+t$RI GO{`J%)mlightproof-1.5+git20140515/.git/objects/61/0000755000175000017500000000000012062702716016324 5ustar renerenelightproof-1.5+git20140515/.git/objects/61/6922448fcadb75f1bfd7d6ae98f1a768b7cef50000644000175000017500000000041712062702716024013 0ustar renerenexeAK1=We['VZh"K6MB;KvL,x<͛Lmٻp0+:ŧ:fQ >=ht"/Ys0褱1i{{J?i}tثCoFa2K6L b[ҙ>|hw%ݭOjs 4NBc-Elightproof-1.5+git20140515/.git/objects/ff/0000755000175000017500000000000012335137464016476 5ustar renerenelightproof-1.5+git20140515/.git/objects/ff/ec162e3f58110d485b89306597bad6d8e32d310000444000175000017500000000102712335137464023475 0ustar renerenex+)JMU057e040031QK,L/Je8ooQml̫|8" ? ϝ}Yl/En3B&LIFb^zO~: \gh˰H*rLO+d߳,yի>"E2Z{@dg私xsb=_?*lW^Y\W\NIz?L'jb !~n _1tƼzws_755۸#>⩔d >XK]Mժ˵oC MN_NWe>PPYWXt#9zƩ/J66kz QT\̠{/Pf;\ z?=k5lightproof-1.5+git20140515/.git/objects/ba/0000755000175000017500000000000012062702716016460 5ustar renerenelightproof-1.5+git20140515/.git/objects/ba/b4e9d2d448db0c2db42e422073afdda71bfd740000644000175000017500000000532212062702716024077 0ustar renerenexYs۸+ptnD]dvzW's2LܴC$\(+Lbmܲv_L(J57/L'K6̊b2ar&:gX+&̅q֩Ɠ>ӢϲUg GG,(YY,:}߸~W7T ^zٯ^ny+ʪ:IWNnΆ{2Ŋ/gs"^L&t/XNj|h;j1HD#_?E$M\Mc' 1:'|*L܏"zf`6\QfKXLLe^'׫AGDW\D!PUKVMFDd.W:]bI ݬEC_nx:{ E}0{L9ubƒVt6&{0Zuj0A {ȼl<)hɓ3L]Sd JnD=+WFE~V 'g,w\V^Ɔ޿c)M=F "쀽"pq)K΍7ɌF0a1 q9`6O(wO{4 FwAÒHcx}w=83 ܀ɂ29Tؒ0&5hJJ`}m;2isbuʠ&Fc}D}>bx ;c:šc0*k8nQ:|fRB/ӳe|߅+#f Q>S"@g# Y6$4F'?#*"sywMɍ<JE (tncdR—1L؝.MqpW1HmI@KBRyx4qP11QL&j1x!hU=JKP)JYT 4 2ugĪ=!Hh 7ӜS^P෱~F/^P7Nronĭ+ĝZ{;4rm!uSv6q fHcQ6 gÀ*Xq耖5TY65V'vhXB5{#PE{/qʉJH(eC!,s,Τt7myf.U^q- H)Kh)OYd:6s8Q( l.m!Ym' +92i +6u.Ew㗋6ۜv7]`KMeѨ;iŞ2U(>yTHU`6p횳&V6ic=JiU9҅{dZ={)I_FZgs ^2]c }v aOa l])XoS(y [h[~ַ*uhũmx,:x3= -Q2r| ``+ PUKZK戸7UaP3-ːZ_# h^L7Ƅ5GKLd-SQ70-]d6z @fEY]xlS^~]c$>$@Cn8|7Rzg`SQ:SS'%' bv$̀} w-gƍ@QFI.KO]6I{d;'PRM҈Mա ;9 M$c?o_CG\"}(},d5;:F.ӳAz5yt(UٓFO]G}#7% Cٸ=ЌEīS ϵG7*QYcxSB͟mdǃ{i[r3.^:kW`t{uY?HSiA&V4 n#u;Cms|):~8,J72H2^cBeƸmi:${eMpn9>m(~ZX  KE#N|Sds[r_~9 *d~֝L|Z6ZT JQɏ.w u+[ e*c)||_ɔ> M& rZABTHѝx>wdflightproof-1.5+git20140515/.git/objects/d4/0000755000175000017500000000000012335137464016412 5ustar renerenelightproof-1.5+git20140515/.git/objects/d4/0d3af8d4a1c13c4ab80c3c458e798798112c090000444000175000017500000000153112335137464023462 0ustar renerenexUn8g}ŀBFml@ZhZA`$J!*Iv3r`k؉̙sΌ[}ȾԕY]Z:wp h<*SV&((%pDhZ5FX'-w?[W7wW#w=Ey%<Z 1ke;_.&JPB2^QE1J _FA_q&шqP;x}wf݉^yZұxda^E0U}COF 0XzaW'vr~&Z@>=VyFjE`)h],G_䊹,;/#>%3=6:''l_`R(>|M Ҳ*8r66KZU,>P)> #s yVEsqOhN8pOVG侔/{5xWq$g P5ظ8w[، NEcˡ)N &1$&u |r-{|n0X{fo1}iGk?CPGsƗmɾ'* QFԑav,]:),]b8_u*鷇#N'nHp#*C-.Y 7}lightproof-1.5+git20140515/.git/objects/info/0000755000175000017500000000000012054114474017030 5ustar renerenelightproof-1.5+git20140515/.git/objects/c9/0000755000175000017500000000000012062702716016411 5ustar renerenelightproof-1.5+git20140515/.git/objects/c9/381f386dcb264fa85e70afa17fd03a8b1d08a00000644000175000017500000000163312062702716023674 0ustar renerenexUmo6 g BAa{)|(}g:[vڲ ڻ}eý$|!-\3Qǻ/vڝYYU3Z;zuwpyVU[Q˭?gpD?v<|6U݃NZjCgPu3+ 4j öP2`>K#'N|X+ohIĄ`F'ޫ;mUB>F"Eꖔ%n /-4t#kK(Je*l0 bc1RҨ'ExTfge,-(@N\;JL' %' B7"S1>f.2S;aM2PW8*JG.ۻۛ Je]UuIZS4I"H]\.2rʨP1|OvbewЪSjǼ{T)R5;:t7\+TW|=d7Ng)t 3jIjUO`*EODe V,]*r'ZY;/*==N՜Z$(ωriB,"o5MYZE91 q浾,JKLҤӬDA5KZFb?AGƫ}Gz㨲o^E@~p c/8v_RI1G羄A|r]mgsC?SKq@uP+I:߂g}pLR/Ԇq|trNuET6s+#A s݅AKat=ʁlh횅K^`=lightproof-1.5+git20140515/.git/objects/44/0000755000175000017500000000000012335137464016332 5ustar renerenelightproof-1.5+git20140515/.git/objects/44/30bc9c7546f7f7fb603fab21739134b2f7f80b0000444000175000017500000000623512335137464023475 0ustar renerenexYr+S*.l'{I+ڵ먆 $GgWTCGkˤgӍy؛'d"^k%,OuQʱ6/]iE}dWM^d$En*#o9F7*6T #FT+JW:ՒrEc:Q-exhemu8(1ra $lonˆ&IW2=&9Uݍ2ÏB-eL9qr`?hxebk Koz@zus)>Q?r.WMeo_Qm o%]65Y7$^t)T w4,w# `Y8!;'$Z p)1Gcq/赼5>?Y[֔i 7~`jNLsts;:l[Kztd %ZaP4E]'8'PU),"o'7.\mJ>yZ7TJypÀ'©XFV)5%lW&W2YI!PFtGOO_͎v4ÎXM޻J Y|y[Ř 0{DwX0:TT5NWè cPHρͅ4RMխ}xC\]Q+޶^\MQt0wlHE^U`EG$c`.+ݠFx<`>Z왖uc#zp`7ho&C̍D ~{2/QTJ{%YX2U! &D;@ SgreOf9ᐩYt! ]| Toj%,yX䩌sADdP-R$^7ɝ?(# b8s*z#V3^{,IJ 0PSl/$j ÂK2cpTBDu(5qa[gCETvaem@LW[v0z;lg4y酥պZI5BA04w3ڲ/~!ȥэgOfG#.\#E­;Tr8j T=ө(d[)e< $(&R~9CK[l"(˧;C㢓L3\WH ԁ:768o7<_E~{l M]6ހD!9 ."w<Wp?2ia;V1?U lightproof-1.5+git20140515/.git/objects/34/0000755000175000017500000000000012335137464016331 5ustar renerenelightproof-1.5+git20140515/.git/objects/34/53598971ee3e4599635600905b5a3bb1c093d50000444000175000017500000000027412335137464023122 0ustar renerenex+)JMU020f040031QpHKOOg[KxNr kT* rutuL()(O(+(aș[A')Gj1.6t]Ȕ-5v}ܓC7EQJb ̋YϞYho!_?x('!CCߗы,h |s7Qlightproof-1.5+git20140515/.git/objects/95/0000755000175000017500000000000012335137464016340 5ustar renerenelightproof-1.5+git20140515/.git/objects/95/4b0e7d81fa7910047e2386a4e570252bcbbf5c0000444000175000017500000000102712335137464023460 0ustar renerenex+)JMU057e040031QK,L/Je8ooQml̫|8" ? ϝ}Yl/En3B&LIFb^zO~:}Xj`}Dp[}PE.9z KX̙<ًAœ%M%'3=(?? ś{Qg¼dRuOj;ie:᜵^V Pu qsc3Ջ{ 5Oba~ k&V.*fA0yBݼJg jBw0䙼׏ᄏ;Z?]s c8dygYQ*8$%8($3?O"7aSqxݱ;s!JOfX9?T\6ԠTP="` Vݲ Td$d0,~bq􋒍MZ^C%3K;yY(DOelightproof-1.5+git20140515/.git/objects/a5/0000755000175000017500000000000012062702716016403 5ustar renerenelightproof-1.5+git20140515/.git/objects/a5/9be23f916c2e336597d119817182072a7f9aeb0000644000175000017500000000030412062702716023332 0ustar renerenex+)JMU027c040031Q,+dx6M9{wk+qIOD􌒂x܂TߝZuBBT!Ahb[ms 2sZtg,n;L^-YpSwFb^JNjn( g"-^Mdͯ^ t6='wK-slightproof-1.5+git20140515/.git/objects/a7/0000755000175000017500000000000012335137464016412 5ustar renerenelightproof-1.5+git20140515/.git/objects/a7/8b002902f270f4dd8b0f38f80439c58e74170b0000444000175000017500000000023112335137464023321 0ustar renerenex+)JMU045a040031QrutuL()(OO+(ap>)Bzs5N̈́HNKgHTr?u}h6?߬pT^yS7:INdx^a?in{@*7S U?T,oΉw;Q2Kß]v*G'{M2_m;nS UAn㊛5_V5aWE1 <\ܙۍ4ſ5߽A◴=!UCo22NlP @Os=?w~r0\JB057'Waoo֟8x٨w(dK6S/l+/1QD@;(B DhN.ٗ&Scn&m9Ƥ3<<{y~[ɹB(ڡ Rj ^-{ӗ tሮre't_W( r:ZySĖWk*XMVkzC]ʚŒzt?jpZm/}bWrVM?qXwJ7rE7HZ7HگzM'M߰q<~Y3:#/DF;?j*3L>~b]y <98w{nͻgccudVݶMjsipK4ٴHDxQ}Z%uoAmӊѣ F6m5UazMUwF13k>'wT#92Q4C&h6v-wKӴKJ*Ƙc[s w4 7F^vxi4/|R&(r¬HV@ñ7a4'7)׹^ʿ^x?Yq /bgb:|CgTd_a*)^AYR13 t:PxL<,B7 EM9ɬHc Oh +Q" d2cD8ټHE/qЂR7OH='.b 9`^iR@4'EbH,ʊ,"j~d"ٓ58b¼B:s^ Eg ֻtAC@Ƕ%I*IU]% *ϸ\JHXMR!E h8/Zg(Kf褞WӫvwپSޚzc%/꒒ |)b%LHD'%Α6!H꥚jW r\9sl7jcem] `@ Ro"C\{ EOY%H-{i0qGG^ƃzhsT' cRs`Tݻ]? p5MTSp$)V:f.(uM"=yمf\ݻτZ~w%20Fx?_Ei9,[PJoBкD(D^s.h:=i ƀUVp9ٱB|D+%CJg.$^WRF30WgHζwΝE.m(SuyauDMGXѓ183*FFJa[W2aSeRT5)6= !,0s˨*syfQ"dy GkIRԃӻ9ptxYV°,Ik}@q~q߸SqCP0VS ̍-AxT'"m7'& 7 ŽT"1ԋL}Ӛ;q nB#*)MB^y{>} VHzӗT놞j򲔴83)+]W/~.F/ rL|)6s%dmB8]}P9_?{Md,]31Cz?%XiuJ,6ȶȳl7[%D± Ijc=29 ~6:?#_'cq?TiN5uE(0luacX=0,WYּvAJGpFWm~ϵQl"_ d #y640R:yw_S5$oG(K3_^| !;ќq[(R|j1 r8|o0  gdU'R)S"T•5dpAPDMCiQ%'^.H3e5ONBja<u ?L?:A 5_ZdT̅WUo7- 4͋z3qTnR,rP٣kPI4/OS#>v!3LXϒ׺`LU΂]Jq)HmfmhO@U2d:2IEz)_ XFcWŚQNn=#dܦ+ᠰ/nEI0eκP/lP7dY'uC@H2GP$ A≴̍l%EPvLlAL@BHq)kZySzr( :| 1&9BV@bp?CAUڳ`&?BBh:ZRFpS#T:-+Ͱy*6 o3[މej'S;+Ѝ!$8gy %I8 f-YtJCUn̕uzS MtpB&c_vY׺{ϐyu$аVQCBt&AShU5#ˢr#wb M?| dYsI$^hRwt4 U:[ĥp !v]CL -D `DYЮ Y۪ M)Jڇ4XF)^VRxR결X{WIAz3%bdV<E+ (kV|zDŽߗc*;LI[Vo'[ߕC[Y%%|"3B#4F~#Θf24=!GIc?Ҟ|t䯈"r`lbZDqkfUYI D-ѐC0H%bS0̲附s _c(\LK\#󴒸X} #׍gq >yEy_|ƭQ" A)mqOpn<÷z'<[:Nv0NWWV)5E FNs{Oy@gpLf5V89 k`jjvi sGvJa)铃}@֠[`*l w_PW6>H'2Y`9~f8vi[ͷScBO*5b_ Ua*B:"|VƑ3&cvbحheʭlightproof-1.5+git20140515/.git/objects/af/0000755000175000017500000000000012062702716016464 5ustar renerenelightproof-1.5+git20140515/.git/objects/af/1b572e012f96936eef9f3ea858b9c0441383240000644000175000017500000000103012062702716023410 0ustar renerenex+)JMU057e040031QK,L/Je8ooQml̫|8" ? ϝ}Yl/En3B&LIFb^zO~:}Xj`}Dp[}PE.9z KX̙<ًAœ%M%'3=(?? Pp&>yZoV,N+楗fd&U$20}RO+ %ŧorkg 1^\yM@ s fX6IpQ3j6 WG_WnT:#0PB<H$~|ݍ7vQj9TEkP!c<4Ҍ:PiǑEP%)E%yz9 ۞zxū,mܑf TJ~2NW饿jڷ&f串Ei5q_X1$#? $aGsS_l,lbת(AH_ڡΓwD&~*{lightproof-1.5+git20140515/.git/objects/5b/0000755000175000017500000000000012335137464016411 5ustar renerenelightproof-1.5+git20140515/.git/objects/5b/1b0763db72f99ab46f84fbbbd21301619d0d120000444000175000017500000000203612335137464023525 0ustar renerenexUnD_iz@JE Ъx8m:13&3?KX3έ )o/kWi2SY7TT[XKE=[Kc2rnT,8?oY:Il'TKB%{op,WԮl cb䁭FQ &I:&d2?;C>? 4ǫŜ畧xBg)>]Lrbp%n]\7ґ3_ ˴J~`eZ.i)Qumk̂ήβ3Rx=]g Ypa -\.UȐK]*k6nn:?\ȧ}'UI&9Dtz${'-PkNb|8Ύl>^$IBs֮sat%Y%%IWb*~}"g_VTY~VfDh73Kv^(5kon!ǠM-kvd*u֨[9܇ ]von,NyBp7 rm!,}0cj%BYzv)9K\O( %FetLo EzmoX, i(ntظlc:gIDg,|FSp=Gh­YO )rʃG"61A rP4}PZϴ\HXt;%tanԊqL@^Mt80 g{;ohEzy6`bE7Ɔܽh`c۫6646m@WA5ҹppMJjjX.ƋFP/^ HZp8)g-&*%QAj!K+=-dڤT [ć”x\2e7ph3 VH0|iѼŹP_`dɕ> 4Ft7#Lrvy\)m\R:ؠf;[/!/[Vw-E? 6G|ђlightproof-1.5+git20140515/.git/objects/5b/feb06c22bcc9492b6a2e946f8467a9ed3b3abd0000444000175000017500000000027412335137464024052 0ustar renerenex+)JMU020f040031QpHKOOg`8{wknLiY kn[U(5>'3=(??->4#T!golaĸ t9"SWxSpOHnE)% 1gO;u!>j}('!CCߗы,h |s7QElightproof-1.5+git20140515/.git/objects/3c/0000755000175000017500000000000012335137464016410 5ustar renerenelightproof-1.5+git20140515/.git/objects/3c/86dfa381ff4243d279ff488133426af3ffaaa80000444000175000017500000000046112335137464023641 0ustar renerenex5OMN vS7t@fbƕ18ĸ) 5m\s15{"' %Khj5!I#(L!#b:5Hi9ei cdlcBٽ:Hm[`wnM׈2EeZҠKRE?}|̧ot-8]X})[c~=P*Q<ʐzS\ÀR,SҋEƮ„\@\m6A ,pN&NX0GH)a(`pop80ҲO}lightproof-1.5+git20140515/.git/objects/4a/0000755000175000017500000000000012335137464016407 5ustar renerenelightproof-1.5+git20140515/.git/objects/4a/8a9657a530c51580e88da7c6c87ae280bbf8380000444000175000017500000001365412335137464023514 0ustar renerenex\[sHvΫ+Ԧ -ɻ;xY,L֖'5; I@"a$ZPj3l-;?in{@7S U?T,oΉw;Q2KC] ݓrW[p;ΦT37 H@in7\q˖/ibTQLou:2WLёy5\"Q,-XDz!o&X5CnoA\MfS5յ5;IE zAGOvwuvY2W3ց_fk =GQޏWAx&bA&.a( j4㊴e@+PX!Q>LaJg.8^Wcwỷڤ DSCe{JTj Kxk\(roSf^?R'?BX;sPeԕ a_Đ=*fu޻b\R8Dbq ſeeG]=7j(g[ J}woQ]3>?Cs)`E ;.6 ;sB@Qv=o"#-[t>QբXԍ~RYb&Ȑ3ѷ9ab:=P/EQ7˝UtV݆d WC*[0[3"wozRF30WgHζwΝEΦ(SuyaqDMGXѓ1(3*@FFJf[W2aSeRT5)6= !,0s˨*syfQ"dy GkIRԃӻ9ptxY6°,Qkyq~q߸SQCP0RlS "̍-Ax4'b"uU]qI3cj/ a >※$A.Sߴf,)m'n-@(qDE#P+o`ާOQkHoj3TmB^|<{z% vE#DOP ik=<W,ȋOmh\)7Ennn>G !%89/A.GUJ23\,* T=i}[j6oy p1-f3rh0pI]{jWhYwӃJOgڙ wp(x?DG 6^bKD?U1?1Uڭ~帇Ț H-zUG~]c]M{Hml0sd)f,9hz|o ]K.&n\\NJ~D~vS+G/{*w-"+1eqR*%cLcͻ~Rו[R JtMǕT?JgA񈇳8$? ^ /Ɩ(I 6LPpYQ]bx`cɗ3_y!ZU1j©ikfH9ry*!DkXz.bYaRW MO^ B;$I=B(JXX2qtf!Tk0 a*,e]4he[׬m^RB#I {% n܋MxC>;dy6QVj"5a\ep>#O*`m԰okF#ȡUD(\Xw\U k#%wޯ>`bk?]h*OCB7=jn(iK}V,N};BYvp|Bbw)ƷQZ91c q7qI@ʧOyMj̉‥2q+O{]nc7L,{wEJ|bw{%T+Q#||b <C9SFn3?sXqlEKKhP.>Q}I g~3.Vg?` Ή=ȑoQ6J%ZO&FjheJVOaW|/ ƱkhT8(5}Uj=Pqos%oެQ1kFk )Yb $_Am'kc!n*;(LKqSPq*TtȦV+>se ܠkdQ(u4˵j̸)VP"GüDGaS|'xDMėV$)KaV«*t귌 Eu8 7)qPFWpȂRiQkE$§ީ[@gk]1*_Zg[.{D޸&1\Ym }←Ta^W,c#ñ+YP#֔[e sFs maBS)VʱJ K R|ebZ(3J+aK5KjJRTWknG@]c:M2,z*#dƔpP"} @$t~xκ.lPwdY'$YJ QB>< ]),i!xA:3s#s" ;&lAWL@Bpq)kꚡySzr(+F;|1&9BaV:2p=~&3d';u>gL~, "&;4EchIEL)n _hS).m:E+xZi}2 hdzh" |^͒$G9P/ͤ-3vd)Tɖ2W9N#f^h<=B7mafwh K fi_k+F[Ϡy.Hˆ-RF-31]4 FS=}dYtZc$v9]|XnH.y_S?YVG,Y)qN}1+V.dpHY;n!D-X`]UM)JbIz[ UKh^6F3#SYs"KVPj]ō,ZG &a8Ydcs:7Z_Kxxң|e705k<~&!oDq}s e+AS6:8ݧ\_5[%wJ. 9'=}r9 "7s<$1-Hifժ.HBS%'tAV5ԫmfGb6>H'2Y`9G]uBTP%)D ^iQ.Wpy{4R-}ՠC_-t%F4`lightproof-1.5+git20140515/.git/objects/ae/0000755000175000017500000000000012062702716016463 5ustar renerenelightproof-1.5+git20140515/.git/objects/ae/623ca2c739d734099a0e731cb4a79217f40c7a0000644000175000017500000004006712062702716023461 0ustar renerenex՝mו-.78845H+TZb5h g0*k'և nxw/ڰ"܄à) !9эmlboߗs=sۭ5╵+Yl8}k0rj㇭nӲǏn]hp0j2s7hh`ɔ8s&Xg۩셌|3ڵv*X4mكg0M d$oWLm["yX1Ua=pd5Ԁ 45$k;k])d2ӯ5SzJiZw[t=ו8Wǵ'E^ikn'c9To՜v޺7br: vJqg{u{_ :a'WeMN׷*EXavm=7ben |64}ֱOj34^{ݎwm9#PB;0kGΎ:p}?p:Vs]+`>h Re^Y?mY>$>\JIJ)F͇'2/gZMWt!Nc ANN!}I@ V`~o…aa zaw7Cwat$-ytqje8 _sbCaҧϔzݝZ%U0{k[OnÅjZA=1A첓?~`t|4~_?0gߌ X|~zn{^Ps^P5?7z 2o)^퓾G i>?od'>?/SYsKvo ȯd"Z Kb4%âZtȾ]o_yX~JA; Zǿ >? b}0n=h4F h0hY.`ՇQy!po_Q;.pH \(n/l ޠl Fv |*Nm Ov?OX vt;ǭØ' agzw_ةkAޑnv >ͫl{A?#9f% 2X]I?  OF{'[Ae7'"aw~?~TS`=huCL.4d=bn'3l[쬟vhw[XV : O!j` >wwLC*? sS~ġ~jO^$RQU Yunc1y;}cwzlg$Uwz;­D0Z8W.lQʛ?w96juZ *=|q{QEPӇ?0wfKyzN6Lt=jƳ 7&nZqyGغ$X1 Nߧ 9L2MtVObh?f6o>IC v&bQ=AOVp>#_~{ d2/_U&3 xgΜ6n!)J UަyϞ y3gi.[+?5 gJ1}|5X 8t'kw e=$f2Ao2:"`Mj0s?IM8}!Xs,AmArr"+x-Bj ߜ<3_תSuۖ̅xdYBG?+7I'y>LҤ >S#۲tB8ʙU sWVwmns =ULJJJQR8])M˶^}VÁTe2@Aae[r9wXgLx;v/#OKnH\T4/d({Bͨ dgBD38L6iYb693&!yP.TuYwȚ|OTaIBt']RL a=_PF$gAYAl֗2%h^ WS_ AK+klR`DGz.JJ F}2j {-NJ`Y Mf̔LL|.,4 Ǚ,TMe+b$\JFS8~YeNvq>g־6 ݬ*ThikݾlB33%A%yS7I}kuuռæ󮼍ƼSI|fi{cX^w4PY}ovpjmY~dyX276µrJ^ W12+)IW"_ΊQV;E 4x`\5G-a\=\/vjT\S a72 E-ސer/Ifh$ Wxd+ꦓ/Mit7\؄6owA{ɼWVޏ~b.oYF&|r?4=wOj48nU`4ϿOO>xu?3]Aќ_陥W^[1?Aa85<_Zd8k0Щ%;L/iVahi5|*Z}#gęj?\v [Z]-)biY2%\aNvq62B4ʕu5{eW6us VW7rEy*vž.x J[~ Aqsa@|w[7k%'dS?˜#(lQ[;lN7 5TQcR蚢҅ UwDEyI\5±E#yǞ( #6ׅuz8bDJIyYA6#mhLtΛm-H풺v]iKbq{ily$A> )jU. 6 VupG^#=&o6:IR)9aT%Xh;h- z$Ei?=4_f8,³[lDKk[vWN8uq *fѴ3bT{r,nL^Њw[ 8ΣfQ76J_HNΰ &PĵER$B-5 ⑉Q]l4dtb!GEZ]kEm/l+55Og|dKk/y+<-R~YQW9D9rTJH} Ra9sFߦF6a^\w>v0hbTxkaP8ҍML DUlh\ GA-N3d7gvkrیɤև0\‰[~3[1cc뚌3$[Ht]HB1;Y˺Üsz.6G E2Oa&0sšk%&k }Z s.s4ut%'@v!вftMSl IV?aɱnC,0f̱ y&&DHH gx/5Ht.ktI:9i됉>3lÒ<;~,L%q^=CƟ~ĬЗ.?lM. Sd.Cr_\|,w/<|S$DȦW#0PN(nzzK ]L'F|\1gdmfw(^D&"ў¶6| X,6FZǂפ)w͸z3ċ݈ b~4kZ";>ɩ*c4o!N}tS_'kX"~us}%oֶ3aw6{nRT~V[b% ^뼨"DGG 1DӼb xtj8#qGVk\9b5uLß<~l[c<+l.b/}+Pݖ0B|ʎ%{BԡZ ܫ 9gKmG۸X#q׊Wdg!p|2n:tj@ջ/QCdL!Nfp DU0l!'#׌_>:eE=h's2ҦTioKVjRoxiuU-+SڲRӦSbR(RPL>TAi5J,GQbfF6Cgմ;k^F+B㯌t17lT34P)βજ-2`qA0{2$G 7p{QkΨƏzCo>ul[W\Z)R&C 1@MHY "ZjTtpp1Ӈ/59n}0u1C&_X4j͋7 c EX0ўcѲ )DjBTsx[/޶YT T5T4z\KPb2 eӫB1V6C&tdnke!y}Nz}O(;&ZڂmC^$~?6hc?50i>RO1WYTQr4?j 2,~z6`4?2˗Α#GQh19鹗=k0[5\1Y iMB$K'LXNw1wLZ]2u^xuEz^M\}'X~ ZD蔕Ҝs4!a -7rv}c411H>`/-E5| 7y&svߵ!>6"2Õ|ӝj_,&rp'seKk?Y %M}RT n]x1hW6Gq07a]bC$ODb33 iLq9m3>#qAEc/I,Y Uo: Ky\~|=9&D$jRO;m`%W|#eqXǕ:Vm&%vDshJ,֒ۓ́MHx `WGgE\ܟ#foA&!9@Q2>#@4227e V`(-)惮`e\ }5/JSրp'%|&!~|I~)dhtC!D>ܶWųnK> U*)~"]9!} tWC7Q);Bܸ"/ #ޖEah>Rd>{vnx}Ṙ2@ 2g55lD3h"ՐJQ& >:|ѾrΑA'̇3gDK:/x@)Ւѭ- 4|iCɊjvLpN5(LTԝhEK2cC7,n|J '1N5d=«78 ˱7A=:(fI"՘P^̙Yh/0!=Ŏ!5t"ˁvR#mXjfyejC|'W8Ѹ._,PIKrRd N:l >Gr&*",(qR{li1G>NSP2e0"2Lx9Q\md20KqK-M̐siQJj)M1PFĩH>'򂗮d PUd#,#'`ìio4AsFc":mbc 6{|0: :es[F,4GI!c._p\-<0Vz{BntFxX42Dm1Œ2 đ0NlB"y-C$^8VIU&< Îrg٦Dxy;@8_/zd={mhg*JbRMQ< 8؄eIJSX:*.;rA /,r/o"'+SB˹сcQ<}"Ղ݆@8;Ɔqbiԙ9jȿzni®{Hc,t4ը}Ҥ@?"d%.p7Gp8'MgZI!B~Fy&8mGr4$|C2t$jBaSD&'f ۉDDL!ϡV ufۛ |0~*Jbj; !7scy#iOD7{hh7Q6>JN32NT}.s( w"~sڭfm)խ{riR]6 JB53brr@EkWCZZ ĽZ^& bih1dҢ, Q^zŏM]эH*&2rfA;.Eyymdh&ii4wnN\UI[B,OWMB>LX2߈6cVj}͛ץAρFyy^<S RI]Nޗ >'&a2U:`MHU&M/UaX1x4)%-5f 1w}$40Nˀ2dȽ, Z`eR7IY *zbiDdb;#'I:`$,Z#B($ExIY21C`Y5Yx!IUweF'a?aGB$LgMZ>J[B̄Sz5KR!nWE^`jA/Dڐ5!z ٙy_2D-z3b%c6_^%-D$ 44@d J氼YD4fK_D}F&APeCUE^\JEբ* YX9KHX??,2 KԵ(J6wGy Wkmv`o9ߌ%AF,D@7~TcI>\Mαo/W6"|/EW̟:8$) YM#-X>nH_"2 6#I~=!ُoɗ9ژNa71!9qw;?73 iPOBz1}_~g}flRǿpa\٬\gÊT?fYh輬,C)']/NFQ%z߃[&LÈSΛhp"[j#z GšB| ^?c3c SQ><Ԝ6񣄉<׸Jw8RX9,F_%xy6NY"@,}S4aث !+[խ($ <2u03v=q1/Xdq,L#[t Gu(5:]*nWgEߛbOU_du`Vb >8{:bTE_OgvdL=`_6^}Y{Np-D +iw g n |TU%6La!OrKvn5MY*گ=g>طV^֬3Yl츞Yt泲+WdY<'dnK:u G|7LIu6"Q›BY$WѻC/|IF⼲JL˄~%׿|(<~5zXE.:MKA (Q<4'Q!;rCmh-KL;+cE<`Yy:J.xwL\\?hfB\`pGhe՗CvvOEJ7 ;O4ƉKۙd`ouw6AOUsqq'%`:fQJd~b1-W> #]{q?"⏏9,wD BML %=If/Wj#SףObNc~3.щyIQk|@ =G.?ʼ-, >u' 0 @AUgX\EBLOiS0t4CW4号 B~.W5h^=F;`? )|dXz*N.!֝L EO =|x̓1w“gɷwOϾa+捛oٍܼϯ1*e@\QP[=Acs^`M z4Nd5әe2Y hbjy" Tga6I~+ʮS1܇"'~ga]آvJ tLnTL ~c태ͽu)J%7>ڧ;Br5މqc3gwwt($|SO5Q7x4*%i];tTn1fP(۱rUt- $2^!ڊn7Md\`mx8yУ{lvUQ cP)6̾M,~[-13qcNQ5Gĥd2A3idY.m;ygCTk"TnE A_ B[-A:d]% gl)xqM8ᓠ4v/qN%7 =|"Դͬa}"aГ2F!SC0N( \ XŀXfo|Wr"n80 Qܢܥ\_qeuRurWrVf-j|rZXվ)0[r^I~BTV14ZԫY{勗._Fͷ$w]A:9Œi^dL(U*\ EW +(;ݳB2-(ΖHk%KU2`yK^'bX󿾞Idnଈqw7qd05as$F~,^TZzU9|ـ&Oe8XU>Oe̽40SUSy9)39L&nO}*| ]5j@dnї#9dP[L 32l؄MKœ>V,N yz9xsD>\w'^-\y1iwp,aΝo{9#0_WD9.>7TMu++`lb$Г;kF찔NM@v쩾R"gC;4g T XT{TPCz*sGwN ! ,k |]eO)wba> Fz'Fl}8Xɜeҳk-1RW$z$b‡- 58 v.&a₼^ؼcYqKwO]e}֙Ĕef$V9mԒ́IX۔`nPO"ND`NcufU1&lqRQXO\M]O*⺿C%a fN4j(|y߱"b($'}٭Hz}  ͨQd% &7,ڐ o@sW;b:St W,F1ȶFi 0/EYASz<ӧ9f5O:8IC>.RLcn' x-:6n%3P pF;ےdtCDGkc^(wr)G*r3^Ég-@W2yj)}ʲ!FͳPKL}JKT¦# ,*!"ff;ɍ/|+zPYR: -Wȍ'Н+ְ1(+gJ`Չ4'Ēj"aBȌZ} EiZ=sX/M a0bj6eG E9fS8gBK*h9!,p{f$]L th8&out. Kec:J !b[M1$Ky":-LhHh|p(P[7&Xd *,FA[QpM}PYD"Ou Gٷ⠐&ʠTX"^Tō1&av@QX2K\+mU7XnV90 Zg8T*qz&7,B^CT&YJ 7<'V9`1ՃuѴHV$P bE"vyN:oE%ƏASqpD3x*~bY$Q5y6Y9 X&D޼+gR{0$x~v>Rmzsrg-'l:ll" c&c%-AnEO+% qMcLņ8st/sʜqV[fˆ Mh+G?t/{>섅ʓB* °,Y\sǖ8lư˜6|!L8}rFkv,1!aXìhQL$F!ʠwư<2\Ly4FBP$}%E0V~AR=53ÂgG¤Qo+xe1Va^ݥU!Wc8rޘD=L F~-"h_$-$`*3̯p4]i6O}jbP~8f䎠Q?ӌi;/C$NzzLZPuf[xBaiD+ ^d%Pj9UZU\a?dީNlX +oAnma&L/Saİ/d'=@54%D':tE $K/r=tfNx Lo$5eVRKt_H"OѧM,r w*ybEc=⅒rXoA;݆<Ǔ `ⅵ}.,{e[Pt EK-^?., e/]xq-([ / ʮtSe!I9L0 WŕR6L}ԒT SKR)|\&M0kj&Ka⯒ ]2rҿOfu2JSW1Wm⬖zb)% {/OV4t;DodX#Ǐ!c21J&8$ds21DL Qv0.Z fw:P9QyyЖ& 9T|b(Sެnž+T5֐ 7#K7dDsno]*Si-^j)w-έM@[%I=AE1gK9"a6̢͊׬BY{cOꙹng (ܝȈTyWN|׿n$` q1!o n]30á_geߓMPLBD(Dhݾ1 iߕ>>>>?@@@ADDDDGIIJJJJJLLLLMNOOPPPRSSTVWXXZ\]]^^______`bbccdddeffhhhiilmmnnnopqsuuxxxxxzzz|||%-_zUfA n}CCjsۍ (vVvD"֏Ϋ4/l^PO-w]h8A@Q tlD __ %d WqxI[ޖU xs@ xC{ ] 3 ~?,1TcY6znCUi"U-|mtJ~} /I%Ap{mq&m_~lkN)|-<۫% #Hr2f`1Tffk٦ Z!26~+|>uPAggU N߆M[7/lۙzVлZV_x+_Dyz$h+jcۍL5ɴrmz,-M`l~yE <]Xygbi`e|d>: =EXFjGRr qqbP[M4gLN-;ll&s3)Iqf/trDڌtmigh ~4ۏ׹;7I oӞgJ] P}e Vv~3dk7kh] TS-`}:Ip̍¦ȲS~t!E<WT`xSX"Һ[6w漭y}"̡&@ϗ#DslMاWoN+% XJ 8Tr*XRCSp*e6&-{,#⬴C+ރ91t1x08rF KTP@6ua`^^(G 7oԨaVr_m?sY 8wuZ\J*< rm5 =HxfEc%w#->UE|V ΠD>@[`lͽ_><6耋o=>Z(Cr ma#c>dPC˃p!>Ya^Qqq u}/MCj:]dy9[wUCP!'|iDs'PK50a*T&D DKmlK ͯGJ _GGPޑL˲{a|M%29$h@ YIZgPy76CVu"z uQSʚ{{5pkCWQ-T٫>/QgLnˇ.w64 uZU 0:gVh"[NvV Cʉh6Hz1 ‚bߵiNybgM.1krKF* Jg.^RBlPCS JIalOv,kl&V m}3pTX[ iU8nW-c3>0G$dhp,yz @5;>0|pJ72]+֜ϱqؾE,7RQi^Ě:xqj~l:*;lsDЃxC+ A}(ׅuj6\9j?ޔ<҆$((\Uezͷ]k,^)ҟ=*tVվY.ME98Rk(#5 ̌R`1r =K{U=s/q܏Ym?Wr:zJ 3ӒwZ4'cw0| : ft-Zw`C^Icco0+9V!z Kk_ w|uօhz⻯^0˖2M# "\ m@erz`).q> uQmP.6HkW 9NOfݍіi%qm|y@ЅnMNnvNQ}`U$ mN:)pA#ϱϕiۄ84R^jvxk17v .DuwM!/`F!$N3.FySݒ ,2R̨M6'TMr}䝎H=Mo/I #UBOlJ/˲{%+۬xwqw9}Jصi]bϺT"0!LZ$Ӥca7UaaMʗ_\n\X!ƳH77Ƨ޴{3Y)g {m w+, Vwc"u?UNӖZUZFPRa1VOWPSbSHE>Ʊf?mmpo+Dod/c|(( Z-B 3w\c& j^!}$BuaV ćZPƽM$s~l9 ()Z`"nrqE$aI5}:d;F H|#UBp衚ɍJrY+|w5.*BPiz+ʤ^$bK~[*9K$ðNqKP QξsLLOe8Z!I1KC~-|\х;PMVjҗZz)jUrNsI< ? c ǻݱع!*Np)fz{zdn"`;Jr)HJl%ĔC``;&E+[ݎƣ, oddJiߥ`Y2V H1&a`9Dyna፝PTX9"VJ9HW,=sv.9QS:Z9aH~.zotJ,5[7⛲CK)wZS8I|l4إB "-~S̎:9-2ˇw^NG%//9]}&ӃbXpp, j _ce MR)`5@Ie6u,Ћz4x\ 4I]#\1na% QGvƅT+ा[ŀ: 7~+ez 6Qo>NC꬯ؔ9'_v Hcʣ\-`$4:mŞ|v[YZ t]oX#\0הB?]{2 +j9㆔C20KM_<9 #=A>[áB! YyX6Q͸KG% EZN:nXKSACMYp+3snp:֦i|+@N)C~U~b% jb+SOIbdv**7^i͖A%ӂJU8_icmt(!X"*֧|ڝ;{CO E8ijX=Lp0l[)Q0s1!mWI|07ڢZ0bZ@^vM&34K/us$ӯU34Ax9E(z jwyKum09F8 C4Q&Q"|:9 \5J#c ZvHGIqYi,/!k_^'.̏mBjm%K/ϱ-yTHrANh FΥx).zhJ4iV]А pӲmKڗ26&:$311xXR|@X]ѩoz˼gOn1D~eYy58FͲm Ñ`QLBүs6< 3%nv)}P@de:$O3U`2lLؿQPe(󗯲xFKQJޣ7p-9B>u.5*) =,Ec:KH 2D$A2J*$J* EC; ;LedE* HFEU,5IF.pJ95 +25i*Gx_/:U {- :=[C[>#3;#HBDEB4<n6:EEG 5CG/2tDG0, R&Ajh;CH {T#+F<@I!9J<G+V<::p0W/&*L z;20FY=64a73,ӗ9+BT9D*4,6)/Q2'CE9l+q.M'OIZF^ ;TsmynK$X.B~I}CPFy-CD~(^yN:"R[P ΖX7 ӂPzF4lightproof-1.5+git20140515/.git/objects/pack/pack-9ef1f3bce65d1e41800058945cd99256e4920e5d.pack0000644000175000017500000024516512054114507026121 0ustar renerenePACKx=j0]ti(Y?BJO Inӱsӷ}܈ t@ؙK`}DP7ȣXBA9{IhBBݥ]ڐާ!?xK5.4Mr8Z{ౖCYx10^- !Ju1v+S ]ސj"%cR GCks E&8rLV\0QRGt rlOcZKTK@0#l--,&eR}'У #'"ȡKY>dkظ :h;tCrv'KhRs63d .~,~Zn+q并 u>'mV,yyϏ LX2>5Rx~]̵l]6x;N@=/рHW6@)M,^䬥m(9/D||3uHJm9e\UJCmr9lT` mb : ?S_υQO~qZ7e<>P#ҵN="j"?E՜2sؔ&Hb62p(5(*[>FXb*KD0r>]]7]7zU_?vYS)^dy}Usi CEm+n09IZ4җЉc"7, }D*Dt l)ɥ*R ~{mײmYQݟe[6'k kF5I(!X536OxԞ9`+ ےK.3/|5χ+&C'|Po}Ҷë ߾AmqF~qbZ3ף,@me3G/F/TSəxAn C9WA~`TU]t7A aTVAW'۽d 30h^cCmpPx1=di[ ;G?/h&RC΄nA9,鸄HVkҋb;2I.g<V2hKOFWNʩuH;=$<_Bo*eEx1n0 wB{ICĈmd7"z &O9 (I*%.]awR">L@)0pN$GXs[f]3~-?i2/ֳuH]@`c{z䶽IkMxA EJTU]nNɠK`v׳~o̰ 1-̑QLqu:(4وlŃlѮvrwxkp%X49:R zJ~kGO;\:qm~5_A$Q+'RqͩwE4 T<|-/n'(y@ÔhoBaSDxŻ 0P Lwgls""ف2J=m ν8b( 0Z̡ݙѰ2[ϥb6JfXHu(@#猜!rxA EI@ %1ƅ;OPm1tx翟|nDH!OSu5f 'O:oxF;K&6aĜM_pƘ;H7?jZ彶zpY :]$Qi<˓2Jn[L/?8VMx10 ";$4B l]H[Ժ0Iw1X{@%,!%%,Ð޼l2Q(PT`ԑǂ@ݞo&XbNL}qk^¦,Mx;!{NAoX )P" Eϯ&j2SDܘR Mz AxoSp xdTwBp*7v&NHo5@N[sZ' ޶ gsB[\jr|'S<waZ}Q>r |PۗxK0:A?[j!Br?,G'#dWT˼:)1%xv>І`+fxkm& ւ($!$qVPy@/\1~>$}.`,)>oZ1]n{,lepKo/T?M~xmMj0: A҈Veh/ bQY=|*Fdc6ޤ0hP Ɏb1xԝl t fNg=j 82Z*|2߲H$H$0!KMZXun[e^ܞyޏ]Nya{/A*X箕M=:HHxm;j1{B}ܤ 6ZJ9&ea/Mj!N5_35N% U]<&Nh\6Xlə|NC{kҝ.in }iy3dCֻ\jU",eiD~ݞÏt<2Ns`L.sr0[z~owes?_Q3>\z!ZDCUs dC؏e]@IumX? x1 0=x I4 Woz1 Nq(Y).vmSn 0AR鲽}躽3x㌟y}T84RĒȌqGDBï#x340031QK,L/Je8ooQml̫|8"? ϝ}Yl/En3B&LIFb^zO~:⸬efhްyYTKfbN~^A%öľ|a۾x ie0TOfzFIAQ~~Ha}:̃mɌ;2˪\a^zifqIf^Er):'2pZR|v/W(8z1|}E=΅ߚ'g~1d 0?`5md+ ?|` P WG_WnT:#0P!~ W$g^?;(j5w"5(ߏ1]giFNXH֢B̂<mO=Nsl+FYE;x+L˯(b$xOO@)&=iRAzFbFJBmz\`M]hkx?7oFV޽G&7^Έ;) TB+YFXr7-XBJ4TGph1Qr.a W4Vh+$'܌9Z.TDF )_~3=ȥP޻ĸ$f!,WSX ȹvɎy{a`aru4GG҃qdVP7X\0x~VU~i`fË2*2@wnt{g:Owo^^^ d)AVu9Ɖ37&8`Ϳ1[3f*l +XtDXf '26_1JKzvks!JW50 eM_LΞ%* ѧ7^ %wlE1Xl0fӇlJ׬\)R0nbV@wp*5&"P$+#c(KvۗGO}v}XLwRe/ @fEj#-A"0~;%{/pI+x,<ԣBRj'F;4c :<.SAd6xRgU'c;b" v]꺀#d2d,͂}/"bdщ(tU d eWrnb!SNDȠZyZ-db gQbcrt?#kse%BPRz瀵ȞTg(l}:0ք<,apV"zJ?zp?uC*%,>,;cjg[Xh? ٞBsC@EF$} hl+(Tڧ՝RA8w$R6hPgPʊvOp o5.eXg2>"U`(Hj@ p-Z* fE>c:`l%Q4`|oמf>ItZo8Z1߯>}Poo?z cUjB@k\Rȥqe Am!)y5ul@n[fDZp_RNO&M4z1gOzXs~,jfYO";;;NMJCg4F> ZOZu gˋYz Ϲш{߃w0%CWh1ލ"/ϭX9;h}\h< 0ٗi {Ru;}p1˛Lci wmO0 r ]o>w';{ؿRFu jsĆڝ[j'XF~JS lA`Myhnc.άE:io#O}u>( ` BG U3t;hZ$TBWe]kf ߟm_ܫʮ9?x+~<f >TW&۲˥71F NP:E{a{h2  /Wx)xa<*3fVp%:^it|]]~X?Ps׺F7H\+κDC"'2 5/,7d \!U EE/J'a.tvpP T#y|EV$.Z5 XiTgtTה33궺YdnhExw! ǻpnCHb=:6+-jO2b! xn_ؒō3Nf@(cY(*qZc C.ӗ [<</~Cgc"O3 JŻ6$L&\D :'pӂj7wn>#Gx!>&fMpBR`8 Os!%s,Zx8l28f؉'yU*/L&G3^3Zy/ sBJ{jabO\ VmSLIҿA8t|!TJi T;;yc;YHG5*;/"|NFl'wH)/7,4UNa'q$Pp5'FźVlP!{^:'h_|ţ~'6q, e{⺨UD\8e91x>n$p6"{lG~={.ˊ7\2"ʕ+`u8kVxrC*8A={070R62&8i_wXI69;kbВIy-G6'Ӫ(}do]->kHY\iVJkɔfI5|fbR`bAG]dAJ6# NTg0cgj|>|Ssh [ʭ[8(=ѨJ0x5Bw8wf:=D*wLcݮ`?Dqp68.!F_Db@tp~C gǩT `юNs]U3 1KsQGݝgJ~1!V8E5O3FgS~Q]u"p} (0txB/5 WG 4,b7;1/ݜ.5U:ApHPaNAGF}?2G,;Ӈ6| n*Tp2oۙZoWK;$Mot7  58!guuhscF TC2Lmv ްCrAM5j:Ow.b_k]b6\%%vhp%6mSc 2rwIB'$}N !ɍ{+~o}07Uk!͉!c/b,U $VB<ŴN=&;ZĤyvyS'-:@>*6*k< GBlY0=Wi04YIVx*y~M#k]hr.Fuk|}tk\vfn Nqf*NL74/ ۩`Un?/4- P49BzGDDc: P*;UǬ>p?4Ĕ8B[ycZ)r5;*/Ny5E;~}|]k3xn6_)*7/mp Na(esIrYя P2%'_y=ta]]=x){hJVkrbfpqs3k☄4Bg)g|G_ɏ6XK sҡB3٤ S')b{x :b64g o ~]Z`[PDbL\28gy*q45UŤ '؄sθa@W:3o X'4f^u _oH&\Mq‚~u~/֌bH% ;w!NFI, ~v_ԷGYfpwZ|GK g\sV89fTLa&û Y0,IR  2D@nC"b]ѝY3)x-[ڜ/m*F!9HֵYUQ[Ϩ$EiW޷d&<$O?sYV'HLTV0/uV@ENJ`/,b)hd=Vz[>;jwFXƵEf)Gk Ukz8J#,j2!W$!Mee%8C qU {V[ՏO!K~5+GCQx pJ6#R9ù2 8uX[NF$dE~:ф ˰E H0c%s7lJ9ZtY|9>\*9fs#Ho?vo4 1*Ӊq-F2ư;.!t}hsuk:ЂYb= uz:jR[8$yİ%qK\ h!clh;=;l9={7=x<}n2{$ Ta b Ra1q')2]QXk LF!cnv8jwҎwbȩݓP&Ӵ^3zאNaulHַu`v_:49WL2HѡZt]nO l?imEyu$rA"F5s3,N* [GL߷[U߲}>T]ˑV;Y vJ?k\5NO\vYemY͙hkGYc50gy-'$֖;%xmo0je1%E[kSHRDc n'J~A::9o4ڌ-%`-36{a|"BЂ 2[VؚĭnVl\I% ЗX, 7PmX[ 1#P?ݼa]|o[U,Fނ?PFZ: ߽4F Ԟ:)ƌ}qwj-. *uٔkU`lkWP3dn \F}~n|;?bYyc.RӐhHFUtyےT'9rFx\[ׂIBn b;c986yI8'ۛ?0>g%YP"D;Os*gd>y^"H=nxmf?ijуg=N'(\Nnxĺa~nb^fZjqa xVmo6_A`_,,Rmv: mڢLT"5rb?~Q,0so\-tK:şd2Z,gTU^J~K%ZiTt`~Ng 7^)Vf$u7DN֞ G+$buUE1W=ۮ&VNn6yzX] UzŠ=@X TwVzA4_e S(jk oTRKB{0z*S4/SVe4;e?֚qZmU+ia;R` ]V/FpRy o&^W>d24\4ƶ[ Pnj s4AK7ajxQE~s) ^> g2t^.VsP۠f0⬏#eD}/8 `` ؐ1Iq0TXxEKo{ 8b_[Br| 5%-ȎFZm][uTQ!A9$e:/4% ߒhфr\ ᛭>٣DVo&KM+{?d4 _CNHN~QL@K`&I z݄lI7hD /X&d0zc)@K2 $lnB GDcPQ, s^QchJ&?[&ҳE G[aCيIV8GBjۥ ӄ8,!mt\0a%;c9L+.Ri*L)3" B #B87Hyh(COP9f<߅G!q"cdqO@K$ZcUy7#16,=c7oNӈk&:8Ҵ0A$WO $3Y|pbp^Y;xk7aS;SQ;x `jL+&} 8N9BЧ]Zͨ{*0G{\87NSĉ(d?[\܏ "~ KF"4x33-xMn09eej"Cvfؖ1(k#JHy{3FZ3隭(U[JBd]+T9\P(0mɡw3 ߬V/tAo `麎uہv|ɠrX XrNe 1}lf0sifut򊵑*F y96F()G"Ӱ>P&)o_':fT`2dy_Y("n!7`b<fZ9i+K]jfTyOJK镣֩޲ %>飄 w㣍+0腢x340031QHLO+(axVR ~<6Z=*7141jYS>UɶUU\WXVO9J9'4.I!r.SxSn0 +̻Vd=eAش-L IF}(Jqn{ ޗ@ Q! 4*(h40Y~ȱU0P +v%=lteSthA7mƠ.ۈ-pNJRl:&l2.נ n8_3 E n1mPmtWd w{]FGL| J[ kT(WQX<}ܠ[C³1q>=.~L?sKܡǞ{sQׯyeY^ IYnRjjJZO6tڿ<"_b+86A Ѵت\_I\<Ãc(䈚ɖ̋klp|)vg2aeKrM7| pTVr-?l=t%1ri#Z !Y>[''._~DcR!:T5 s\0NU}lVrLd+O ʭzYQmDk;K[jSjׅR]x\LhZXZtFJKsFl7!xVn6}W R{)06n &EFl")[e=Cʒ$]#@ly8s̙CJ<*%AF>։ʝ,:TNԵ*&-*V+iIKmF@+(f S3ЌWc'}.|xA Si  $X+ }+c<11 46k.vT 16<(@zԾZՇ߇Z{ƶUR 1[HVFq3 2|ޕˡ]Iz4L >t,im>5|J!҈GYI_Q,AF,(:HR0D[O)mc)e"lBa4o%TwJ²;Hi~`  P#gު݆}+)}kD?2q-nb8J$ܗj3ggJ't* 6'v0=6ؠC6 *~HtD%}b3iZvxP)[V[r%Y#d>i&l8`I8r د*c˽ ߙ/6\m89$"-B^:cOk97נ}s2%vFf^qqS{O:͜ulګ_g{;?P ߫6-;_w-Ζ)<;[rB4eҳsxZn}=@HV,~9c;NvrPnIZ$OofwIʒu,ܝݝf曡Q>.4=!^nZ=δ,ynBU6z&^dj:C9eZȰZyViQ;-9VSLړfa0χ t&TpsmTò2vOinVL*˖/diɑLcQsa,&tG+ȷj+QbZgtV:R*+ ̚9/2{RkZYXlw,]1'S,W,eOY5ϢG7j|d0)@97S]H`W "4y^jJ*!-yGziWSl֘-3;$ qe^k\TJrNwGe Y|ew"Itb2BR>h=G7Qv6pdi-;#.o?=x ira vv@u'YOtals>uUZg=yTk8洀T4kxFhec "rXʂrDmH7]f>8SW8),ͮ3X~_^.zp.^iDyk)kDp D^ Dr}a3/К*I|6,ۗ''/} 9L,j>+ƅK %i\wo>IK`l |>pXi /@: Ehw TgI R$=.3]߁Y,h `t"8 DHۀ/BEO?5ţ/|Yڐ[bo9"GLݽu:.t*fI;a&_A,v*sɸ%l$M㧟p>h&`>">_DlsT^F珷ӏΧ':]Ƹ?w@S'C[@y,<"܍uu_#y҂!Up8=&&B Tr&e^Gc-3D#`=3P{7ڐC:I#}kFp#~[5ki灢 ZYäȲ#Qd(o?<"c:7&PVS F`'@=\~|ESeZ"b#R2LTxZם\ {[9L(JmH9խ!HMge)3,-tW͵1sYZnϤDTt97{blKR,kH.) $͗?K;&~̑}Ⱥf;5Ʈ (lsWN,<[vF}BKŶmUFڻ/͋$27͝"u2.c\.Ĩ?pɶ_;/ AU` #H)7qi2K> 0ox@tHJaSM](rda(# A<(ė[ykl?6-_Pڶ"1 ^6inE7EYxR2T&iI}8,vp{!fکxxs&E7R0TZ-_.EB?5yrHKj"8A(vݦ"ʢ;^@~jY9 J Vc 7[%-†vIzH`E52n}saF&RfVYS*38t,Wz/c Ƒy*[?HA55Q6^CkQ]Bղ7^JI慞w(xfGR#^ę*d`yZl 57ٽ?-6rwx+7-I+[d] 7sbGϜAǡHF}'096T5u*`5}Z9?;zq0>N6%; 7C+D]U6R9b=#:E0OliӢhc@Oe"o# " G7"X,DG{Ǿˋ(Js6mߛ&I*HU7UiJo{:[{hj ۶ʅ3.IyXJLUŦ7{*UHРx2c#$-;ݙm~Aw/Yh7N=-됼( ògԖ1>w#WC ~UaNl בN| -X+b^,Z\P|H3W4NG+F !Vpj;8] =[.@Ge=F_w&]9i5vt1󔁛qL yoqS韜~;e;G60>50x]G}|T Tco]3sKC~lƹk>hOZa6f8qoCc:@.X@?j9o_FpxUYk0~֫mz@1!4 HREQ[ͯǮ744ho9VV ׵TmW,փ۹ 4~id'2qq .%t;~Ҫ NX`|fK7;p6?NX`PSǨ-bN5"j@-OK(gEi:H#)hEB*Yta1hc'E!3(d&[f w%,јTHȵ3 6 Y 9' :oIaLǃ#L\o2ˠ׵8ʬpMuyur6B!Q!:'Yl[!|yU(O6JANYILq9K* 8s`X|h>s]Ww߮=Sm߅2q+Gfl %9(3f"׋;aL1jo&P{GJ/BWE.,HgR"|$Cű%T:ֈmA%zL5[EWg$}TMpG$}1CSym&0PTF}޵d'pIWv j\~djcLe:uO" ?Q$+.\l;s8\xNi˧qڱUH鵳|-)oZ3x  7ua ŞXrh 3,Xy vXʲW1QruE\ c8z+T[mba 1,,s ;+/Ix340031Q,+dx6M9{wk+qIODC􌒂x܂Tx^{=*`ڱ*`J-Im7/-qBҭk>`HKI-^ԫl81u`h}ŏ]fͺ WQ49bp[0xxSVUHKOKR qӵqd&+*T$$rq< xko~ņ.`2z@/*X6k \qh\d Z˛8q{g]r%`gǺi  i,,4maՁ0Xv6k [۬.T zuO{]ȷ-'NqfEV Y] VѪ+de WV<<+|noG~EX|-Gph4H| 9OB7l ?/d-8\jtb/ `-`%ަ\6kZ?!*X)`qL:4uw0<M÷t|s6xIxz֦]S>/vG(Q"Z=u%CQﲂB&[p@| ;r7aJ[rKzf|* G)YL@Y8'߀oH8C=m}Z{OU}/)As%7Ib^w?A`%Z8ۇ"AωVUh#*(3Ϭ[%Aa@hniC9渣 iQq'` 5L!VDf pKY=u!(=6ʕ"-3Y-c{zcRq>6HK4mL{`M2tYqPF2ٿ꧁؝U{Xu+2jl`::0' 6m ,<#vuKfTC (8XAŚ+P@<KMsNBB aڏGzHGRJ4-EU8&[~y#/ӗP:ijFNakbKc;\`{rYS5E5~xFőf2< ƀa?fX>8L}J_)cxK$gw%x;"SF ¶8Tzwo~{NO m])ҳ^I8ɉ7FW81` `dFO)$z@%p&E5UV5aMm-d"t8;N-[WeZD Ui4BrU ;:2ƊgVE r>tEfנkɔctuח*%@\^pEL.ZI^G:Ʊ9/-!= bLcKN #d)<_tal'+&";܌ Bi~I@h CD% Y~^^lxZ߁=Icdx4^4{CEwzWPXtJ@Z1^S0yDo^Am#˾x'A*&GOz[ Q4D͏HrG)-O@:{)tkBGACvx|;eX0".'8%# v$4#F~_ N&0Tu%ēI1?`sn'jd<"d%;]pe 4D#i"٢j"&n "?Ω|DPeS!A50|t}Q,*ܥT{>NIl`Qz`vQ!#.CT%lА7'M8g}(|-V)v,UGi]"/fߔfg#& k+]MxEhCU*Սӏۯd4XUecZJU!' (*VQ廨TO4+R{! 'pU:|ag׏"ʭdQ0:Oq@d\OebΚFH ir#[FܤR-2ӽP"lAcVrdSl rھw&"fψ~Ӿ7 fE0Q x˿ hͩi$szڇ?+k}#LIo] I]hnİuWTg{u_{ˋ<_  b%/~ 10tEK ZQXùa߹qBL*Nqd~eUG!i~G0 <&Ym Ѝtf9VFl_ͮ%ؙB ۆfj%4쏫ExBlY yuՄr5pLn` >R dG{3;|=s~f 4dQ ;q9W qY0gr*ߞf@9D4Pa-P[z{:;$̑Ji& +|: G儦+jXR2;%疊.'\ g#@/ÑJ85v3L߬&vrصF h$Y4R_0$ 0ZVd{pI1o^(pN` (*YQADp[9z쿋ƴNxW]o6}ׯ 1X mV`v@ֵ@D\hR )7iI,M!qG5uR qKyGհfk:%e[/ѯY.6; 1MkúX0'b3|jjz!Z`J>\ CzO L }e m)jf"C1?7c5~t]ZCL s2q|$z_LCPSBlh[Bʿg97ɒ G]f1R(s_^D{{9Ä)yF&%WDCXaIB*&mjs?lN2HkE2MDPl9T  Ўm9sL B-'JTO68[Jm"xX$xVZ%k+b7(fVQ.-rũgY>0}6(׏Hk ˺ZJTt%Zϳk_kdp`uR9 x쐄vaӧq,>ՄvIV6!>MkS""vXDg ^T +jŗݺKR,& !MAUXKOM "f$n1d(y\=33]n聚?UO'*MkU\oo9B":1H.͘lí33I!GRHZҘ3ٜ(-d\8T-tx ~o9+)__]];F,gR/i:~J3LWR L eG&τ]^`-,v> 2C}iOg:Y6ϨHR& 5:=f4a  |lBpɠr!A15ΧRf= }6TdرodLA#|M9XPAӥ]4tʔU 4ɤ`e&j6րI؄d9Qv3BGN7SFo36+ѲG5&<̀N&|,M' #a:HD*9ƎAq/?K " Lg,! ɩ[ wqXE*!/ulB8kn?9uÇ9,B  ,(st̩gM \.nGұcKͦ c汵➣uz(g`0M&bcDfEnq "ct\EŠ&XTмwt'[0$rqאbWGp0CG/W;?*YNE-}A.oj)nsr& [3 b͉? !}neMRF`P&F`k G_yA4[ mOUL/8[y@VMLu8|дY:y@Q&_uTfE=mf,Kfm ڴ&v,X; ?g4U,܍5R2X/3_fhsO|+O[j&i"C6< g**zItiՄeZeNGՎFKS_T4,eCl )W+GR`lYf6<;})ϔ"wyp=}P^]s"YY kRZP g`jBSjPOp㏣g4p~?@}mbe؂]sFua-Oma6Z߅;g6*=Iy}KϾy}Wz&p4n~{w] v!AK)\@+"'^U3tx溫7q̔Z.ie׫bICZJXٳ5@',>8=m\\}sq ] `~@X>PdjUqUzFd K@+A5mm=r0L٢GHM40p8V])2ę ,?0g$7XIL( 4ǡ5qj-vi$V0`^0GGAO 9~ٍEW p80甽/o#CSP(2rx Fa[aSd]01tUʚL$~[S;ZֵNrz LZ [i)6@ e4st0菠-rLco;&joZ7CA#! иq҅p(lgQfZߠڐ?g"=pc@GV>݇5k㯒]VVqCeRus\rk;݆Z6llnw[iڒ! /^xzbUƈo݂cև !0=!J&='h ?72ލ6'OnO6T-S&|`}ʒr(*>XY-!j(:J&({POMQZzTL3z``;7N!EȪ/qdOO[ ‚؆$-5fx\(V7V]7::2=皦k_SR{i \CeW`m[jE.írx4%dċ(f[NSlp;yu<^TՏ-pfbz\VlKY]o?\^/]~zE#e Ï\fb]~-WrG jA)nITImyq FԚbu b{9o^]Q XMjJfI~/|)/aB=y<?r9Ϝ&-ty! ~o^Yy>t:&_φ!EA ڲ5[~6d22KC@x340031Q1*JM(+dxo ?wU}n/  xko6{~ANq-0(+ڴvŦʒ!ћ7×Hdwv΋3CRY4L^|ON(وRTյz^=Tg4=UP-Mr2%&YEOI-9?YЌn|qq`2KU7E-]RV4ȖbEJe^[kE$3@/v c:Wa oՒ$g䏨>4:ප Qˇ.jxr.etki@e,X&2Zzf bY%II[$$#Zx᜷C@r><~8L k?*t)T[oY u.iЀf5IZj&隤U|ICsHŠCS4!a{0(4f*PfGV7 nm 9?$HaI L%o;`:(ŘTte#';>)2u75,h7'ʇ&7R6T"V}Kc$WeY;p.RŖj,bqb68QމNCMJrΤ;Skȳd88DV}! y| l$_9]$)@}R.ea0`|^ZE9hhoM85+g/8VGg5~~˫Gb6^DC'8<| cG4:y'pie)RN\җʤ5\^q9gx ~7TkӼJrG |\ĽX\x\Քx pR:)R2nwcyEK^͕rXܥX|A &.0L$d##PEf>PMU gb@~HZ1d A0"1<U"ċ:,Yd ʬ'HJ% kKVtoT͓LҊAzg" weoZdLJ8&T\(!)J(qYFt"|IN-PsQi"aFFR2NGI+&ف' ;lGnFcvg݊2~zuW?^nuo1ʁlƃNpueKfNV񋡻#m=#mf?b6}=CAlVqxȣvjr+B`Tk@w xf"tA1,"hD0L_>oz^O_`P0C=|% ^q>1=mQjE61,0b5U_;AA3&TK#JRSbj):aW|\-u(S}Y{+LI`CpgRI9r$]PbDPTҷi.5P /_>;8›ߴaD_42XKsؠ'!D;Bk X^Cc}BI({~؅^6$0 #"ohK&1C-zQ-C@Vž} 1Rr|-^/=LJ%/ jI!7պ$Xj$}[*IPǑ䆴JY5B[b|ZK1T(@gD'WbS(_?T,`X |Y5襶gnXOҕY+;.STzXl8L ~A{l$A] &h˜k'ةv\Y(I֌$K*'Q:t*]#X!SvJ!{=ݜIB]'0,Җplˋ-e;fi]cџm6P~;WO7]7:Aw HV g+QJEo?~nO*~\.u:c;G voI^ѽr&O饇};Aw@L6YLL 92%'3~*/k#tFƈI^eXVQtL>3s#}r`osJ<=^\U9{ Pc/l,լ{p 9DG١ꃸ=f;u1VIԭ#ܟcKa7 GOw?gx GJmk!1`PAmK]Ӧ*5iq3QuVec O! Bl?v'eӮUv%% ˏ|W%P;RdnjWM3nuMx[68H  XOA/ڏ'Ǥ9lwAy>݃0|$⛢JYcc{7IF̛Uwߤ+ 2ؠ oq{2jxzΣ[e|㙔zxg(g:{zP0uɺϡ*պ_Rz׸Y*]EỡpZ߷z]1)?׷~x~|S$H\< 3> x-T\Km4[s&+G97.-+uP.'.xzm?o8}AR O{ʟv}+8G*B]zAaʊXSnO/+y;ڑͦSWC c11W&zbd/7/7x=&]ڡgϫ*N[:&-Zb.nI0!󁵈#?% ,kjW\S5@7NV {6 ѓy0sx8wȒ7 BHwS|Yl70\aF)'ˀ!2fH YǍH\؜+徙 u7[ሩ[>t)\r{}9 qAjD7}*LW[O(ݲ=u`z3r"%掘"_ bOsTSzty\=ֲ&z_p@u@`{~ōhdL$2oXk*ڧF~V{݊Lr_<в3McST <~"hwC.m/ F:YEfM|VsV3s^9$9Bs].'/_\7~$$xeuCS;\65 ŰFæNPE "gT&6\uQSL Gcfub-y ].4] VPSQ;0#şqlPM]wNxNe~f:<|<6\qd9l-s]qei jose(Dhp.=2߯ȏݜzrj7WΘWC9*5XRr |e!VPzEVKA6v= 2j`j:ũYSDD>.X7'i`>!֮}ޯimK9j&T ly+i\ *6+CQeK?W(- r?9d6Sb3[86mTic&fkz:ֆM/vX`//`CF U6z@88.ZHu6",m]U9O+UCd{ )|}%ط6K ۊ N9%`7|Bl0}#aaXro ~CvrWT7vF2?v6NlKXQl7? 'ѦD !E<  Gj=2 8 G*鳣}\bda|;$ EB|Xg}3T~~o [Ds5}X0{4!vଋR@.^2ق_odor4 a[N wYb fj?!'ƜzKX=3 8Hs=O[TA}Gt'5fMo9p#gV1-S`7 "9_^Ÿy~6|Eb-K$]3e$6m#]d r ǁPQ'Bq uN {㍤x340031QpLI+֫H.euwvJE4ה31_G]O?7;B_V;<sQBή{!J2SpZ%wVq_&7J'Bl rutueP-1ᨥc3:[UY_Π:f_$>X,1UUJb CkB.(pŃ@ ؆cj&\nNzU􌒂xy +'d9e]e)׿4cyxQkAǟSB0ypWS(A Fi x.Yvר߾sglOOR4fv7"S+X'QGk71&RQs<Һi!ƘԠ}+^LVԘzoMuR]6 [?󷇧x qR F?IP%#"U2bxߋF^ 5&m>Ϸ*{+PT$JSo,ѲMB&jX0JMާݔ~KCK ץM-|j=L3ec,#R!_<ОLJf"Hx._A Q#WpP1jؙ\o=^G+5:9=; u_JB9 x*w?C1KO\=|oշ괹h:æRĖŭ|#]ycv!)W=^t]U 2˘9ϓ|fFo6FwyAy'#`Q~k=?2ҝ?$N΍r;XxΏUy yE zAx340031QMLK-.ѫa p y&>x340031QpLNNI-J,/*֫H.e2A ' -g )~31PO45H aUBڲBxœ_k0)$Me,ު, 1/c1c/zs/W&;%-ز@!YL^Vw[2"D T5hO2BLrLи(ڌ!{rʳkZ\ǥAq44W rl.y%W#Hc W=l?l>Ǵjџ:9E*L'/Qˋ&&-n,+ :=A岂fc͋+2V\Xkcr;f iCAIBB0L;rkٿ2Ov? Uُ/幺:ou-Tx340031Q.I,*O)I K/ U$2HYJBjMgXqٺFl7 /,I-B 휰3vc_,?&xuROo ?OpvYZ%[bⶃw[^+@~Vt;~PWS32NF$-P*]fdx>I1D j~(qj #MJ)XJ@јZ(H^pp~4I|jm5ddeRZb3C. O?<0̖ӗ pעwɿ0c>;+zj-RT"_ Ggn MF, B,H̯Cha=zŀy|v @F;3[70'p}Rƌ+:ܝFL}Ix{ebĢҜԍ+ٸ8A`E _xVnFW\ ID\ ȣ A$Fx8CC? 캟?!%KvEHΝVic뤧UQ*+겮u.RSr)*jTUt}|4%$!6,4=;9=[g&ɷߣi9էGOzNŖV2MZn"U.v`@Ǘ+:E%}ry5.VÕoZ(:^KZF׫5GgEKCB6zWScblNg˓o솶BšB\\s4&EB9h= O;ieWK<2&d]PDyv]Ȯ7x6ؾq*Ztkspp71)BE([U6 uhTlfPpQAn[xسT6RɪRȸR/Ò_Q֍@C5*/3IV]CE.QPamTWFRtJg¨zUjicYe#H_xm[Kۍ{0ԣt Ru-c{~yܰreY-cm#"Mr25*BzEDvRL&1>LU A5{6Ùh%{s TdoÜe%'ISDǨG͛3K.[  쥍n*WKߵ.k/:ӥ5h'+XV'47Eutlp:`g :wTɐ> ) S UA"vGިێu7w%. Wl>kJy.&q^o0IJ{ral(.))+zLSҊ|Al w{Rۻƃ h @!5\8 ~Ġ:jyTd-wr/%9v; n&rMnO0=)JAB,%Y3Ӝ5ɪT5,/TL3l7y> ,W\ປ\/ ;˯?Cb z<&<,;h8=}`-3ky_}(8n1^/ rsTҤ9?D ˃uj8ɳ+K!2OvUwȍ#[R 10AxuRn0+P9~Ĉ)E$)oz칟+Y'ۺf;á>3۸/b@Bzce8Sj|ʁiYǟjp,: i}oܑu{^&l𭱑}U/?`#&aN j̠as"^* vaRoCe>]d2\r-p% vPjtWגSBoY4 u|"D|3#(v:z, ܳ?E;NQgyF:4D0@AU%5y$f5sdbB2ecf<ֈأ)=he!T*ؐh^7LgH9:X,g1tY vj %?okyxKTHTе .) yV\T x340031QH-+KgК>"hʷ/du>,V`PchVu| # lօHsrʊ ϭ+(%e|ʠ_+)9ހڙ-R SRJ.γpoX֥Qϫjf"+Q`O\Ev'Ns^[88xzPNG  IHDRJLsRGBbKGD pHYs  tIME)lIDATHǭOh\Uf6tڄI]XHХ ҅OM\.%JJwBlklKj@[(B-"lښbCLhd&{\I!^ڻz{sqK^UeߛQ'_~bA;c/*a$gq%G*z@m6%S,++U/FTl  ~?ϴ&=CqZr>ND`P``>rs58H뜦%m-=t 2G!& ]}MK$``rBi 3 6u5B2I7FP%,)a2.<߳hZ3X#8;vh5156#֩zkj6Y" EGΑ4k±dsH\G6H/= Tw5Buӆ^pͦp::twڭhbQ4ˡvVbLfDk3ٺF8{|p/~Oߏyi,No)@(FL$N*v?wǨcDćD؉J=FE:h>$ &Lwn֣ ĥz$_ ;@ZD\z v>pИ:@CuzSI \z SG[@59R`ڨ6/BE~96ew : piA=ۆ5& (ƿ_dN#<,7)Uڨ<.~۞rQ/C__!\ǐc <3hQf<tIENDB`#8xqPNG  IHDRJLsRGBbKGD pHYs  tIME)%0IDATHǭOhw?73J1M(XL =E*CBX"Jbl% Vڊ֋zR׋RB=ĠfI23{fw}}{B9zBMrPUg+c?' vyR(NSe\kmrD2] +dƽDX}adAI' e)g LИP#gYZKdg8Hk%iZBzM#M͔h8) =sѴDb 'cpܺDQTODJYl҅O#XWp*Kf.XUM C)\`SHf{fdVHGt7iO" #̝҅+7Ə HfO hGm:9FlWb\.<»z(}%$knH?Z) FŜ7:]f9ˤwç(""ұD z;Rq\%˧K|;:g2yҺa}Xy'k$d'})Gy<&̜O8MfũirO^cK~!yo:r$~S=݌o_ܢ@6ehx-[ֽ7̛G')rmz8}f-(o;C:uiosup?eՏEQvu\IENDB`#x3PNG  IHDRasRGBbKGD pHYs  tIME%/P( IDAT8ˍKTQIa9ipZ8AH!6FB2zR&P "?UD\ 73{n {ͳs8ѳך]0"+HV0 Z|{DzD#68ш a=BD 4qZr+z̧Zk 2ND4XI@;÷%?}֤8Lș'"cbC=2lZcI!36ؙڢo*Y0Ƥpdhؙk ^(e֦Uge w9N7V* Sv+9Ω͆Vb )"[^x硓=2teSI!od=o 7@ g0p"' RQ8(|A>t{IENDB`a=mx+PNG  IHDRJLsRGBbKGD pHYs  tIME% áTIDATHǭV}lҵTK(D;P13۴aAȔH_dkQhp^ )#6@hG-z{>{o-81;<ϓ=:3 " #Cf &ixi@X`vL奶vh W1%0J,)5&Ɖ X +Ohaע;"ne@."靇ie, vqp( dFcg>Dh{>@ ib1}[/Y&D$YBt OsS!;qvVۑ|cI%D،bihBhP`a/Ԛb9x7/FfO'ݽzq#+3m{01dK68r 65ZcԬ"}fa2!;gV{Cޫ~:>;W.ѓS֯6%kOۯv[;DI>S"Ȏ⟛e MW8uѥ ^VJ3@#2) @Df  1To10@,(-+= +QЀQX[ PR&I? < p~:(LC4 `K3KՒORwJ _cJŻ業p^5/M4 g#S)04ok)VTTXXQAp ayaj)6\еXꫮ+"k,&#j]V}+69:-wA-p*|9P<\IENDB`ǧ}r{0}dd;s7࡯$m,HK0;F+IZk-raKg-c䀃Լ-3=}?T|g (77nwwcg&ɂߜUd"mmX֢* S;kzm?OlA( `S%o+AlxRçc= uZ)5K3 !&DRg]Exk<7i_GA8]Z d!Xke^6dc ArvHTh[T mvp5zqZ"W_@oC[Z-L;{CS&UDyhwhbѡ`=Oh|)b"/fm\L&fø{kh0O*3 Zx/\UWUzzȏ:08el)>i GVm Oz$!94ΎJ'_yډb#׮T55EWU&EDP"t nuE6/k3G xS-5 j#"W8R59R86*uyon[$IENDB` x340031QpOK-JѫHJd=94׹w+ 5( JM,.I-JMqILgx6M9{wk+qIODʔĜt$V=Ħ`%w2 J2^yTm_ǐ{顦E3 %AbxXr6>Oq8N-YgKtĚX>@ϙA=&}."%I&Nx2 ,],n jnVs=:Vo)By07 _ {hBBGyџ~3' Ӌ*+*1! *X2ײ&5 |R[ŒnRA3S%3A]4]xB-fRf"oQənω|;+Ъ 70y¥GZ3C'r<dk1xq̈́oAk{ ̇?-#UG];}M0v򍲵*!6xɁj[ Sx vHbB% }pYc3ϒ!ߕBC @~nE*@J۷~zޣb[0xnczFO?gD|DH|YpXpWM҈sg@ 9m{4` 3[ Z`gߜ~u3v~vj}- MJ$*_E,pĠn kl?7"Xĝ/cNfXJ"ueqǪO2]󊨂)\LɘEnE9 kU O IO PfȰ+2>MYLX2zV%I͜Iv5ql{ n^Zh}j%*zۯ'IzV`5{CaK I'rL -z\&[7BX v qD%4"x~`!"_4+ׇ9522\ߜev?Yg>VW8$glӴ)QZ+54cRʇ5@ 0]kӏ: YKdzK\Pk;Ji Ih&Cq2L{#yHK\G9Lx2x; vn^/l{d+̡<)I0|vCeyθ'ƹZƏ=]t:Te\u/31faJ}R"-Zo~y ۝-a4\;ORkLK('>@ JH}NL!RS{P"6iʐ>4B*!94ny :<|r8F:C{SRCrX rx]OO0 ՅNb 'ƕ}{"Ve[o>He_u"߲//oaS.WUm^;h^MSwO[Kz$_wm)cR{@>G=?3@_bS*N["'n:O"IQ.9!9)Bzs5N4HNKgg(ieZ=@HI,aZkEU^9`H*rN|z<d2Uif=ݶ x%=1~O 6B{⟏ȻdnT;^L<+]gG jvN%dh2@֗NsX՚\cɊwW[WlZU͆fzNjzGt^7PѡW$[Io]8xeJ1EL] ]LuE[)Rb& $K)K~g!ͽyK*0+cY/@txJ|NĒX='KRn b8䝒vF^sDC̝Q:}ȥDžS}vx7\?γ3&Q{L=GQᥝYW6iZ{?_6cl/F2llG$6~*Zu~>Hc|,Y}dGzxXE /ex<]s7@{M2,KMnc9g[IH5IXe#ҸʏwU\mnusu}_r `>(J%n4ڛl/B-iYHMvɨ#3Y\1? Zn3B 2O%BNX6czMMhLYL9WZd)LAKR78?0K#A&DE0\u:A1@G|dEĖY=tIF^mmfZgkq`f|6_7<\RZ`Or !8>}ڀPkԒ< O)=BvG_}7!_\)[ho>OP< {AN_2߸g+Zt! ^s^$а ;mg5X985Y^bt@36btŷ?O-YGq- Rl"?z lp;{=:o$y$P`bAl4 |}}?{>_ZCS,I0Hnei4 @i$6ꟿw ;^`g< Yg"&D+,x={yzyJ^b*! ACUw-{,Ʃͧ\޼/T(E"RgS9O \ꂩZ+ɡzNS(@ !TUw:YL;Oa d}ހL`~¨ZMP!bJZjL2`J^. CDƼͼ=- 3{H$AØ&\2n,`!x",}e9^(R8SڰS( <;OWA D M)+/c@8NT2:a2;؄d`f&JK8 MxVjnk)jUԾ"b_gQ}waJ̱J#]%g?) :I+5O#䩋aڝPnlzcU?LñB i{foR *W?OdX篾/π%A4du&C ; +{f@GC8OV8;iNFو&HXcV]~X}$>oRZx>&G}zk{T$cv׉mglZuҕr_8(+1^` mpL[vHg䐺كY5WI-۠TJ8Y|M5]Hg˳%dzH@ ?`!O|:P| Kh0uz]N]Ϩ|µJkho~hh)@t/j0m/4Ltf06W+l]fixIw弦ll$$F8-} 7})`B olEhu&i8E j8j]R#\_*e\ak)_Mޱ7I)Z#\l'GWMJ}a֛Y!p\ w%>ȭֆ%mrEKЍR+ԽP [ 'T@QQ!G 9O$Ë`! 40hT̴̐[q6\1:X5g bn@N[U`u\ 2R'&favBkW \T(`".k2i"-V k^!e-6a/ qԋ `KYDː;8r}Dn̶g!,i/,,I`6*kamɢ,ZaʡxȵVE2-_AZ{4j-YNsiD UIQ:pDpQbn"H,@rl8tOcԨpwr,zxfA|k`i%7/PB;e*^Bg&_YDA@F=!s% A4bnB$އ2i$'uj(>,bnՙ$SL% ɠ)L]b6Cb&caf$=}DOw.aapi~9hfD|1|6Α6 גɴ*/Ø&6֘c`^SE7EP[JgRCD0y# &PZ13aGp&EވT0J4l&.T޲- *'Y=/v1IXeoE\*A hK) V)ZUѢM,+f O!j qei= ݕ5Sy-ͳ:rQ\(U3 pcBs JfjX!fY ^wmz@W@TCq,+RHC7b%:UJG֨ r n*9 vW6O*=юWxUyVdԣqd׫2mmNx[AgP1_ 6fL,o1,4SyB4 ŀBVCB2vr%Vra;ˠ"B0NnAi:$ ?%. ݚ ŃZw&ãvFde*P!(uR5@b|ӟ* dBBsnvRMnE(>+0'q`(d6HtŤrNL!UEK# ¹# ƈ`%9wp%8^t:.4 qTCT^xX") %أAxjfj5ZT{5Қhw)PD-uvR#:v Iok*|p3zܧxĿu(Kh'UvN#gu/4 ,"0A ;0D6do֢$ TjR\hRm) kbq=)!"tvr"ƙY/i|N_A={4 r>7xB/AHG}s&@GO A̠!=TfH F9OOH#N_#M$߫S'$QmQ6"(DSS=HG{ظ'|@2@D|ֺ>L"18WVhVZXCw; rҟ4CEBU%<(6׭"h$B}vc08 ϡ[@lCh5@oRu?}65PsSd|cGdrz[[ϰI׷mUmIwŋ[c|!1<_PƬ@4 I-d,I2៿xhl~*dʞg"=DMnkPi _]`NĭxθqC+KIf^[X 8Il}MGr2;K$~^0E\e ߙ..xUMn6ȚNl@L4HLE hJRլznf3Üaz)J '@l{< ,1UYZiCn;'T)Z볚L[s&{N`h#T7+:&iU2m8׼xZ-Y{d*J*Ę<&z:NeYq*LU-B<ʍ^>\u<²wug$J먎9]|z!1TiZN\"-R !w5o3O"RQ3N%%0Й:2Լ#a5}3MNdJoi OԳMrkypUBhY܀S7GXǾ@ x4Il9G1)@*ۆ&LҴp- D/l nI̮V NH_{'># AbPP͒@ΈT+-oRn|-+l KU,W""z}9Q[mXT)yPZ$5qhI5±Z<Rl_^`?kSzTkQ0\ =-HRdrQo}9Xgx}P]DьU[ >*(Ļ{ u(QA%s*ΒbKzn?|>3 -_cs+*;rEA;K\cd|%\UZ0*z],zR+#h*5JIP^d6 GIhg1-Ī09%pvL/+HQD^WuL}*5YJ [z6²Iϫ>Xg>[2+2 ݌UwBуS78G;?ǥl,prˊɔYb.HLTʹLaLqTVld3aOåO$8HE I"BЈ?`T|u$\_P2c/QH)N'(?aƔdĪ;@$Fe!K,Zԗv +gE!z ePY! P yA^VQ"gH68!?<aB4kU>ӡ}٩w kV +i}'XT `dGmXRJ }{&!t³{i< %ϏE*ɕ =QK'Eu)hԥN.9iX#^Hi->-Q Ƙ3 t@!7z>{iJi.)eP*/aR&CϴY&ZxL/^=#%?.oq\fQ֙/lR ףغBH%ge5(UpҼ)Vg gv񇢘RD&(eY5kX*j#p1]U+itAۊ{v׋:/{P3{z[ղq#T7,` v*0"M91 gIHpbu t1ږ);=ZE>ůmMb)c>&tx6`IZV *`V*yM1՜k=q6XEXQXE;o:JQ0߈{ۦv/= eލ&!8˞Gr 7֪ۘ+6΅k!;LcvK,$cl˲ IRF:=Xƺ> >H/Ѯ/ C4p$5D2-+`T1R:Vۡ߸3n;耥/z$ "lDsеLp4כd@-.Ȃ80xP~L:ܲ xX2W+zs?ά>+ pu۲@_qbW0]͍DdpOw9*)2.#bǧY9p"UdyقOs9WR 7j8& ȡy &$m-oTaʼn| 'ϟ߾x/7ALyKt^|VX#D ř_lͫ.i#Ͼ9\*eYjO7(ꐊz m%6霗iodz׳ȇiBcx짊~,( ya7/clae~Qy4.Ld8lVLA[e"€Uk'^S x}]FsWٞ0&hɖFZYĐHI4@T7!ޭ6۽^.cOqV뻇F* v71 **++*+*+Nx'~'A7٭``E}I8^*C; I_1>d;?s fe}4 I0<ă*Hgr1mmY{~_*,^e$$xĬ^7AYVٕi KQHnf'y؂`%MỶbۋy;WҚF^{M'`m4:`:~0kz塿:e#֪3cQyr`l+X[ncm1X ՙ&v:It)O'#r $TVun_gE^|:񏮀F`@@kVN&th{:|B^B]iǔ+Vj%ވF\`vC:'B jQg2h~9_<t !)2Q4|zv]w1r%C&ÙC] ܱ\Ym]fjjoi}.yTL`+`F4"qOT(`w:5:v-m-F$~>?6?|}Wm?K5]4Gz8C D'#Gt\tm-bW]Wl {cb6rA]TlW 2-%Ԙ I<2%|QTY)//tȮօ?v!O> C®pmG@ͥl `]BQ?F´t 3H-0_"F8$f} pub? k ضGeA DsUԳO #e|o RwlW{5bу(}N um {{G=Xm|Pl{Dć' #n@'v@8 88)M8CqicwMh$H4_hQԇv,w4B=1# oW :b`7ݙ7}q3.|;ޞ?lCq~#|L?)>O'c 1G$>)2 !.VC!4=t& 8(]x r&;;hd"ɶƁĈ-gЩ|%vj@11ĸ=0Ew~"v_OWL [2*lȣ < Ϻ}^ ˇ"0avLV5/,;TtSY6hT-@V*}QJ@/>jwrQ*#KsṈ&G4%7ZE׵XcLT!xQ3^O@[(^$z:t!1ptG6>i5h%ȷ}Hv<J2cH$>RY*6[߷[ΔJÑ׍Xs?{~8J寛Ƌf,M߲*zg*1!eCz2m>UneL5Y`P m˯U2C*v ԫblDWoG 29 cW;g0~pIݍ@pl7_;oXْ̀k0Sc$ʤw))0YV)RZdqf啊0Beٚz; G\RWwrr-J[)摔j IV|,CnIv\P-@ИcwC;b:TwJJW x%a8 maZ@۩> OVͶ循#I.Yk _r#4I^|>ŖMUkVYDѨT(,-5UHU]E=}}UD^U"GPe^g x7tx6<*0V/b @ע4%lQYm=;C%;Ѓ2GC)1v=TdiLt1Mg+ IjLi0l:cq}( % [kk+.wh[ӷvDwu(ŃyhSi~0Qs =$aJ|^f  6'uRGwM,|臑d#x!zi3DoWpf]J}{Lr 5 s 6,Q햙<mʤzn]5 2n=e944` !@]6ɂh--}~ Ńu Lr$#^ǂI1M%+J~;Pwy,[| nhR YZ1A0 xek/^WrX֚=wk)=o@#u\V{S`qs2pv@(I61_~Ոi|'=pO+L*4jjV’ؓ' TJB1KMJl;+5mmʥն-9 kis&bءuF)԰mLPSUYan}qhFM2}%,t u<ʺS(ᨣͤbI6%U7+)D+0Cf%<!u1#d@Rˆ &˔@, 4+0^#VXw\"{Y>BV:[ȴi耉k; {a,#6zS9Q4nSցZv:{2렴3 kHKU4؅[oU. h$ R|3dz2Fmg[ts| |q zbil7=OeƜ7eԶ$&#B 憦U*.9תqlURPKSI~b N>aٍΝP#e G;}uV +贍Z4aeGdmы-~2Ct[$m=M7;-K WroTp3^UӍsURxU7W2u/j Tn`R}C2jR4>AfIPR{5e93 P^dY4ޖ VVy (.vKZ:~?'igZ+s7=ƽ<ʅze렣c4>g;d8Trm4]keՍJMP-Q"gWƓU\ $) oD^m5S`rb }Z J `7/[k#/ZF-Y!U*-kR! gdV/mg LM,꫍t@بGBu6*^qSUk#UiSv4 ħ,+*4ov~eoTrLC[ӓbeY]XbڲeVHdŝ(7F,iHI'fA̷<577@]k֦;jV8^VZչ8jRo?:4 JH}U7zGo+h `IGDbf5LR_A@j#t*j3}j^S8q4Z2m=+YoN\@Gj[ͺq-J (~-$= ɄֆYAMm/`FNaZŇc 1|`(QAK ;_B(=nդ67v1(#1 'IY2cut%UBah}N+ZMݎSlu2RO ~*vX DhS,"~"$yF"@Ip5q'VsPc?2 ds '&{KPWAU8=0o=B| #W2^4Ii):O7BcbgnfxSXɪ^IT&_k:sjT<+ŏ3]l<5ۄ䩗"k7bͯ[agJD K7jZ`ۇfߓR/ ' 8I^}nTIVɉ0lj"@gϷDĞUl\?iylIJe_ՙXiƞ~Kd/CRY܃P'Ix#K% ;CwX@y6v.iedL/,yVXf>mf[$S`}S[Wz*F5Q G6/ڱJce[q{@iUkjm7i_ݯ0} ~%F#G6Cl=vt3A4] N|>c%_<9K.|75%AzwZn*#5y"S ՒтrҰFvp\+H.YQ&m!F|lL+7R)`+DHނr.^.7p4z&_7@!6bv!zrhP":= 0K+yӍǀQaH~ZNd(u޳aޞ9$7Kس(7 8(`O=X22%t ,P͎ -EEwȢȤ,(1*ϦUۋ/bH*"Eeõ{*-v @9o.5H Y0 hV o'94w:3 &%6UN'0D,]D/Y(w|OYl u=%#n3X7LJ]r'~&ˡ($>2mMfjfd[a}u@sVw+[珒f0t€E( "iDH 2EAY6a`y HXj*c{=Rw1p^bgc%0jTQ'^M۵ 0ĄWc?>:̾$8Ea6$Or0SX&a <$7M2| 8 <3\>0l/iOl9RF%pJ\- `DBidm)YIpzS=SFR`#9;T{LV= Zl{K4ǻmmgUz WeM)L$a|^;G̉pR$s%+9JI?ޞ2R3d.wr-哌K;QEqyʒ7jd[hy.6ZѬo$x(hZDUH,{ R/x;P,wi!pm+>ך*"L2DW]8 weڸM6biNg 򛵆q=lK̼b$WfyRaKaGI*뱋@{kkP'Ii2`\-/7el"8ߣ$N` ^i@LuaL'~b}X@/ ]YN߻6.YP~*EU3?/z3" Mӥ'kNeB6R3jB KŤL;3М{^A{^ب”G3hac)VdF fuuGzg{ ,mTXd6FKrMi1~ndv *v@8 K  k_X̓g`t jR>X?;ڶ²:k0rGcDr16 ϕ.'_NFD|c~gzMy:; %M0e{Må䲤 jJx0+IZOd2eHJl48>zx_q-~&]XlglB tkSh!>q׏"[0ykᎮS1 U2a]3/sgㆺ@t1}ژz 7w!]@|݌`g~oYwpIFَtzٸr1i,5,5-07o]JäٹwdAѪw(X{+ b,'`=oIIMACBE 4RՋ"ߗ}R`J ێ† /Ն~CAwvvQI!K5N|;@Aޑ #-&/20$˕T\Ek$e9ۊ \3P2B Y*g{xY-nLK"9-n5)!FY".d$eiCYH'MCa@UuMmẊB$H`K!dÈf EY6brCbd~@;6dx)Afm60KI8&eؐH|M:TdBh6p 2nMw %uK+,7j-RW=ڣ>ё֒[^Q"2 9oΟ/ ^%w&6e$oP6z6ּu8PEلt) 0L'@COkY.oɴܵdꅃA!A]E`R 7 ,}DbA n)TdP}Aq)*}F}#[Y+/*㒺2Riû!|xzCA^8aV}O.}t\aWZ*@8e{ٯc5S tSQdxa'ٴbFVSXBr9)?:fz }%z)L eh\^tʁc>9MiJP..7GGԊo^ӴD{~dN2v{sSڃH?^}PRiCJZh>r5 쮂 ^3+GuPy">澯ڐMvSxCu& șP{oU}&x\)7"qâoɃhOG۶ D;ݴZ?~+}hr~R԰-]I+8Έ1k: Btj~Vt Tv "hO}ގPdQ&sFc9jsXڪ^Pfxm9 ?\U Χޞ81 8n')`db]JHT㑇$}7'z1D>:l; (Ig;(a6:w%tRjWېG|?W<2?1}⇊nymk2 '95? |(jM]KҊBNFiJYl3-yPESӏU{{bHX.,Lbn]-# 5(~)/->aMKë[Y<>y'uPBO?C T_;:³or!u6RfݯAF#ӇA%hd g;;ȷg;P2xiVx%t? D@{ӽ'xAw7MNׄlbA]B'OMH4=ߧ֘ͭgS}RrOfOP@y뷮~+86E2Vw[g>rUf|I-AzLgԒ`7Dt0Z7xc mu x9a'[%&1~1oܴx[ϲN:-~zL:-=/Kbc1HH8xm"dR MMsN"SY4ݍaJ3)f>7Ls %05, ,EoOטYLn[|EԮgͻ;?[ۻ s~^O[V_ݡ|6l7/VK_ͽ&V孅nkM &mS49Tm#{\ʞdgfndjb9[V}l҇mɼny~>]p#,˖ =tڦx;21:foBonϕSςO4+_LEOqt*F\ƼT.i@jM'LoѨ:hcqST!J(Kqiu2sTVE#Vc'"u;C T#|+%П݅ÊM /^*{Vfď (f}[h~Y? ˕ ZĢ x(E]ׁ-AǥS|q͍syjc}/G@t s)Ǥ+{LZ.8rc3/UԴ6nΓCFb@zA ݽy+9jEskݱ5ܶw7}n&Jsǐ0^PL/,ȞM떹,WZ:ٜX Q^ bu1'YiHH^n!AEgs׉3׃+y!gtP)Dk#ڶRK0y~crNp/e x{}3zxAi*~! >0Q> 4\0 $%foǩzdq+ dYEiR\!%fgʝ%-^/q+C<4 B"Z lt u 쐜8Ct7ř&D5 |;=j#=&>!1}UK~KaZI9_d}jz=eȇZ7]s`i5>ӒD zut;<1/HNM?(#/؃!dq4 w:Ev< iw-њ|A=p靺G)bIS՛>37Vx=k[£ PSiNyCT zJʤGYbAf=oThLJIeu(Κ_<(fdIlewGaT G۰PÑ׍ck2݊|$҉FC?xP3٭: =)4ȝ"㠓1pT$Ol&:iQ;ÒչVZdY\9=w_*wU/AكF/~IủFRZA诲u4'*`Nm(_d)%%,JYL&r^kzM+E[Ŀ=~mG65 ϰ~G<{<{/<{tg=_,{o0_l_WSw ٪/+Ku;E_]5@/6w fMdBq+ԕ#}t{]ܹ}VnZC %yvCs]\qӻ}V܂wl|F%I^rWX2">c5Pwp|f9!©\ӷ\pE]9V u_u{ W!9,K|/[V^+9j0^B鲽I +nS҅%HSLckngsG!,ywNKۡ #CsЗ;ͳ '^yK2 nz8h1Iex5yR6=Kb95 uB5F XE]|&~BX*qQad! & &Es ޜ"@x8"[usDp~"2 B (@*/-?-$tыuEH ɐhL 4a9DÀ/@$$2z Q Pv @D mf5imF Ȏ(gf y0jng߽ӵm2TWv`0#*Sr];Њzɢ>-*Ȫ4ex( 6pPel1s4t._x 0$A|19ۭMePa"o .s'qN)^2*yRB PaQ⾌xWMo(Ėovb{DvZiNl{ޕrH] #ql.ncZc"siŪWU[+k W^Kw4%#2i#0&Q,/4.ݢ{ҹ/Jkg(-6@ eU!a.ľn>e.kK-ڥ_Dt+,dJQsjù2- 59珋H/lh3FaDU'K]Ľ-\(pw` Nb6S(QB\ĸы`y"K7_8% 39,-qď ĴQe}!Wt m\Ĵ9bp Ɓ5?G [sȈ͇Cf//pKd$J+Jz^y*~!%jRZKsuVfS܅L( ñy،I62j9/Nٱ^g}n>NGAחqKщXm^:: 29JA tnU}1plB­ꃖ)U}n,Ƕfaelhζu @y'Hgg.rU_f |חٖ ܽ]'{o֜g"R%~6u蹕,>`nE%$=& ]}PLe#yMU!as\y- L^,[܁'T$T^xM\lOvb%V+zǻ7|DSzk POƕ]]58?87ƟkfvM4GAi._e>AEKiACt> 254 NRDǂX'\ Pf}` 7V:\*s*qlx7$@$Cpme.ӿCqV/Q<|(FMPiWF w<_ mt4˾\~wiSaɜU)PVf!a6< \*/Cǟ!~(( b@׌5Η Yq s# ̫d6:mwF7ȯe Le$ Xz[w.{ q*Α& M#MF3!o7]h+ 9c wW7A7gs _1Oz2 bRۡ `&#DTe6"fD2q^q6DyIC jB!Ph.)P?1l|1ܫ x340031QpHKOOgȭ5 $\Сп !\]|]s23J JBJ*JN-!N1[ou+AA%392)= ]sw&XUsՎ^(%s΅U&K}WBU Ե"}cz(~ۦ3F?!T xA 0E9ſ@ .DĥK Bdt]=x>ƕVg,"b<.(B'Mm8B;NBd%YDJDp"ado]0֓'(TծDS7vy%e#WfFςKL͟Ң8f(GxeJ@ /zݛ"^ L膸"3BFuly.iɂś0{AO(}׸Ѓ 9I<%}avxZ_o})BdBԦST؇(д =cg6ϱf'EEo3JK!j! "J1Jμ/CI36̈́yG~אe/TD"= ivO/͋ߠًo3-@F5vYCSz5<.}iՄU5硳Y#skf4렓k(w 5t~Ѵn"aiEPDĢ]r*&>}$W#*"B(u`c{l33P_{⥇kVO8. }"|/(wNa[(0Dhwm Zm6 RGzˆw(ƻĦ~P-VH GO ^%`GEc;L}7i:AwYi"6:pM[zml-DzE g X#KW7ڰ G z ;/ !Km&팽2tYNO%Z`- %JlXŮ\rT/'^(!i$iNf>LXdj44qP(,TpɥDրDD ֬@'h+2 REOO9${'vc߽x_ '*0r'h]gv7U&=7w3o Eebn?y ,̆7fpiF }04ef d c=p%5T.Zk˘6@x[.cf,X(E4Tc'ψ5b-#a ) [EgYDD!Q۰*+d@(^T8 )a Rю㙽6J0^GVK;-U1LJvdt""CNyaۡyp6B-vysf6d4y}Ko$2+압F؏Eb/E7X.s퓳iAKO*fLmٸGg\\ z%.Ry-V@>2vjDorBIޣQq+ w$plX-X_O VmՄf;HsY`c~;yV F j J9O G䵢/ZVz4{ϩ_)t4 rdxQ %s(e3P07`%_ 1/hqIrJbHI:q<'z \嵈gU -RŒ֌~`'_/c?T P<*.&kcڵ1)h ZN #S!Q"&]7Qҧ?6?JuAHl<N^'y#|xVD<(&)T]V!$Ś}ywp3 *I‘-P!(%%k|Ry ,!#p{LU@ ͟Af`AwO \ebbxQB,!S} Ad$!ٽ_z#?QQx2 DYj`lKkwO:8eGƒq,dX?ࠓ;١zEwQ| G34ñ0;A3<__aqgt:2rGa F,|^MR!)W4>3ڦM&Pm{2lqZ )1!0,_`&|@/b7yiA&|\AqŶ,m! g>? ĭD]m[ů?Mhb^?Yt_8bЄTft k5'|1Vp r18=6="NSqyʦD]*3]r(p= )lX80hi<0 `O3 #L* 9 _ ۥ=0b(dFaH`Cu'D[U>^*%S[8Vt fS)q)h6'sXE,*oTƪF1绦si ƪC.G)%4nbQJkaf5Pi/rG|]& Dh䝚Ib Ws?9_-TVL\:bvs*W%99XI4b &ʿ`\cé`EWXr 4urEM 鄾,// bTJtաzN{u"oypIlxGe悦WհxV]oE}_qռ$Q>F,"TThZ!Th۫wqJR<@[^yqZq6 f~H(wg~{ΙUFfb$҈LlIFnJJZiT/D X4oHDQs@߈MunM']ʕdBqk2TX$ P܈8%&hPՕͦڒy#CJ!18JlǩõV9yJ9ڵFq!uv#7Z*g~?N#u.svo;/)i:7(->p)Q-5dq{JZS$ -O,]+9:9jKjDP :(`Hn^HOx[)xhRn@˟PShsG~e..Zg2Uu -S{`Gx!xW?164o;v+{DŞ=,vyv%\y]6-c[DN'{(:g\Q}Y՜OO}lZ䒾Og3bX=Y~OoN*H9?_栮 ~x8Z*9K$ðNձn"̡&@ϗ!Mx;huςHRbr!fFEZyahx4iȑg޺q{\RQbC lox{l{fyal)eq,x8Z~yE <]Xygbin WqxI[ޖU xs@!iJi{x;hfٚM2x4iHۑ:fi2F p x{l{fyal11yxbTxRZm|y@ЅnMn2`;Jr)HJl%40000 srcmpo+Dod/c|(<&=x;hked`hk`kd*6&ex[ĸqHNʥUZ԰M:1 x8qBU㫕^goxbb@ BxxZmtJ~} /I%n608rF KTP@100644 README< rm5 K1, Vwc"u?Uꓐcʣ\-`$4:mŞ7i3x;h5d.dhx/Hd]%.l6x33M2|4 x31Ԣ"GG8>{9o^]Q XMjJfI~/|)/aB=y<MmG\{.>չzdFiG(EyRo;ewS"_T ,hN@grHw7Z? x340031QrutuL()(OO+(ap>)Bzs5N4HNKgpykK|ܪ)O?oCHI,awlGt:dFJN:)c^֚XL_*mkN'3=(??->4#T!golaĸ z7[P|^O*(JI,a8}pz }WoTE9 J|^WfAK,SYPUh;xWwbk#x{qB,ĸ~|Mxx]S]HSa4E7q-Eݖˆ5M%%8lcL/ޛXFV$_eXڨ!򦋌좒wsy=/_^DdIUbpړ]/#uPc*f<$>8)rSKP\0N7C\J4 xfqUE>*@:tpZyǬQ7*7} 8=#joszHv m3y+_wZc,ύ,u-*;IS'Nڢ!G{(G%<tNk#DQNbz~`?V > /M(> z,HKW3,tt bO*.(Pcg=#B5zΟW}6AF v,1<8!u0(:z78C2)2G+q8v ۢw.fq&i,:v=Ut):@u~d|E7]E91 Nf@[7ǰbPEj08" c3H5.~nV x340031QrutuL()(O/* +(awRy-2v3ӓ[ ! ̩bkw7P{j b&bɁ\b@鐌TG 3sR5THʯ>Cn!oZwa}.l `Ƀ^7@`r\!B|1y/lVɫЅ~ ur.l+Oex340031Q(I-.ѫa_m|)R3Gs.kچ5@iԊJU+eXjJhBD:!xuRn +,.tC&mijsh&*p{~"WTOt:%O N${ޱ)\C(i#9}Ô#vVMXNhYmj$xͳh9$ջ!P{l(;_t^M:ԆW +Bkj$Ӯ9Ĉ"&٨Jf}XFCcVPboZKagϼ4uËЇz{*jU?//yx2A\̎KlJS***&Frp&eMчp6Led{Tx}Ms0Wla,5$2!\kO%8*)dA iճje o![A{x~afD|pǕC"KBTGkV;EѸd-/;焟БA.-jPn#g鬧 H Fzf ŠA|?\# Ca#ۛjc-9L?ơr&{05U4`sb(b!T/6L/i28-= o8ݷLѵi:3g#ӢB}Ȑ)rI7Tph)㊏%Ტ$ 3xiZ #Hr2f`1Tn:ϕiۄ84R㱼 L˲{a|4QgLnˇ.w64 uZ!12x;h5ǀHHtFѬW=3xfrxe 2J& mnjg $_9qosx+*'@;ׯ}o |,xqcyW8xbcb6ks*0OcQSXRJ[xϲe/\z:w6\/ޣ0YIh 8x4iVYv/JmB: yn8xb3f:aF͛*$oxϲe6HuAS0Oưv; x31Ԣ"z<$7e2Ԕ̒"_S(AXE n>x340031Q(I-.ѫa_m|)R3Gs.kچ5@iԊJ1yb~7o;_ȡFx;5k61$Mʲ ~v -xϲe6Ȥ&}Qsj+p ٢ x31Ԣ"@6fUd6e*X(9&5%$aܗMQx l ]5HWMʼ{mA7u-xȊDLǘp-nɐ™37y`Lx@yc 8_NylWB :K]OGME%#;gS>O /[,!Mac OX7_O }C:nC\@Ȣ1鼊mU=Cjz ߝ.g=t* eZ~X|Zλ|[AL<;["a 1خGnrųB&$ϘިeZ:_tjb|CO8ˡ. fj8:4*J_x5AyQs}Z~BrFfNBfBQiNdAdJlmKS @(3DAIXIA<&5ØĢ"9i(r^qi܅` NZ WЊr$u0GlX,uY|չzdFiG(EyRo;ewS"_T ,hN@grHww?Ax340031Q1*JM(+dhWڶ%Sn<׍P,)/lxj`h }Pxϲe6HvF wNiJ׋ r  x31Ԣ"ʥfaKNVXaCd5Ԥd,^a6)/ԓ*cpiv˥w3\ ήHf{2X.qvYsPv:嬟+ EA ‚f/t؝,.mn|GMCi x;ƸqD |x340031Q1*JM(+dcp} G7Sb6| :xz>=(177h 3wAQf^jU,L\\ txϲe6G̏>*ߏO x31Ԣ"COT^bM4b{<5 XMjJfI~/|)/aB=y<MmG\{.>չzdFiG(EyRo;ewS"_T ,hN@grHwU>qx340031Q(I-.+d`l;7Y\Jr T0$^yۗn|᳍ܝP5@iԊYc Ohsf`Jl*Cxϲe6.[mC_,gC\n9 lxϲe6 4gE.zv~X< gx;Ƹq" B'x+c/b/7V fYx;X7ѣ h+Gx+*'E)›D \G= lTxqyAͮb||'x37oԨaVr_m?sY enW-c3>0G$dhbxq}Aes'3}-'wqyo(9D܂ E,x9<:~0) - m.start(0) #644-;p#xR&4ݍіi%qnWeic60>0:gV4U^OVF(Rp!x%sxgѫk #Kfr~(vQU3Gx+*'"t+-t9}ګX?h Txqq7 c*iu!x3|7@gY/ :㻭'ޑe፝PTX9"VJ9e[ x{y]ҬFVz%EY7đ  xir[[T+3jr)ABb^bNeqjq4He^qANf~ff96&Lc'Gs oȱEdG̬qqlY89_`:] zsG"zKJM 7YRD;Aus-vB(x[`9rC ֝+µF$xxi4Rk(#5 ̑Hrmz,-M`lSqqbP[M4gLN-j}8Z'_d}&U0)xbҭ%39?g+(;\iSx/z_x}N6x33M2z3wx4ib97}o,\- RD~(^yN:"R[P lightproof-1.5+git20140515/.git/objects/df/0000755000175000017500000000000012335137464016474 5ustar renerenelightproof-1.5+git20140515/.git/objects/df/0a767a0b1ecea54a303bbd5fd81a563570ed460000444000175000017500000000035012335137464023737 0ustar renerenexAJ1E]) \8$I%QqD#ƥk3z} i \; e ֡2Z:,;H1@µƺ4 z"$"1[m+4=P`3M{Hjxw>^V"-@HWH$ )D3k6e6ų \\^> t[H+w|&/Celightproof-1.5+git20140515/.git/objects/83/0000755000175000017500000000000012335137464016335 5ustar renerenelightproof-1.5+git20140515/.git/objects/83/30ec66d7f00102fe6d7180d2700943c591f14d0000444000175000017500000000103012335137464023225 0ustar renerenex+)JMU057e040031QK,L/Je8ooQml̫|8" ? ϝ}Yl/En3B&LIFb^zO~:}Xj`}Dp[}PE.9z {;ozէ\HoBt"􌒂4c2oNgKGM] K3K2*K։>]s֒ӷ{ZM @5Qύ3ΘW/q.rsPPG8_&5PKR_Olightproof-1.5+git20140515/.git/objects/08/0000755000175000017500000000000012335137464016332 5ustar renerenelightproof-1.5+git20140515/.git/objects/08/08d990fb5e45982b253333466f1c04bb3863490000444000175000017500000000626012335137464023122 0ustar renerenexYrgP~lǜ$-miNN5K` "vB!ufW ,Xn#0)8{wE?MwhoJ럫WzyK!>U?b!vMlJ+S%E Iu ܏v%I&fk/9v(3iV>MX繌= 6gZ%ԆJaDjDxUL)*)ÃD+kdbq㚏dKfZ&ύ( ax%3i((T*LEdv͏&G-r獽hw/?C@do]Re o"$Ze6;Yչ -$ZxgW)T w4,w{x(V.2@V L!Ra#∶fd@6`q(GTVvMUg~'B;y5Y.ɗ+FݡJZsY{̖= [\eH85wa\Jx0dޥBD|#<0hQ^zqquB "@ :A AU*LÅNZ ]oř>WVtmnZS-ֽL<1髓Όwuض&aYJ>?àiL1OpNBXpE,gCǢD%\HÅ0}N qEѳ,BO8ZT/f7+/Zyl#"6m~KYJ PFtˣgONv8ǎXu޻J2Y|yYP&1B~nQw>%(3+r*Q(#*Ki%]{6H3\mQ+޴^?u0e6{\Ǒ,s,Hc`.U+] /xIU!8.1ȣ2e?wj\+ DՂ+j( bIFS _0WZ"l y9W-8e&X\@;,x8[$/;GY@%HA$\[2[~Vz6RD? m]FHPuЛg;摪 B0]j'b8vw*/c62EAQ"7"G@DJhxΌx> }bQ,ڃ=l~]:b~5K( CC6(^IHx6d[2ר}E÷ 2RުÎ6I I՚>]o3M/-J* 聾-"ʎ깴wሾ>k)9H@pN\;mUu,rT2hw"tNO댲:@[: иdxV!Ru_8uBڹii2sy Z$V=_7Mk"<M߹?/PYD*Hpѐ6UsQ( xgu2U(3m:Vsqkd%% 6a aD+`G.Q{($+ !KF+WOrKe`IG_p S8Ϩ>ˤ1EY. [Dܱ#=ƿyz/†"n H8Z|p >ğul1䀹&av_ي( ő7lЦ\i++[a:Goaw'~X)p2pj1pPQ0 疾ϙ8Zhe-w9M D#m4jߪB֭7Byb"FK_[n*h}x^.F|# {2Pм2siCG_o P 6x߅pd9x6HռYV`w86f}gm\BLztף"ۺu*1rͣp'?aF!ݰ2CyɎ@y&V]Ek-e #JhU~yU@̗F $u#HǜquČs9"6-D q{$:8t 1Gg\WnKz"0J$$%~;=^9aёFv}/x뜈@mnV0'/8m9_Eh#x>a%J\)=+hk/vW/ADꦼeѤU#-'H5,1z^. !5\/0$o}fjǍڎ lDk% @򪪲 Zl6y[owNSwA{oXUO&nĜg޷eļ D(\c(D:ϸb[P]t6af p)/?Y;lnZr Gw}1\,5Rh}:x&0:{ )q%@#jM =5HfArOͥ2Uh">ZnP\,uE{J qʝG>>?|ا6oOҹ݃ ao?= Ed O_KRi(<5cڬE\^O"(:б)˵{=!T-U(K2@ۇqS_52YI}JZKw!ZP `Ǣr9]q(7YDIB|1Vp6;xg4Jdi!WH۰#%Np= H!_⿓|ie*\qKhy[826S|[}Pm:Epa-7ojBxj'b#R{ -%@NR,3_ \lЮ8NT68b(Q(UnqM64S'WÙ2C}cY!Iy$ 0/!LS!ĕEjk|'򕶶,`Zqb,b=kr-r5W¨$p1(A6`H;6ʝ-f|8]'p`b/xPLFۼ NC&F"T8- S"U/&&,e,E.>Itx ;xV-^eaH;%}S䓡 Ú_U^&$hn\RQ0 }0h 2%uB(RxLA@L@Tm=W8QBB 5e $cm6^aed=`ŷk[kn] gaF>Dp8Z%6› "ga"͕EԡEPo)T@d7S}a )1l1Ts0Qc2@!z.-xD9Z⩷[8a5 `9Q6ߛ `e}} F@G N^S/34UI(voPMͅDK0O9\2M >#_B'M:3D xU r@ÀJF5"vWȡΪ hi,1]@Zv(M*A`]Թ\Qi𚋰6sm_0>W`s)7^ x }¢*ݾ'Lav狻r&_ VdZ5 ǿd5jt[">c dUdSFgvr܍Лছc :ܰ=!5,0RCy6ejE# l4O#&n;f=QE; o+~)3gK74ًi5tf(]ena V CFXn03c(YA OxTm}v1ϗe_^&8 9*pRy4OB` NJK7`nTG}ӷ_ݳx+OY<f/$TΧ:$??Ct|0J,DLrPLG5U N(Tbv#sԄUaӈ[`ɕ: ~'퀋jtԬȓo"`KntvP?f-caPԟV Uzɏh dǙ!ٙ@~zDa|upV'tۻ7Th9H~ T/qaP?w^&C Nn"*}:SzA|X (koUWae<NL,իW+>2 H\ɓf`W@^8I\' ʍ^1,{($#~ta ,}|(Y5WCAK#YN͚״?}(D?S, i1< ]z* 8ϣHNF [0U.]zKk܀$ 3(>mtjnHEcgJ&c%dFdܗݯlL3Jqk;b1O3| PB@'/ۃU»,y{6Іrhn!HgsfrUm"Su7b b7[CLmx`_alightproof-1.5+git20140515/.git/objects/31/0000755000175000017500000000000012062702716016321 5ustar renerenelightproof-1.5+git20140515/.git/objects/31/13fabee69c3bca839f603b8bc41199ed3e72be0000644000175000017500000000602412062702716023762 0ustar renerenexYrͫ]/Y咺Y,ۉ.\ %t,0 `ɥ'Ϫ_9= f%* ʻ\ƼTsރ?vvݡEy_^Ikɟj.vtu%tKUmj^N{F9EKZH5-N!-M[Z|E̪NZŅThqUSyPH`Y[Jd)z9!q->ò8-gn~6ϥM2MYXz;Jvo 6Mm +:/ $ݖDgL}q;4Z#.8cH-h$`¶R%wE?(Ku15-!߶kJwEggJe$,_ X( ꌾo\+F;D?uJ/5zYnRJQ,ƭ-2:[{9aٵ<-bs-JuOfơCՆ-֙eQ#Fh˟ؕ0$1xx.&%\\hZYp6$Qq񱍬2a]Ԗ2:?z`И)LpR d?^2tk"Mv7} HPe)S+?A;cI*Š X`a * 6R:j>ျws:iָWty.W G¢-> "]v9TyS FY8~B2"Y!t:@>Bt# ˪u>p!_IYo:S:ϵ _~_9p;$9J^+- 8 +T)e?𹂲'MA/-*OfᘡYt*KT-kÕ㠘kyXsEgP-RU/ ^MBk#©I-|0;eB@RzϺ,񙤴̀& PT`[a%p!8*D "BHTXC\ily,f}-;̍v-h!]s@F B]fDoG4GL#셆üuv-qX4h BcZ\T%"6r0b?;:mżE(kjVz8`>)(,(*h)&0؛c{Y*T] a).m{A IՋfx>}v6{f)k5Bf_(*2ià rLn3!U:K pܬq(sRQʮRFǀ$(e}_]5 v-j@O}oW!@\8u s\˼2svy\ VJ# $:DdGe#YLH1)B ўTXPft <\xĭl_d (H>hK@cOh%pd1 BcX =w%d}!b뀮sbJmKL.̡݉LK[HBl1.هbY$QP(A*& V *GѺwZtA@7e ,R\4@,pݎk Y 8Pq UJ7K*`~)D %[op懔w0 <,@ 1q>ޜTW7zO4vY]NWxh?p=Kfjп1P&N<`1 D[SN+s˥݄-y5+w;(3KMP?`}]WICƳdQ͚8l[Jo-sv mm T/uK*6n%tvrH\^0㶃dIy|Z` >cv !Jd,1Ŀw{g-*]Qr9siA)Q2`Ȭ>ipDǦt:C#QKo9E&Ks!x OzL?/ϔ?-lo^,~&E.;.F)?Ipʿ#N.<0枓KpqA觢leuW{݉evU ]HPúaup1Nx` d,3v,,1>Y$,3xƳk}1@MЫk9d :i(!k eCRfGf6Z jiO a.KaTt)E`y]*yf; k>MM_-wЮ^d3و\kM+[[H`~s"-p}#{Y*̪λ!l4I/ϐb@sʶ]<0?j" M 52[Y%EֲDD.>uF&`"if'Ar׈FYmIpG0,7l9El )N{;*q'EV!X^1de`Z!WeBAREX@r Į}L ,ŢUW6[AEe+?н|QJ:tXZ`L`)8x1:@Ws/z5^W~يz#2Z2rN\q@G""M֚;'`g['@CPTCYI2q 'T'i:Lʰ$4EUIƆXJX(S+ #kZ $$;Qvz>7Of,^ .x/ä3.ɖs"N"~OF,:>MCr+874EF8Lj,REZXRh8|# 8^.Rf}L*E׈_F $o^Y^lD5}tuM.c-ZG6¬N=7?C1b*4PzEgK lo*qؔ*CoW sRHc6#ʣkS@DT>tq5ן o<#cCg~3 û7 @:Ia՛ZDԢTQZ{ .5\@6 NXcF!(~$)dn?v$B50)AY32DN_,E.ɋU& : ˷Jgk֐yMP"gb~_V>˫4QC ü9 x}5 uwe0Nؑ/hFβ}}'qQH0FWD]fTRQE3L%ոS MwWihLm lѴB)oTi9n &d*a"@*uR-{JĮ&"ϻS)Ey1YY8D>T)F"Ո,i7pNPTK G|ů燦g44ʕtm^*WC BE`jb4@CvuiFǙ/;fgfX_G#)vZȮXD47&ӓ.B\`MD;>(4o1v> Vvo PSe^$an%ޏO4(\,A=-ên/1 n5ҡ6Ό.a~).ɚ-"l-ӥm>l5kYQx6}bTBs|x(|c՜i}8UTSeS \ 0 jOy):c h]9JsѰ+I$9Á6Z+1<nwZ9CB5sfےhD piB_ tg` Ugkdl:g #nF[#NPa^Nl w,J/Ok!: z5Dd%/K@&BXh=i\i9P2b"6UwB jUk(eJ5`S]~WyF5jni@Զ ۬ꝲ[nILM4GN?<YICڡ`yĊTwkÓgó/|v12T#c5fKrt$Yn99 :ڈ Hӡ{7Ѹ0Üd4ؚܲ1QnN9{Kgj  K:ɓ -+ 5 A+"i2 ~\P#ibF7<0:&g* (&CϿiO5?Hzy<1JZcPK옴-Z|2z4I=G^wC56Elightproof-1.5+git20140515/.git/objects/5c/0000755000175000017500000000000012335137464016412 5ustar renerenelightproof-1.5+git20140515/.git/objects/5c/a2419b978ecef9c646d7120c47f09e9de285eb0000444000175000017500000004020712335137464023657 0ustar renerenex՝msו+PRiHDe1Y-Eےr4&^h$ت2naFN6lkVjFi}ιݍnPd%lt߾/{瞷5+v59AiG}Ynڮc}8~8Əsٹ(<~ #5>Xs2e2ɿk9YN*{!#eZ|&TNw[&=w0={ F -[mV>z 7+Jy}ֺv1G}PsA JZCֵIB&S8*X3g|?Ԯm}W;Asy\su\9~"]$u|0v2v9_z>*5{r[w NjwR\^wׂNwUjYJ:Vyr[hͮX٦je;)= , julZ-L& ^cgv1@d}v= \ tZ)=`s!zO[ (nŲOh)?lRRtRQ 7V]r.hXBlӰdH{/rCH~ _3,|5Awدn<^ؼkf]h:;d5nm-]\+$zZm;a4zŜX?#PXi3^wVh:ޚ?93pZV{@|dkv?koxLG'oǏ=?>fh7ߍƿ9_V}?lVsgl{AmW{A u'{x^6zizuxKTʽQ?u:.rM҄ϔ M[ovтf/<}?xj0)O >ǭØ' ?agzwүTZvw|t(`nܺvtCu1ҝ0m㗄n/`u%}Og' x?oݠ^}A Mǻq 6=huCL.4d3bn;3l[쬟vhw[XV : O!j` >svLC*? 3S~ġ~jO^$RQU Yunc1;}cwzlg$Uwz;­D0Ep\xj7>g_slՍ C~n-|&C*0p>ӧ~鄹3\;/wZȵaV5=ЭNlȼ90Qnw;u׊;%=5Kp>+|\04aӝZ=o}~ټ^r̾v|rANyAKK0a[7V_|o^%_Wln8f+{Ykvˆ*k`Ui ϙp8s&k&jnQ0eg+oN!ހcMp[vǏ _ ]փJ" i&)z(' ֤^0ބ5bt&<2~-NrZ.WSp晁.?V-m[B3LzW2˅BAOzZW&n2IYiO}ޥI6F:keu-#2Ǭ۪>@_2z:h,2-$-9 q3x{q\Rm5;&1Ld/Ã.rn-43z5wx^G Avi^d+53Q7x7>Q΄6fq"&l֫zeł?)ls8|gLhC"r#"K|;e!K=)S))& aœhndYCVu- 𼠌ꃦ/M<y,\M-X ? * -uXZYg' :҃pVZWR1ꃐQck9VL˲n"^2c$eretqe!H L:dh 4-3w] !R2ڐ:-s+9{?-_mfU)F+Ͽ¥u +˗MK:[.oyM]yydjiVQ?Uk-uA# f} Ymxd[iqVyXK㉪ͳph<\ aFF% ʠeʹjK!E"eTN9 ga2h4W% +0>Ez?+Up~6~.~ B7ee jYI$jF:4- ىdKbSdw, 5!;ݼiv2핕Xosry~ -~G}zmi_+|aNgbY}8G/1=\'F6h=W˱=4ʫ=;G9*0^8BxkbXX:8RVH&49݇A[9Gn]|WvZa[EEt,OFZMC*tUAF?ܑdHd=R KoQnL!ٹgV3?]|KH|R:cyA l>VjIw#F9 u(qT*+t8<0!'Y4ۇ>uhE#´Ϩ6ALXixlT0 iJ6m3$ qHva/GK=V-WW7WsFz_oTEN/}A\2$f ew{u!T-ӢRTJY4-dLcވ[ưRe%|6ʱ̬*V,j5H4AQwhkb:6CI&T"叿Hi[h8ň/X6‚U|"MZN~kEm/l+55Ogf*.^z[WVeIW$EW$D~1Ο8B¥e!{qˈmn8#jᝥ K:oxOA[3?䢡yU&0|/$e<휰ҒG״ܱ!5y-@b[DLi:W[ܴїZM7 I4S ^2:j%miv-ZڲKj T״FRtN,.9OqtկpYV8P)Gc'&008fnju+El:BUf n Y<ГThUJ5|B<1{㿤"׶GD}ܕ"}9iԙIO䐂QEbX6==yCF}o.e$„e,T4vM<)ǬX "ʑ|RB>^ D EgۄH͊O`IZ43t| O#B>)Ez}K G{e^utuclr39Nm¡έRbbVdj$U,Y_wBk__b"+#źcH1`SDŽaC?_"bJ~%[|4J mы6=R7.DNFtPb3韱Rd;Սr9GP,֤0AScRQEo8Pd.,6.yDszw5:1K?LM 憖Xp!vFlÄ]vߖҎh#rCCCd>^,uLc7ѷ~!e, ڛ͸7w&VԛdA` V "τ(vCw|TM%M(WJR<dP0C&['Tӟpd_W[yjx[^ݘUjB$b`*!41",`7s>z]Z&;X1v\@-|،QrxQT$ٔ2{+Pu1Tqd&1ee#^.qzc^3@$ONi tPG^AAVإh.Tdϸr/5G.$J%'%Q1jk5Wa5Q_1MCuqdr铳gx~$y23 pV cDLx)9&ጯ ד](=gg.50q8eH9Z&d"M(LaBBZ JA. 2\sK_Lu1ɃQ!{Cle63(/$#0x,ҡY` a:̘cNu0'VR!/~~3&I\^HluMs1?!}f,$yv4 )XұK w#'H%E݋3{:f'ӗ?.Y/]V ٚf)].\&ǵY_xyH>H'MG`Q}ݜLϗJ9 OMS t$`60j-h;4C ټ H-Ml=`=`|)*(pu3eκCu6,6C7b½%2ވEbOrjy!Ӯg(@ q0U:M q&816%pdm?:HVyrJm\?_,VۡT'SN z5DK uIn7G@X&u:^03rQ[٭Q#tq=\ԃv2o:'#mzM&TnhXM狗VWUjM˪-+5mz1%<W'EbJQbiU_P7:Y(Uq$gYIgAĽUudVeU9[he6|-axdH)nsC L9QQ8Iވ'6,s~_|Sz=t |,!_\wŻ0& J.6]ETrzvRjAxbߪ=<ͼ>Niwd`S 35;6d. &idbΡO@S娏էBC ]X4hb1W\lNWFn=bu(\DW𨡑q -0GX> @DoPSD,mnq.u?jZǚڕњvnL`gak9BnќQ( +k.-)kDI)ZC!cDḰCYv&7 o[>f1Lˆ]$ c+T5Z CD1īpk1qCl6%ܸ2ֆvU+U70@Q bS7 ('hCd v|mpHDB׋4!ZyĨgY%3XgS0b c'VELu N#7W!2MxŇhx5s!fB1vlt,,R'Yr=~JPۤqFb ͆ʆM fnrZr =T?TmC|сki..|g#p[Wd򅡘~{۽#:,/B ߓL}o 5Vy>v8(A,KXƜhv<ϖEtQ!?Э *L@%|td1}?#=@Ogde It^[A)ג6- 4lCɊjvLxS5(LTٝhEK2cNSP2e0"=^d3Wy ̒R`S3Ɯ@Z ;wԃRK!~y(#$[yW2t (H*P2a4 k欵.V\Z]?1`nӾKo-0M)1es[F,4GjnÁX` c8I4iHd=4aWa=O$NF1glv/j>iD]qLҒIsl~kh8b&3-FD-s5`"!o?N<#AI H;!Ll agt50^)p" 3GDP"aPh+Kx8Y}`\a͆7OEUITr! DmpoGڿcC4MTGi=@^թ:ݜ R>aNďpS.N A*'6K}ʛ܅EܕwgZ" "Dx!OC zw%9&yu9VԶS=Z4)׮Vfm|XgP{19r!-suk^-/RML\aY4NDiQ|^X(nн͌_&OFAD\ 3( @kzy=uQ63ע /.JtU4kATӯhB)) 32Ý# Kԣ=05iUZ+~)/*CAH%* ne)C&09YN0Y4͏cbk \ O]n6m~sO]~0H.\ө+ "e> !;=}򔗧)np[8諝1LE#Q1)(e\Ucr\#`{I5O^DՂٰp)Z^,UjbTo=>ljV S#!҄{ 8$e]3@& )V&%D.J@ )KuR& LxI®u1IZ2orD}wEbҖ#N" Jpf.J š/(VgįA@o1s*c }h3!R Te4>(&D|X>m|yunw uYJ'q9:S]YBzqF9 \0Ť.?|De΀)i!}Xn!IPOL-m^B+F TX_k|G 4؅[}SݠXavd?>|_|3!oI4 I:~cxyz9 Nkpf5! IH/FokOM7u.Ϧb6Y"=`V(:/+KPJ9I׭xMFp?7p4]*ķ9m?83c` >=Nin?Jͳ}ktN'2[nQZp:AfwALфa.| fGoU$T>xe*c^  O$hEG`]ޢ 8{xFTRyp-8-?\|&V f%cn|&v*@zc.Rv:#djr #sxwn!BYIY8kNpGVS/sT*e;ogeNeH|>._}Nm6YOUǢ_9;^X-5|Lƾ';glD-k񧍲}x,ha#enK:Y'^x5w"&ehKGю݄5"$)*Ed$+d(]L뷮Z`5@T+_Ӵdbʳ9O3[ z ?I|Hy-z`lB"2VF5;+cE<`Yy:OJ.xwL\\c4 Ge]N! .0Lp#K!;'ɢI'b%Lϼ0ۻ vĪ'}Ttz s҇*⹸׆'%`:fQJd~b1-W/N|Gz_z-RtX#bnsd ,["SB&@Sp|ʞEa1ɬF6q'2wd-41F71go?'"%YXB Ϣ';f-^y\`x ή:ľO< ģ{0ev`? )dXz|b]&C=;m:{~82O: a wZ%:=j@x X1o޺~Oo~vy<G5T)ks_4>_/ X30pD'UCZК2̬pGb4`<߄]̀Ml0$FM{eשCSiwO>]blQS;BG;* h}$*ƿK)de-cMc";E?~>Ә\RsEdrBe-!Gof_QU``bpbbސfx5[Xll>Z|iT G_|WΏƻ9"n1 ~L#" ԓ.FMxET>}isf:GhvИM3(Xj鏪DˊMqYdg;ndc:qV>H5r,6`YEJau%Ѣ37tՙ|,}D\J&D9LfSؿ'q6dN,BAhM<+RhkS:HQ/y) Z3΍S,S|%⚀q'A-#yZlCnlqE:&U hnuspFC<JpbCq5OQJxKS$۽'lj;| H=:YjfVW>u0]IFZſQӐ0N( \ XŀXf񦋿;^E ݖq`@JEK<$0)k^D\-{BIXgihaAVf œorOy% WSYhQJdM ZX Z:I/^|s7ߒ Hp 4 0c5_U d䢫]sYXmfgW$5 *^0<¥ORϊAM1 ލ__$Q2_ଈqn`Bk@öHDs,) YޙTsZm3(9L,q:|<;J~NUNئ|T0̦?>-t9֨AHQTnVuҘTۉ7Se/%憱Dp Do&A"o11Ȱaj4/ SXODZw;v.T) 8n pirpwpΆ 6;w?5^XC8Ð~ \zSphTf#loz[YAec{% ܉ o$K)]>1éގ=Wj^?Ù{NWY!V*5յ;𐞇 \g1ݳn|d? }.@/񱧔;1P|?#=ٓL s#>X1Cg ϾV$ f(2ȒYZfmHsnD ¹rës]1 y=sXP+d[4BVCv⇗,l)=݂ '!)h&1wDĀY8sm`2YOvj/; Agd#B2^É{-@W2yj)}ʲ!FͳPKLJKT¦# ,*!"ff;[/D[0]zJ֩eLnBn܉\mDY9S&.ˮN9%T Gftk(JrFZz1lb6 h%tBT s6 $e3/\ YQ |W.AN8pO _ W5LT]L@upc0&HQNY0DYvШ!*úfB7Qa&AB) BWvΈ3=a^wIdralLPgqAI!D젵Aw붉݆$0<#;ODg%CB6w)>h|p(P[7&Xd *,FA[QpM}PYD?E M߳o4A!ǑG^(r~Sy v`{Q7ٕA{WDbs?,\+!rRρI:#NšʖW3a!ܥ\R7RlD^ D` X@)7$H#sz45ҿat?6M!M~>ixͿeDpdgDD&T`CL{IqAoة¯k3o2p¦&B0a2VV\[섅Bps)>UKAaY8o8lư˜9kT;SFN\%f $< pm7H7Di( ++#}wIc$i%@\R }_PT\@t]H4M}W7j^̫tʑ?Dl&N76-Ax%𻠣3_5I F%RGez&n&u 0 ;YcN?sg;|8meI_ZAb]N?3-<4"Ε/7Y ZmV'WtYw*5V0_$lв[[ئI/ҩ&TbX~*1,s d9g M|E/( Ia(t\->)e;?O-I01$%+kd[ Vabj&2Y0?$/G-d[a_%_2ul -j٫g/\ l dUOIC: AJ5{?iL0y8?%CdbOL$CeS좥/i{ S miiCŧ؈.&?F[!I^cl p34zSJ[N=~Zp\R`(RNSo[Zp-q-r[ - S É"1gK9"a6̢͊۬BY{cOP;8 ~]@I@cBh__ܹ;g'a4C|˾'MPLBD(Dhݹ9 iߕE /~dݝ̗ႝ}gxN4$s?&K`3LOu ^6'"+dpeOi)21·;ipy?~TJ .O]=oYA3ìb"E w/E>Bh%H.3勧ea9԰yKUCKlí㩙m:5,[ Lj|8G7ȼ4v {jOb$9\;f71.|Q2?bßc=#oPrH\e.\Gd[#JPq(n@Ǐ‡EUrhaeJD&aNS#2g8g|!0B,?iG|&G'% p΢zx dY<ւ}p i&j# ͓*ཀྵ@2T53fVjicx\CzF0&\Ozlightproof-1.5+git20140515/.git/objects/2f/0000755000175000017500000000000012335137464016412 5ustar renerenelightproof-1.5+git20140515/.git/objects/2f/96c1f1c126bd962638f6825f8965f074a99c890000444000175000017500000000102712335137464023315 0ustar renerenex+)JMU057e040031QK,L/Je8ooQml̫|8" ? ϝ}Yl/En3B&LIFb^zO~: \gh˰H*rLO+d߳,yի>"E2Z{@dg私xsb=_?*lW^Y\W\NIz?L'jb !~n _1tƼzws_755۸#>⩔d >XK]Mժ˵oC MN_NWe>PPYWXt#9zƩ/J66kz QT\j;:IT"n:v 1݂pN.sSA{ y z6c%4)2&˞d⌍Jd]'B0{ i5Jsm~-L}B~,#uz^@TVGVj)E3x, 8֡2deM7jq\Sy@8r#~Talightproof-1.5+git20140515/.git/objects/cf/0000755000175000017500000000000012335137464016473 5ustar renerenelightproof-1.5+git20140515/.git/objects/cf/0031f970e374548ad98b449981c8e4b27d10630000444000175000017500000000024612335137464023263 0ustar renerenex+)JMU043b01Ԣ"GG8>{9o^]Q DMjJfI~/|)/aB=y<YYEΜY4g˗.(e0 ,|g:39aBtBJBeklwd+dJiDlightproof-1.5+git20140515/.git/objects/8f/0000755000175000017500000000000012335137464016420 5ustar renerenelightproof-1.5+git20140515/.git/objects/8f/c61cd1d9918dde3efa18dbf123844ef982ff440000444000175000017500000000414612335137464024017 0ustar renerenexYmo8\+ol6/Ţ5vۤ A Yl]eJ&{ NzpE-/o߾]1?f؇C>!Q"͂%eA2N{Z=z q-*,mO܇"ז$ Sܜ[o}ezFHl>Ods",sBq 3"hvŰ1kKD#tIr B y4搛ě;dVR: 9<5q90K&2U"!slrOgG(%c{roZ,gLoU(nf2i _ |@͈߰|gҖK>2X UCOP4f2huFhd-ʌ ^#kJ3C鴾qJl1QU?-j@+j CI8!fdz yGm yI4lKL4YVg7uP"٫x'GY%ϦYUPG X`KXP[;K}QQu]mAwFby`ggd'0 =oRS>ʶAoR'үvh_´/BKj^{RCڣ٣ս 2> /S_of09Eˡ'5 ݠF)+rY.EV"8QND:@cBGMڄUw&xL@ -c~8A3zƬUuXJcGCjO,Z4imy0ypjql L1k)#,Ma>`׿~y]L>񄽮YEro+,Q tL@mv'0,፬E!1LP!w8 _uӷ|i=;S;jg^a@lw p8z&wP7ٿؑ)NB Ɂں)I.,eaqVu궒TuuEذQ_GteUn6UNR (hOZ9# ^qӽx`2Z:jDK\Ʊ$ghf۶?w* 2~,<~ 6mOfP>t{Z9D»a^gOP0UVHu; ;!qxHRZ*œuV4)@B/ Тn4ZUI\L+A ϣ[^3`hG2^b=Ślj|Ȃ[-~?%m̚GV>vb-Ǜ@ iA NZ-)]kIt|;;^Fy>! [VwwXׁcז^ހ2Tv 7uB,=Z U yF'yGOR']% TL~|2]뭠 K:''k"`lޠZ,W~ooe] @W N'R({d}F}C_HҳDbC~*d[cڽVwAd<)J[~ t,eg9T%ؕn+cN#p% /姅B_[A{MҤmkJ(/頼>7vEަQfj{ωM u8IN;;Y_wwiNKD  bvNn-plightproof-1.5+git20140515/.git/objects/8f/e021ec3098281a4c0db87040623c58af8d127c0000444000175000017500000000103012335137464023365 0ustar renerenex+)JMU057e040031QK,L/Je8ooQml̫|8" ? ϝ}Yl/En3B&LIFb^zO~:9n߿N_X]s֒ӷ{ZM @5Qύ3ΘW/q.{9o^]Q DMjJfI~/|)/aB=y<YYEΜY4g˗.(e}dоkPm-?n]2p yHClightproof-1.5+git20140515/.git/objects/2d/085964b4af28baf0fa576c02538c64b82d590b0000444000175000017500000000027612335137464023470 0ustar renerenexU 0D=+ /Qx)k&IS6UD8켙q7L' Wad۳0.GC+NKjvh-2 y ^*L`E6d)(34Qж6k誌6B=ڶM _t=cq\7G$Rq%Qlightproof-1.5+git20140515/.git/objects/2d/21272df907e55980de2b9037d9ab7378c0d1310000444000175000017500000000632112335137464023327 0ustar renerenexYrgP?Ĝ$-miNN5K`I"!ufW ,@[n#50)bqw35O'Ǔh|?ܧ*^\K ɟ*|.v":ؕ*`x@ҖԂJR.4.,ŪXKmR,K*uG2K͊DWU:*2ivvA4DKyf bjU8jeZ-䐎tJM/U!$Uj6 B _(MbExUihvL2RV֖Ѩy&+>Ƃ% #rgZQi, ~RFiUѣ?G GM+gd?hwH/XBdF"Ljӵ42+oH .NQ ʩ ,c))*2%٤Bov.^1ZrͶ¤>a4GKilLֲ ç\;}9Hl*:&)uHB}HGS8ئ팕"a΃]5K㵣ȬMLY. Jd=xM)+ŅR Xp>Lp1{cB8Wkz)grReIW_#㑮^9aمbj8kF~0'!9|~°Rgi?9-` Hlh! ?z/h.#z&Q#}ǎ{?HhmR݀񱍬2-E,Zŗ:EIId)*N_==z|lv4~Rޅ ;E@fEeQB n%\kOUN;X2"tF0FTZUU6wfwҔ8Wty.7MA.݋*˚0]q"/L0!b̈́JU(s9;^JR {eUَu&p _ۑ ttk #>{(Dp,P9*SZf?־lIG.m.W!<ˡ># h-3U:n' 81f\"e7w*\+sxՂ n.Ql x'y9VS _r:o5@Xts,8Ue&Z8.\DY@%HA$\SRkK?M5Y( j -Fws ڗH'*g\PQuG; iS @{0\j7b8tw&/cQP4U"<Ս Q9ٳ#_G y`QNXѳv֫6LApDhs)!t5ZɬTd)cl)TPMa[ڦoA IՈ}mW7x)M-,6J=2:# } eCuLY8;~hv4oW9B 0xQ ˍ& PfbɺRvAw!N)]khà`g#Q=i|dxST!*@νeN_ǻ^08ǽꆝ9$goʻ Ȱ*Zxġn U]Nߺ Cz7%=Pb?0mQAHve!ag&$a c]3XYsH`9w-di.dC_~@瓕ɢ{qkoѤˎxO,FHt hrwdR4-tp8Վa͠˹*$w^w"s?FBTaynm{G5M= -v@v,aGխoSq%SѬ*}s01ҢQB֦Z% J]L1g\]|2Vs.GĂ(FD8. ݀ѹ(1W[>_2rAFɜ~:$ _nȣrUa6',>>VhΉXS5q ~G>9_Ej4u }p%J\)=*!890f ^ނ@ #1uy ̢NZxKA{7ZcYb"j[$%p>p%y|+6}7k:Z+$gU&k H6;[w80ǻָ 9cܵ3woE.ba e3xsy]yP >,P , uqvϷ;8.e‹bF{?T͠_)pBmã=fbg7B+0ɫ |/.n8C|.+U!u OY'˜"4A4e.ҬFKԲ,4S]r#K|TlP.m\kQwaZ`6w*1wx\[P_@ZR2Q 4 ' t@p]|VQh g\#:p\ ;ͽ HzzDʋm}Lo?H2pvglightproof-1.5+git20140515/.git/objects/00/0000755000175000017500000000000012335137464016322 5ustar renerenelightproof-1.5+git20140515/.git/objects/00/1c6be032b1d5c734d8eb7e1b2e93f00f92b5640000444000175000017500000000024512335137464023523 0ustar renerenex+)JMU043b01Ԣ"GG8>{9o^]Q DMjJfI~/|)/aB=y< L byD"Q`x%wsqw'_^/* eЖ}~%Y Y* -Blightproof-1.5+git20140515/.git/objects/00/cdddb56d7b1c5593966a80ef7cd9af3eaa7dad0000444000175000017500000000621612335137464024213 0ustar renerenexYnmD S.MJRQ۩]0ryj^ t* H93\1L  9:z|tn 퇽#:.ya zWʹГD?&@gVNQDb*'ů%ʋr4&g:+rMXNV"./ J'.XOrk#NrZ(Kly|8Et FIyfDg4Z$1_k,)tN_e4$%5Vu6Y:3f[Ry%1v8IǴPߔ(4IV^A&($yra!zz.ճ> cmHWxB4N l'}48ɉ 8%l^YYaxbY\o' މ3ߏFщltbxQlˋ,R4PF]fi (O3c=/Gx͌wt9xlz&rƤ gq#p8:hykvr=:}?>S{ctpd%{y?}^Q/8?-_ا#,VDߥ6768Tg;|'*N9Rʴ~s\3 g.T&p_>Vaڍ{$M$0:,7$ uW+i%sm^9}! %ZDxv Y= {0g $F w'O &a(Φ1 l+Q (M49 IAD|ZnYg7"KQ˜l \a'9_o>V-# ҳu;Ѽ<e*B*>%9,O4* Qb`S\ HU֞drsi|۪ʵY2| g!7HNda;o4êf^Qyio o H\qCK@F@RU=رQ,ܮo1ù:,{ƃb2iwr21iy@8%+R%JRRtL@OigUвZU&vPB>7E>j![!p`:)e^eaBvF%k.-ܗ i`V[Z'y,L{"  1KXC|ŋ%o@V@,H k;f{.#P# +^ Zs/M8#isPNp@pa\?$/\YD\ )rA=7 ceH!狡q- ;pym9#ZϱbO ~L\-xDzR^KU[i_x?!y ON{pӺ md /U]'RYc(˦B%'K.~}/@AI:3,~N>@% Qy]?e@#n.r*s|&h. -f aWF:I*A`]蒹\Qi𚋰6sm_0>W`s%Sn@D+z¢*ݾ'Lav]Uy@ŷ?t@+RAɅ_Gm[l-j*{2p2;Z9GOFME}pMXȱsmsnX^s|Ur NX@)P<2ME# l4O#&n;f=QE; o+~)3gK74ً) PP@a8M &fXa+6^a3fZQ*yR[N;))wEQV\ b)dC^}*U2,yb/˾48 9*pRy4OB`0dR+.ݠRƋSԿYHϾy[΂)0>yBb~~!:W>Fq MՐH*$ 5aE4b ore06G.~߉|; 5+fb6RŦ`]0ԏYXh#27[8X@I_z8;$;P$? Sdht֙.cPWT359AÆ%o ۇwh9H~ T/qaP?w^&C Nn"*}:S: >,q$s[FpYA2π8p2~Kx O yWd}WN(faA #edЯ.p! D.Lg1Cɪ^T ^zDrhּ}L4L(v%(zSTI}!_g [bb,= rpPzf=Cy~G#`&}`,adGDlmӹ)$dM@EYGSȡM9f'6A1̳Iv&7LF߄& wݣbgu}9L1ͼXrTK,2*+V(KRb [|$G^XTؾEU8C8JJ:=PY%(S:O'rN&F8*m~dVꨉMeUȈEX4%6EJNmrueDU< á!rR@Wai֑OhYMz31@Ijb꺃EvF cC!;lJ\''V=$t6;;vIo4 ]ͼ҇e2Q}k "2 ƽRciHNi; vƣ(8סu2T2Zf3xǡvsH'ډ%`\ݙ-- IQ6/?ki?=`8"!UFZ܇v aEemnX#saʩXaV(+컥i L(W9M1X_Ly!0kˤ" ?.|˄Qgf-EAL K5\-P)`| KSf|oxqgVZPTbuPC^QQ$7b ߾l#Lсw5+\y; 5[nZEP.g1G(%S@o[49kHǮ'Ϟ;2K"}IټN$;nnibd uA 4^>'䔎G !/́V5^iob FDZ/A-;\Ncv"t; DF).#C mZ{r,5>vƁ5@[o@-+$dO.bwKxb7Yo 0tp~y݅kLɪ44D/1֖οZ "$\Lg1T^Ǵ { .u~H˝h`8gPQ༈N v=ν³xwZ8rmsX$;(X>=w׋x+*T"jjзҧ Qc;\= 똦;L=ijGggzXPRR)"l 6*߾zrD{N33mͻq ܿN}t\_^zvһt:]pq䆷+ݵH#8|d}*5c]Um0eGO+:>y WKnY@F׶-@;x}tTfMTI2~UvjߺF/ >lightproof-1.5+git20140515/.git/objects/f7/0000755000175000017500000000000012062702716016412 5ustar renerenelightproof-1.5+git20140515/.git/objects/f7/3efa9548202e0414377f4e15639af4eab172870000644000175000017500000000030412062702716023330 0ustar renerenexUj0sS책"ԧPYK"1+9Nzv GX?¢WPCKqe!CNSw&(.ϲ13n|ENS+jGa`z5m:aS4>3A8?۾X!5=˨ JRPlightproof-1.5+git20140515/.git/objects/0c/0000755000175000017500000000000012062702716016400 5ustar renerenelightproof-1.5+git20140515/.git/objects/0c/98d73e68782631f17f413a3a7451773dfd81970000644000175000017500000000026112062702716023210 0ustar renerenex 1@= I&D,@u+q-aӂwz]w0D̐ f k4%h=srj\c6֐:ʽ;=M q%9$_iJV|?/Xώe\.slu䍡`QkNisуY8 U7~Rlightproof-1.5+git20140515/.git/objects/a0/0000755000175000017500000000000012062702716016376 5ustar renerenelightproof-1.5+git20140515/.git/objects/a0/699beecaaac81815206be05550e6730f74da860000644000175000017500000000013612062702716023533 0ustar renerenexKOR0dPVUHKOKR qӵq*ǧ+d(eզd%sd&+*T$$rqlightproof-1.5+git20140515/.git/objects/11/0000755000175000017500000000000012062702716016317 5ustar renerenelightproof-1.5+git20140515/.git/objects/11/afeab8ba93cbc9cb20d84d6a699a4af842a8a60000644000175000017500000000373412062702716024123 0ustar renerenexY[s۶>(}:j^4I=Ğ(iQ5%P$c~ Zd?Taww|nS}˾oOT^&j5f?> $Yh0,Z4,÷F^qI&Ԓ]gRW 秧?0L5{'7XP(*7`X *cf|yq{ MMJGtY4ft>b.Al2k[LnJl߬H22}yUkGzJuY#yx^SL"k?P4KӴ r9U?$e^ňMJmjը3 ubDSNm^%yx@3ycdŒ%Xk^ 00lhAT+h>YH2A%t Yocs,p<*.eD%b\E}+*g #CGcC=b8bt%\!QrEFj[r3=x[<`njݩY)䞧Z58b.gUg͛j( mB fIDCvZ1dNl-tV2;e\gڕV4>{O6|%G#a˲7aJW*V(q>Ay&Ӵn쏆zkw@բͨHpwfMiƗHczis ;|k?FFdmn)/lJ2(r.{=amA.ן9/iW&Xу]ˡܖzT& öH*ʬZUj#&ܛgIz{MZ7.ć K]\ԓ54/-|DoҼu'ӯZrӾ иM'_;=}IXݫ$Stt1x 7߈) GqOӀ iZP&TKKc0 W܋@nG)"| [Ŝb ojmxn]ƌH pS[G܁lu"@4qo"(rk+!x_|kH_EZUAmJxĨw0]ZH9]ck6({q۵jnWhc.{s,K;+a#vm`ߙ2 <`_[Sb'xTG $@p{G&KݼP0U jOm֝qxHtT9o @k)={XĐlň{1' cvy'-bNKoX(qx3_k'RgO s'EH)V3ڵ՟qlNqozc'AUԴtG7T:R}IVL9TQ,0K7F:e 1w uF.Ю !uiU o } Pү.PH)O[o\#uj;^NfV۲d{ZӽB8թ1 [ٶ'G@-W %kC y7ds۟tYXڿR(cJi#T.`˵#ޗ N XG;F沸jfo nفNKuOYʤmk*W_)`螥bsr\vB嘆>sdݽ8ۃKu}ȯl͂0YΧ:w{9o^]Q DMjJfI~/|)/aB=y<YYEΜY4g˗.(e!GiIO,)-+Z[2h>lp, VW,Elightproof-1.5+git20140515/.git/objects/17/0000755000175000017500000000000012335137464016332 5ustar renerenelightproof-1.5+git20140515/.git/objects/17/bbd1c981c7558e50c84bc0e2ced0bab7c6f0090000644000175000017500000000027412062702716023751 0ustar renerenex+)JMU020f040031QpHKOOgx;3gM<1ߝ=-(5>'3=(??->4#T!golaĸ ꡠ"b^'<˫E(RK%,:ny݄s_̖ĿT*IgPs"5 Zxf9 Nlightproof-1.5+git20140515/.git/objects/17/33571a8cd532e7d1270bc13950a8c79516ed090000444000175000017500000000102712335137464023242 0ustar renerenex+)JMU057e040031QK,L/Je8ooQml̫|8" ? ϝ}Yl/En3B&LIFb^zO~: \gh˰H*rLO+d߳,yի>"E2Z{@dg私xsb=_?*lW^Y\W\NIz?L'jb !~n _1tƼzws_755۸#>⩔d >XK]Mժ˵oC MN_NWe>PPYWXt#9zƩ/J66kz QT\pg㒐.3OHA|qWph'b2y1qM fcmިAtsHq`4NEb~PY<9K, ;21)-%zHWP: J(()s,.DHJ*#B*#%Ή!X tBBju;>veQz p'#q \9 ?(V޵|am:х(|&*&~ˆDfF: W1[6+1&NS_n,Rf S *vPI9HrjKOUx{EBlzPR*RP;y*Lxs4Gy#wi0O[]@t=e |IxzmlHEe?p823:njȒNBTP(W (~n-q8HnEKٷ}8/nw&*\O STy$k-ut׿YG-#7 n)`O>[gIBX3'`9=KĦ3SK9={, 2aַr7REa!^/՛7 iKmzJx<83 zII"T{"6.,R|Ok8PB[MI(ߢw*H1>3d NPWO,'(TPMx3%B2XUhA!3mj dS4\֎\:~$9}|~wme;L/ J bZek5(cV-l3pT^WהvWX0'^B}V=@l$ӎAB*:Q5zFo|8LFA:+zJ (Pv0a6a'p]v=g0R4c^wH ɧZ%0<}M18?΢F ڎr!$όc]یC] FDZwX񎟺_-=t]h<*8S /dTΪt5!z74ηOPibWPrk i_OoP^IfkBCKN()S?ٵ>42BMt@M+j{Ej'hE@0!6e#ǾWgyzx0|hR=|l]D"q1o&9S:zbd_k"SA+W߸D燍N,xv֠],rJ?gfQxA.b dPjPW y2icesS!Sihs،"`>o5vk=5c!xW}|DЩPGY3ZHFmy0K1p\z:SW}sp2}ep0v}D,W Dc1%47;E~םhJlׂ:&y0?zg֮%`20=2,E-E1S̠`g(\,'ٵ&;_!~eO,Y! ݸttZ aI9_+M* ?k2Q7ݍ*<1Uo* [jcGr='M/)lj٥lightproof-1.5+git20140515/.git/objects/64/0000755000175000017500000000000012062702716016327 5ustar renerenelightproof-1.5+git20140515/.git/objects/64/2d9a6a726fe2cccca29cacb1d8ff77a79b71f10000644000175000017500000000023012062702716024121 0ustar renerenex+)JMU045a040031QrutuL()(OO+(ap>)Bzs5N̈́HNKgHTr?u#ND Lightproof.pySt(3PG T_}CCjsۍ Linguistic.xcuSt(13͋PG B:ң .DuwMETA-INF/manifest.xmlSt(3PG T xwqw9}JصNEWSSt5St5 T[croa READMESt(Ʊf?mdescription.xmlSt(0ċPH B:4J,5[7doc/dialog.txtSt(0ċPH B:  m@erz`).doc/manual.txtSt(0ċPH B:$T( Z-B 3w\c&doc/syntax.txtSt5St5 Tl|H{7]t.жM7make.pySt(".PH T⛲CK)wZSpythonpath/__init__.pySt( `P_R TQiʪ kUPstچ%pythonpath/lightproof___implname__.pySt(".P_R T";F4N,-pythonpath/lightproof_compile___implname__.pySt( `PH T>Z(Cr ma#c-pythonpath/lightproof_handler___implname__.pySt( `P_R TH -.B sݧt*pythonpath/lightproof_impl___implname__.pySt(0ċPH @DU^NG%//src/converter/xml2reexp.pySt(0ċPH @D z Kk_ w|usrc/editor/Addons.xcuSt(0ċPH @DlPCS JIa src/editor/META-INF/manifest.xmlSt(0|PH @D"Icco0+9V!"src/editor/Office/Accelerators.xcuSt(0|PH @Dy`e|d>: =EX/src/editor/Office/UI/StartModuleWindowState.xcuSt(0|PH @DnV_x+_*src/editor/Office/UI/WriterWindowState.xcuSt(0ċPH @D %1&a`9Dynasrc/editor/READMESt(0PH @D!E<WT`xSXsrc/editor/editor.cfgSt(0|PH @DK{U=s/qsrc/editor/editor.datSt(0?PH @D*XRCSpsrc/editor/icons/comp.pngSt(0|PH @D4ߥ`Y2V Hsrc/editor/icons/comp16.pngSt(0PH @Dr:r1ίIppkXHsrc/editor/icons/compall.pngSt(0|PH @D3oӞgJ] P}esrc/editor/icons/compall16.pngSt(/KPH @Dх;PMVjҗZz)jUsrc/editor/icons/debug.pngSt(0PH @Dp, j _ce src/editor/icons/debug16.pngSt(0ċPH @D=HxfEc%w#-(src/editor/lightproof_editor/General.xbaSt(0ċPH @D⛲CK)wZS+src/editor/lightproof_editor/RegisteredFlagSt(0ċPH @D:}:Ip̍¦ȲS~t'src/editor/lightproof_editor/dialog.xlbSt(0ċPH @Deh6Hz1 ‚bߵ'src/editor/lightproof_editor/script.xlbSt(/|PH @DCP!'|isrc/en/README_lightproof_en.txtSt(/KP_R @Dai"Du֮h src/en/en.cfgSt5St5 @DCJW0荧z※8 src/en/en.datSt(/|PH @D5.*BPiz+ src/en/en.dlgSt5St5 @DNڤ sUWVy.!src/hu_HU/ChangeLogSt(0ċPH @DlOv,kl&V %src/hu_HU/README_lightproof_hu_HU.txtSt5St5 @D-Yd(WlSd-Y src/hu_HU/hu_HU.cfgSt5St5 @D y$S/=QgWsrc/hu_HU/hu_HU.datSt(0ċPH @Dh"[NvV Cʉsrc/hu_HU/hu_HU.dlgSt(.XPH @Dm}3pTX[ iU8src/ru_RU/ChangeLogSt(.XPH @D}ʤ^$bK~[%src/ru_RU/README_lightproof_ru_RU.txtSt(.XPH @DTĔC``;&E+[src/ru_RU/ru_RU.cfgSt(.XPH @D.,Ћz4xsrc/ru_RU/ru_RU.datSt(.XPH @D ggU N߆M[7src/ru_RU/ru_RU.dlg%AC#6lightproof-1.5+git20140515/.git/HEAD0000644000175000017500000000002712335137465015076 0ustar renereneref: refs/heads/master lightproof-1.5+git20140515/.git/description0000644000175000017500000000011112054114474016703 0ustar renereneUnnamed repository; edit this file 'description' to name the repository. lightproof-1.5+git20140515/.git/ORIG_HEAD0000644000175000017500000000005112335137465015713 0ustar renerene0c98d73e68782631f17f413a3a7451773dfd8197 lightproof-1.5+git20140515/.git/packed-refs0000644000175000017500000000013612054114507016550 0ustar renerene# pack-refs with: peeled e53961f0481c7e1d11d9f92ef9eb7a6fe17405b7 refs/remotes/origin/master lightproof-1.5+git20140515/.git/hooks/0000755000175000017500000000000012054114474015567 5ustar renerenelightproof-1.5+git20140515/.git/hooks/pre-applypatch.sample0000755000175000017500000000061612054114474021731 0ustar renerene#!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, rename this file to "pre-applypatch". . git-sh-setup test -x "$GIT_DIR/hooks/pre-commit" && exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} : lightproof-1.5+git20140515/.git/hooks/post-update.sample0000755000175000017500000000027512054114474021246 0ustar renerene#!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, rename this file to "post-update". exec git update-server-info lightproof-1.5+git20140515/.git/hooks/update.sample0000755000175000017500000000703312054114474020262 0ustar renerene#!/bin/sh # # An example hook script to blocks unannotated tags from entering. # Called by "git receive-pack" with arguments: refname sha1-old sha1-new # # To enable this hook, rename this file to "update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowmodifytag # This boolean sets whether a tag may be modified after creation. By default # it won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # hooks.denycreatebranch # This boolean sets whether remotely creating branches will be denied # in the repository. By default this is allowed. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) denycreatebranch=$(git config --bool hooks.denycreatebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) allowmodifytag=$(git config --bool hooks.allowmodifytag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") case "$projectdesc" in "Unnamed repository"* | "") echo "*** Project description file hasn't been set" >&2 exit 1 ;; esac # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then newrev_type=delete else newrev_type=$(git cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 then echo "*** Tag '$refname' already exists." >&2 echo "*** Modifying a tag is not allowed in this repository." >&2 exit 1 fi ;; refs/heads/*,commit) # branch if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then echo "*** Creating a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 lightproof-1.5+git20140515/.git/hooks/prepare-commit-msg.sample0000755000175000017500000000232712054114474022511 0ustar renerene#!/bin/sh # # An example hook script to prepare the commit log message. # Called by "git commit" with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, rename this file to "prepare-commit-msg". # This hook includes three examples. The first comments out the # "Conflicts:" part of a merge commit. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. case "$2,$3" in merge,) /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; # ,|template,) # /usr/bin/perl -i.bak -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$1" ;; *) ;; esac # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" lightproof-1.5+git20140515/.git/hooks/pre-commit.sample0000755000175000017500000000325012054114474021051 0ustar renerene#!/bin/sh # # An example hook script to verify what is about to be committed. # Called by "git commit" with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, rename this file to "pre-commit". if git rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi # If you want to allow non-ascii filenames set this variable to true. allownonascii=$(git config hooks.allownonascii) # Redirect output to stderr. exec 1>&2 # Cross platform projects tend to avoid non-ascii filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it's # even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 then echo "Error: Attempt to add a non-ascii file name." echo echo "This can cause problems if you want to work" echo "with people on other platforms." echo echo "To be portable it is advisable to rename the file ..." echo echo "If you know what you are doing you can disable this" echo "check using:" echo echo " git config hooks.allownonascii true" echo exit 1 fi # If there are whitespace errors, print the offending file names and fail. exec git diff-index --check --cached $against -- lightproof-1.5+git20140515/.git/hooks/commit-msg.sample0000755000175000017500000000160012054114474021046 0ustar renerene#!/bin/sh # # An example hook script to check the commit log message. # Called by "git commit" with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, rename this file to "commit-msg". # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } lightproof-1.5+git20140515/.git/hooks/applypatch-msg.sample0000755000175000017500000000070412054114474021727 0ustar renerene#!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, rename this file to "applypatch-msg". . git-sh-setup test -x "$GIT_DIR/hooks/commit-msg" && exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} : lightproof-1.5+git20140515/.git/hooks/pre-rebase.sample0000755000175000017500000001144212054114474021024 0ustar renerene#!/bin/sh # # Copyright (c) 2006, 2008 Junio C Hamano # # The "pre-rebase" hook is run just before "git rebase" starts doing # its job, and can prevent the command from running by exiting with # non-zero status. # # The hook is called with the following parameters: # # $1 -- the upstream the series was forked from. # $2 -- the branch being rebased (or empty when rebasing the current branch). # # This sample shows how to prevent topic branches that are already # merged to 'next' branch from getting rebased, because allowing it # would result in rebasing already published history. publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` || exit 0 ;# we do not interrupt rebasing detached HEAD fi case "$topic" in refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Does the topic really exist? git show-ref -q "$topic" || { echo >&2 "No such branch $topic" exit 1 } # Is topic fully merged to master? not_in_master=`git rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up-to-date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` /usr/bin/perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi <<\DOC_END This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git rev-list ^master ^topic next git rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git rev-list master..topic if this is empty, it is fully merged to "master". DOC_END lightproof-1.5+git20140515/.git/logs/0000755000175000017500000000000012054114507015405 5ustar renerenelightproof-1.5+git20140515/.git/logs/refs/0000755000175000017500000000000012054114507016344 5ustar renerenelightproof-1.5+git20140515/.git/logs/refs/remotes/0000755000175000017500000000000012054114507020022 5ustar renerenelightproof-1.5+git20140515/.git/logs/refs/remotes/origin/0000755000175000017500000000000012062702716021315 5ustar renerenelightproof-1.5+git20140515/.git/logs/refs/remotes/origin/master0000644000175000017500000000047012335137464022541 0ustar renerenee53961f0481c7e1d11d9f92ef9eb7a6fe17405b7 0c98d73e68782631f17f413a3a7451773dfd8197 Rene Engelhard 1355515342 +0100 pull: fast-forward 0c98d73e68782631f17f413a3a7451773dfd8197 28e50957d99a0773690f4d3663c544bfb61c54dc Rene Engelhard 1400160052 +0200 pull -r: fast-forward lightproof-1.5+git20140515/.git/logs/refs/remotes/origin/HEAD0000644000175000017500000000030512054114507021733 0ustar renerene0000000000000000000000000000000000000000 e53961f0481c7e1d11d9f92ef9eb7a6fe17405b7 Rene Engelhard 1353750855 +0100 clone: from ssh://git.freedesktop.org/git/libreoffice/lightproof lightproof-1.5+git20140515/.git/logs/refs/heads/0000755000175000017500000000000012054114507017430 5ustar renerenelightproof-1.5+git20140515/.git/logs/refs/heads/master0000644000175000017500000000171312335137465020662 0ustar renerene0000000000000000000000000000000000000000 e53961f0481c7e1d11d9f92ef9eb7a6fe17405b7 Rene Engelhard 1353750855 +0100 clone: from ssh://git.freedesktop.org/git/libreoffice/lightproof e53961f0481c7e1d11d9f92ef9eb7a6fe17405b7 0c98d73e68782631f17f413a3a7451773dfd8197 Rene Engelhard 1355515343 +0100 pull: Fast-forward 0c98d73e68782631f17f413a3a7451773dfd8197 e53961f0481c7e1d11d9f92ef9eb7a6fe17405b7 Rene Engelhard 1355515895 +0100 reset: moving to e53961f0481c7e1d11d9f92ef9eb7a6fe17405b7 e53961f0481c7e1d11d9f92ef9eb7a6fe17405b7 0c98d73e68782631f17f413a3a7451773dfd8197 Rene Engelhard 1358258002 +0100 rebase finished: refs/heads/master onto 0c98d73e68782631f17f413a3a7451773dfd8197 0c98d73e68782631f17f413a3a7451773dfd8197 28e50957d99a0773690f4d3663c544bfb61c54dc Rene Engelhard 1400160053 +0200 rebase finished: refs/heads/master onto 28e50957d99a0773690f4d3663c544bfb61c54dc lightproof-1.5+git20140515/.git/logs/HEAD0000644000175000017500000000331012335137465016040 0ustar renerene0000000000000000000000000000000000000000 e53961f0481c7e1d11d9f92ef9eb7a6fe17405b7 Rene Engelhard 1353750855 +0100 clone: from ssh://git.freedesktop.org/git/libreoffice/lightproof e53961f0481c7e1d11d9f92ef9eb7a6fe17405b7 0c98d73e68782631f17f413a3a7451773dfd8197 Rene Engelhard 1355515343 +0100 pull: Fast-forward 0c98d73e68782631f17f413a3a7451773dfd8197 70d8c24a37f6b2ef325d2ba1d69cefff1acfb18c Rene Engelhard 1355515637 +0100 checkout: moving from master to 70d8c24a37f6b2ef325d2ba1d69cefff1acfb18c 70d8c24a37f6b2ef325d2ba1d69cefff1acfb18c 0c98d73e68782631f17f413a3a7451773dfd8197 Rene Engelhard 1355515864 +0100 checkout: moving from 70d8c24a37f6b2ef325d2ba1d69cefff1acfb18c to master 0c98d73e68782631f17f413a3a7451773dfd8197 e53961f0481c7e1d11d9f92ef9eb7a6fe17405b7 Rene Engelhard 1355515895 +0100 reset: moving to e53961f0481c7e1d11d9f92ef9eb7a6fe17405b7 e53961f0481c7e1d11d9f92ef9eb7a6fe17405b7 0c98d73e68782631f17f413a3a7451773dfd8197 Rene Engelhard 1358258002 +0100 checkout: moving from master to 0c98d73e68782631f17f413a3a7451773dfd8197^0 0c98d73e68782631f17f413a3a7451773dfd8197 0c98d73e68782631f17f413a3a7451773dfd8197 Rene Engelhard 1358258002 +0100 rebase finished: returning to refs/heads/master 0c98d73e68782631f17f413a3a7451773dfd8197 28e50957d99a0773690f4d3663c544bfb61c54dc Rene Engelhard 1400160053 +0200 checkout: moving from master to 28e50957d99a0773690f4d3663c544bfb61c54dc^0 28e50957d99a0773690f4d3663c544bfb61c54dc 28e50957d99a0773690f4d3663c544bfb61c54dc Rene Engelhard 1400160053 +0200 rebase finished: returning to refs/heads/master lightproof-1.5+git20140515/.git/branches/0000755000175000017500000000000012054114474016231 5ustar renerenelightproof-1.5+git20140515/src/0000755000175000017500000000000012054114510014361 5ustar renerenelightproof-1.5+git20140515/src/ru_RU/0000755000175000017500000000000012054114510015415 5ustar renerenelightproof-1.5+git20140515/src/ru_RU/README_lightproof_ru_RU.txt0000644000175000017500000000033212054114510022462 0ustar renereneRussian grammar checker (developed by the Lightproof grammar checker extension generator, see http://launchpad.net/lightproof) 2009, 2011, 2012 (c) Yakov Reztsov , license: MPL 1.1 / GPL / LGPL lightproof-1.5+git20140515/src/ru_RU/ChangeLog0000644000175000017500000000027212054114510017170 0ustar renerene2012-08-21 Yakov Reztsov : - New grammar rules - Fix some rules 2012-02-04 Yakov Reztsov : - Update and rewrite rules - Update settings dialoglightproof-1.5+git20140515/src/ru_RU/ru_RU.dat0000644000175000017500000002737312054114510017157 0ustar renerene# Proofreading rules for Russian (by Yakov Reztsov 2009-2012) # test \bfoo\b -> bar # test # foo -> bar # punctuation " ([.?!,:;)”]($| ))" <- option("space") -> \1 # Лишний пробел перед знаком пунктуации. "([(“]) " <- option("space") -> \1 # Лишний пробел после знака пунктуации. # ( item ) -> (item) # definitions abc [a-zа-я]+ ABC [A-ZА-Я]+ Abc [a-zA-Zа-яА-Я]+ punct [?!,:;%‰‱˚“”‘„] abbr руб|коп|грн|тыс|ул|кв|пос|ст|пр|просп|ед|экз|тел|исп novvod авось|буквально|будто|вдобавок|вдруг|ведь|вот|даже|исключительно|именно|небось|приблизительно|примерно|притом|почти|поэтому|просто|решительно|словно|якобы|в довершение|в конечном счете|вряд ли|все-таки|как будто|как бы|как раз|к тому же|между тем|по предложению|по постановлению|по решению vvod итак|следовательно|во-первых|во-вторых|в-третьих|в-четвертых|в-пятых|пожалуйста|как нарочно|как исключение|как правило adv1 кто|что|где|зачем|кое {Abc}{punct}{Abc} <- option("space") -> {Abc}{punct} {Abc} # Пропущен пробел? {abc}[.]{ABC} <- option("space") -> {abc}. {ABC} # Пропущен пробел? # missing,space -> missing, space # missing.Space -> missing. Space # typography "[.]{3}" <- option("typographica") -> "…" # Символ троеточия. (\d+)x(\d+) <- option("typographica") -> \1×\2 # Знак умножения. "^[-—] " <- option("typographica") -> "– " # Заменить на тире (n-dash)? " [-—]([ ,;])" <- option("typographica") -> " –\1" # Заменить на тире (n-dash)? # 800x600 -> 800×600 # End... -> End… # A small - but reliable - example. -> A small – but reliable – example. "[,]{2}" <- option("comma") -> "," # Две запятые подряд. [ ]{abbr}[ ] <- option("abbreviation") -> " {abbr}. " # Точка после сокращений. (^|\b|{punct}|[.]) {2,3}(\b|$) <- option("space") -> "\1 " # Лишний пробел. # Extra space -> Extra space # " коп " -> " коп. " # quotation \"(\w[^\"“”]*[\w.?!,])\" <- option("quotation") -> «\1» # Кавычки. \B'(\w[^']*[\w.?!,])'\B <- option("quotation") -> ‘\1’ # Кавычки. # "The 'old' boy" -> «The ‘old’ boy» # apostrophe w \w* (?i){Abc}'{w} <- option("quotation") -> {Abc}’{w} # Апостроф. # o'clock -> o’clock # singers' voices -> singers’ voices # words # punctuation {abc}[ ]а[ ] <- option("comma") -> "{abc}, а " # Пропущена запятая перед а. {abc}[ ]но[ ] <- option("comma") -> "{abc}, но " # Пропущена запятая перед но. # nopunctuation "{abc}, {novvod}," <- option("comma") -> "{abc} {novvod}" # Слова, не являющиеся вводными. # думали, авось, -> думали авось # vvodpunctuation {abc} {vvod} <- option("comma") -> {abc}, {vvod}, # Слова, являющиеся вводными, выделяются запятыми. # дому следовательно -> дому, следовательно, # frequent mistakes \bложить\b <- option("common") -> класть # Общие ошибки \bляжь\b <- option("common") -> ляг # Общие ошибки \bехай\b <- option("common") -> поезжай # Общие ошибки \bихн{abc}\b <- option("common") -> их # Притяжательное местоимение не склоняется # common rules жы <- option("common") -> жи # Через "и" шы <- option("common") -> ши # Через "и" # жыр -> жир # multiword expressions \bнорд ост\b <- option("hyphen") -> норд-ост # Дефис? # норд ост -> норд-ост # Suggestions separated by new lines (\n) \bнорд вест\b <- option("hyphen") -> норд-вест # Дефис? # норд вест -> норд-вест # Suggestions separated by new lines (\n) \bзюйд ост\b <- option("hyphen") -> зюйд-ост # Дефис? # зюйд ост -> зюйд-ост # Suggestions separated by new lines (\n) \bзюйд вест\b <- option("hyphen") -> зюйд-вест # Дефис? # зюйд вест -> зюйд-вест # Suggestions separated by new lines (\n) \bсеверо западн{abc}\b <- option("hyphen") -> северо-западн{abc} # Дефис? # северо западный -> северо-западный # Suggestions separated by new lines (\n) \bюго западн{abc}\b <- option("hyphen") -> юго-западн{abc} # Дефис? # юго западный -> юго-западный # Suggestions separated by new lines (\n) \bсеверо восточн{abc}\b <- option("hyphen") -> северо-восточн{abc} # Дефис? # северо восточный -> северо-восточный # Suggestions separated by new lines (\n) \bюго восточн{abc}\b <- option("hyphen") -> юго-восточн{abc} # Дефис? # юго восточный -> юго-восточный # Suggestions separated by new lines (\n) \b{adv1} нибудь\b <- option("hyphen") -> {adv1}-нибудь # Дефис? # что нибудь -> что-нибудь # Suggestions separated by new lines (\n) \b{adv1} либо\b <- option("hyphen") -> {adv1}-либо # Дефис? # что либо -> что-либо # Suggestions separated by new lines (\n) \b{adv1} то\b <- option("hyphen") -> {adv1}-то # Дефис? # кто то -> кто-то # Suggestions separated by new lines (\n) \bточь в точь\b <- option("hyphen") -> точь-в-точь # Дефис? # точь в точь -> точь-в-точь # Suggestions separated by new lines (\n) \bиз за\b <- option("hyphen") -> из-за # Дефис? # из за -> из-за # Suggestions separated by new lines (\n) \bвсё таки\b <- option("hyphen") -> всё-таки # Дефис? # всё таки -> всё-таки # Suggestions separated by new lines (\n) \bкое кто\b <- option("hyphen") -> кое-кто # Дефис? # кое кто -> кое-кто # Suggestions separated by new lines (\n) \bкое что\b <- option("hyphen") -> кое-что # Дефис? # кое что -> кое-что # Suggestions separated by new lines (\n) \bво что бы то нe стало\b <- option("multiword") -> во что бы то ни стало # Имелось ввиду: \bво чтобы то нe стало\b <- option("multiword") -> во что бы то ни стало # Имелось ввиду: \bво чтобы то ни стало\b <- option("multiword") -> во что бы то ни стало # Имелось ввиду: \bтакже как и\b <- option("multiword") -> так же как и # Сложный союз. \bво избежании\b<- option("multiword") -> во избежание # Сложный предлог. \bравноправны друг другу\b<- option("multiword") -> равноправны друг c другом # Равноправны друг c другом. \bни кто иной как\b<- option("multiword") -> не кто иной, как # Оборот. \bни что иное как\b<- option("multiword") -> не что иное, как # Оборот. \bне кто иной как\b<- option("multiword") -> не кто иной, как # Оборот. \bне что иное как\b<- option("multiword") -> не что иное, как # Оборот. \bникто иной, не\b<- option("multiword") -> никто иной не # Оборот. \bничто иное, не\b<- option("multiword") -> ничто иное не # Оборот. \bнекто иной, не\b<- option("multiword") -> никто иной не # Оборот. \bнечто иное, не\b<- option("multiword") -> ничто иное не # Оборот. \bнекто иной не\b<- option("multiword") -> никто иной не # Оборот. \bнечто иное не\b<- option("multiword") -> ничто иное не # Оборот. \bне кто иной, не\b<- option("multiword") -> никто иной не # Оборот. \bне что иное, не\b<- option("multiword") -> ничто иное не # Оборот. \bне кто иной не\b<- option("multiword") -> никто иной не # Оборот. \bне что иное не\b<- option("multiword") -> ничто иное не # Оборот. \bникто иной, не\b<- option("multiword") -> никто иной не # Оборот. \bничто иное, не\b<- option("multiword") -> ничто иное не # Оборот. \bни кто иной, не\b<- option("multiword") -> никто иной не # Оборот. \bни что иное, не\b<- option("multiword") -> ничто иное не # Оборот. (в) (течение) (реки|потока|воды|ручья) <- option("multiword") -> \1 течении \3 # Грамматическая ошибка (в) (течении) (часа|минуты|промежутка|секунды|дня|времени|недели|месяца|года|столетия|тысячелетия) <- option("multiword") -> \1 течение \3 # Грамматическая ошибка (в) (продолжении) (часа|минуты|промежутка|секунды|дня|времени|недели|месяца|года|столетия|тысячелетия|разговора|беседы) <- option("multiword") -> \1 продолжение \3 # Грамматическая ошибка \bкакбудто<- option("together") -> как будто # Составная частица \bпо мимо\b <- option("together") -> помимо # Пишется слитно \bна кануне\b<- option("together") -> накануне # Слитно \bна подобие\b<- option("together") -> наподобие # Слитно \bна против\b<- option("together") -> напротив # Слитно \bв низу\b<- option("together") -> внизу # Слитно \bс низу\b<- option("together") -> снизу # Слитно \bна верху\b<- option("together") -> наверху # Слитно \bв верху\b<- option("together") -> вверху # Слитно \bс верху\b<- option("together") -> сверху # Слитно \bс верх\b<- option("together") -> сверх # Слитно \bс выше\b<- option("together") -> свыше # Слитно \bсо гласно\b<- option("together") -> согласно # Слитно \bв глубь\b<- option("together") -> вглубь # Слитно \bв доль\b<- option("together") -> вдоль # Слитно \bв замен\b<- option("together") -> взамен # Слитно # formats # Thousand separators: 10000 -> 10,000 (common) or 10 000 (ISO standard) # definitions d \d\d\d # name definition: 3 digits d2 \d\d # 2 digits D \d|\d\d|\d\d\d # 1, 2 or 3 digits # ISO thousand separatos: space, here: no-break space (U+00A0) \b{d2}{d}\b <- option("numsep") -> {d2} {d} # Добавить разделитель разрядов (ISO)? \b{D}{d}{d}\b <- option("numsep") -> {D} {d} {d} # Добавить разделитель разрядов (ISO)? \b{D}{d}{d}{d}\b <- option("numsep") -> {D} {d} {d} {d} # Добавить разделитель разрядов (ISO)? # 1234567890 -> 1 234 567 890 # word duplication [Word] W [-\w]{3,} # within clauses {W} \1 <- option("dup") -> {W} # Повтор слова? lightproof-1.5+git20140515/src/ru_RU/ru_RU.dlg0000644000175000017500000000540012054114510017140 0ustar renerene# Options and title texts for the Settings and conditional rules # for Russian (translated by Yakov Reztsov 2011) # The Lightproof dialogs contain only grouped checkboxes. # # Format of the dialog definition: # # GroupID: OptionID, OptionID ... # Group2ID: OptionID, OptionID ... # ... # [Language_code=title of the window] # OptionID=title of the option # Option2ID=title of the option # # The first language is the default language for other locales # (use en_US or the common language of your country) # # The OptionIDs declared here are used in the rules, too. For example: # # foo <- option("style") -> bar # bar is far better # # this rule depends from the state of the "style" checkbox. # options (starred options are checked) grammar: *hyphen *comma, *multiword *together proofreading: *common *space, *abbreviation *dup others: numsep, *typographica, *quotation # titles [en_US=Russian sentence checking] abbreviation=Abbreviation grammar=Grammar hyphen=Compound words with hyphen comma=Comma usage common=General error multiword=Multiword expressions together=Together/separately proofreading=Proofreading space=Space mistake typographica=Typographica dup=Word duplication others=Others numsep=Separation of large numbers (ISO) quotation=Quotation [ru_RU=Проверка грамматики (Русский язык)] abbreviation=Аббревиатуры \n Аббревиатуры, сокращения и знаки пунктуации. grammar=Грамматика hyphen=Дефис \n Правописание слов через дефис, слитно или раздельно. comma=Пунктуация \n Поиск ошибок в расстановке знаков препинания. common=Общие ошибки \n Поиск прочих ошибок multiword=Словосочетания \n Правописание словосочетаний и устойчивых оборотов. together=Слитно/раздельно \n Правописание слов слитно или раздельно. proofreading=Стилистика space=Пробел \n Поиск ошибок с пробелом: двойной пробел, пробел перед знаками пунктуации. typographica=Типографика \n Предлагать замену сочетаний знаков на специальные символы. dup=Повтор слов \n Поиск повторяющихся слов others=Прочее numsep=Разделители групп разрядов (ISO) для чисел \n Разделители групп разрядов (ISO) для больших чисел quotation=Кавычки \n Предлагать замену кавычек на кавычки-«ёлочки» или парные кавычки. lightproof-1.5+git20140515/src/ru_RU/ru_RU.cfg0000644000175000017500000000052412054114510017133 0ustar renerene[args] lang = ru_RU locales = ru_RU name = Lightproof grammar checker (Russian) version = 0.3.2 author = Yakov Reztsov provider = LibreOffice implname = lightproof_ru_RU link = http://www.libreoffice.org description = Russian grammar checker for LibreOffice extras = README_lightproof_ru_RU.txt # logo = # sourcefiles =lightproof-1.5+git20140515/src/en/0000755000175000017500000000000012335137465015003 5ustar renerenelightproof-1.5+git20140515/src/en/en.dat0000644000175000017500000004163512335137465016110 0ustar renerene# English sentence checking # word-level rules (case-sensitive) [word] # basic syntax of the rules: # # pattern -> suggestion # warning message # pattern <- condition -> suggestion # warning message # # duplicates and and -> and # Did you mean: or or -> or # Did you mean: for for -> for # Did you mean: the the -> the # Did you mean: # word-level rules (case-insensitive) [Word] # multiword expressions ying and yang -> yin and yang # Did you mean: # multiple suggestions separated by "\n" scot free -> scot-free\nscotfree # Did you mean: # possessive pronouns # Your's -> Yours (your|her|our|their)['’]s -> \1s # Possessive pronoun: \n http://en.wikipedia.org/wiki/Possessive_pronoun # a or an (rules for articles)# ############################### [word] # pattern "a" matches "a" or "A": a [Aa] # pattern "_" matches space and optional quotation marks: _ [ ]['‘"“]? # pattern "vow" matches words beginning with vowels: vow [aeiouAEIOU]\w* # pattern "con" matches words beginning with consonants: con [bcdfghj-np-tv-zBCDFGHJ-NP-TV-Z]\w* # pattern "etc" matches other word parts separated by hyphen, endash or apostrophes: etc [-–'’\w]* # rules ("aA", "aAN", "aB" sets are defined at the end of the file) {a}n{_}{vow}{etc} <- {vow} in aA or {vow}.lower() in aA -> {a}{_}{vow}{etc} # Did you mean: \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an a{_}{vow}{etc} <- ({vow} != {vow}.upper()) and not ({vow} in aA or {vow}.lower() in aA) and spell({vow}) -> an{_}{vow}{etc} # Bad article? \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an a{_}{con}{etc} <- {con} in aAN or {con}.lower() in aAN -> an{_}{con}{etc} # Did you mean: \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an {a}n{_}{con}{etc} <- ({con} != {con}.upper()) and not ({con} in aA or {con}.lower() in aAN) and not {con} in aB and spell({con}) -> {a}{_}{con}{etc} # Bad article? \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an # rules for sentences beginning with "A" ^A{_}{vow}{etc} <- ({vow} != {vow}.upper()) and not ({vow} in aA or {vow}.lower() in aA) and spell({vow}) -> An{_}{vow}{etc} # Bad article? \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an ^A{_}{con}{etc} <- {con} in aAN or {con}.lower() in aAN -> An{_}{con}{etc} # Did you mean: \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an # check numbers nvow (8[0-9]*|1[18](000)*)(th)? # 8, 8th, 11, 11th, 18, 18th, 11000, 11000th... a{_}{nvow}{etc} -> an{_}{nvow}{etc} # Did you mean: \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an ^A{_}{nvow}{etc} -> An{_}{nvow}{etc} # Did you mean: \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an ncon [0-79][0-9]* {a}n{_}{ncon}{etc} <- not {ncon}[:2] in ["11", "18"] -> {a}{_}{ncon}{etc} # Did you mean: \n http://en.wikipedia.org/wiki/English_articles#Distinction_between_a_and_an # paragraph capitalization [code] # pattern matching for common English abbreviations abbrev = re.compile("(?i)\b([a-z]|acct|approx|appt|apr|apt|assoc|asst|aug|ave|avg|co(nt|rp)?|ct|dec|defn|dept|dr|eg|equip|esp|est|etc|excl|ext|feb|fri|ft|govt?|hrs?|ib(id)?|ie|in(c|t)?|jan|jr|jul|lit|ln|mar|max|mi(n|sc)?|mon|Mrs?|mun|natl?|neg?|no(rm|s|v)?|nw|obj|oct|org|orig|pl|pos|prev|proj|psi|qty|rd|rec|rel|reqd?|resp|rev|sat|sci|se(p|pt)?|spec(if)?|sq|sr|st|subj|sun|sw|temp|thurs|tot|tues|univ|var|vs)\.") # pattern for paragraph checking paralcap = re.compile(u"(?u)^[a-z].*[.?!] [A-Z].*[.?!][)”]?$") [word] # condition: the paragraph begins with a lowercase letter and it contains real sentence boundaries. low [a-z]+ (^){low} <- paralcap.search(TEXT) and not abbrev.search(TEXT) -> = {low}.capitalize() # Missing capitalization? # optional sentence capitalization ^{low} <- option("cap") and not abbrev.search(TEXT) -> = {low}.capitalize() # Missing capitalization? # punctuation [code] punct = { "?": "question mark", "!": "exclamation mark", ",": "comma", ":": "colon", ";": "semicolon", "(": "opening parenthesis", ")": "closing parenthesis", "[": "opening square bracket", "]": "closing square bracket", u"“": "opening quotation mark", u"”": "closing quotation mark"} [char] " ([.?!,:;)”\]])\b" -> "\1 " # Reversed space and punctuation? " +[.]" <- LOCALE.Country == "US" -> . # Extra space before the period? " +[.]" <- LOCALE.Country != "US" -> . # Extra space before the full stop? " +([?!,:;)”\]])" -> \1 # = "Extra space before the " + punct[\1] + "?" "([([“]) " -> \1 # = "Extra space after the " + punct[\1] + "?" # ( item ) -> (item) # A small - but important - example. -> A small – but important – example. # En dash and em dash \b(---?| --? )\b <- not option("ndash") and not option("mdash") -> " – \n—" # En dash or em dash: \b(---?| --? |—)\b <- option("ndash") and not option("mdash") -> " – " # En dash: \b(---?| --? | – )\b <- option("mdash") -> — # Em dash: # multiplication sign number \d+([.]\d+)? {number}(x| x ){number} <- option("times") -> {number}×{number} # Multiplication sign. \n http://en.wikipedia.org/wiki/Multiplication_sign # 800x600 -> 800×600 # missing space abc [a-z]+ ABC [A-Z]+ Abc [a-zA-Z]+ pun [?!,:;%‰‱˚“”‘] {Abc}{pun}{Abc} -> {Abc}{pun} {Abc} # Missing space? {abc}[.]{ABC} -> {abc}. {ABC} # Missing space? # missing,space -> missing, space # missing.Space -> missing. Space [)] <- option("pair") and not "(" in TEXT -> # Extra closing parenthesis? [(] <- option("pair") and TEXT[-1] in u"?!;:”’" and not ")" in TEXT -> # Extra opening parenthesis? (? # Extra quotation mark? (?<=[0-9])” <- option("apostrophe") and not u"“" in TEXT -> ″\n # Bad double prime or extra quotation mark? “ <- option("pair") and TEXT[-1] in u"?!;:”’" and not u"”" in TEXT -> # Extra quotation mark? "[.]{3}" <- option("ellipsis") -> "…" # Ellipsis. \b {2,3}(\b|$) <- option("spaces") -> "\1 " # Extra space. # Extra space -> Extra space # End... -> End… (^|\b|{pun}|[.]) {2,3}(\b|$) <- option("spaces2") -> "\1 " # Extra space. # Extra space -> Extra space # End... -> End… (^|\b|{pun}|[.]) {4,}(\b|$) <- option("spaces3") -> "\1 \n " # Change multiple spaces to a single space or a tabulator: # quotation # Using typographic quotation marks is the (?i)[\"“”‟„]({abc}[^\"“”‟„]*)[\"“‟] <- option("quotation") -> “\1” # Quotation marks. (?i)[\"”‟„]({abc}[^\"“”‟„]*)[\"“”‟] <- option("quotation") -> “\1” # Quotation marks. (?i)'{abc}' <- option("apostrophe") -> ‘{abc}’ # Quotation marks. (?i)[\"”‟„]({abc}[^\"“”‟„]*)[\"“”‟] <- option("apostrophe") -> “\1” # Quotation marks. # apostrophe w \w* (?i){Abc}'{w} <- option("apostrophe") -> {Abc}’{w} # Replace typewriter apostrophe or quotation mark: # o'clock -> o’clock # singers' voices -> singers’ voices (?<= )'{Abc} <- option("apostrophe") -> ‘{Abc}\n’{Abc} # Replace typewriter quotation mark or apostrophe: ^'{Abc} <- option("apostrophe") -> ‘{Abc}\n’{Abc} # Replace typewriter quotation mark or apostrophe: # formats # Thousand separators: 10000 -> 10,000 (common) or 10 000 (ISO standard) # definitions d \d\d\d # name definition: 3 digits d2 \d\d # 2 digits D \d{1,3} # 1, 2 or 3 digits # ISO thousand separators: space, here: narrow no-break space (U+202F) \b{d2}{d}\b <- option("numsep") -> {d2},{d}\n{d2} {d} # Use thousand separator (common or ISO). \b{D}{d}{d}\b <- option("numsep") -> {D},{d},{d}\n{D} {d} {d} # Use thousand separators (common or ISO). \b{D}{d}{d}{d}\b <- option("numsep") -> {D},{d},{d},{d}\n{D} {d} {d} {d} # Use thousand separators (common or ISO). # 1234567890 -> 1,234,567,890\n1 234 567 890 # word duplication [word] {Abc} \1 <- option("dup") -> {Abc} # Word duplication? # Optional grammar checking ([Tt])his {abc} <- option("grammar") and morph({abc}, "Ns") -> \1hese {abc}\n\1his, {abc} # Did you mean: with it['’]s <- option("grammar") -> with its\nwith, it’s # Did you mean: [Word] (it|s?he) don['’]t <- option("grammar") -> \1 doesn’t # Did you mean: ################### measurements ########################## [word] # Temperature ([-−]?\d+(?:[,.]\d+)*) (°F|Fahrenheit) <- option("metric") -> = measurement(\1, "F", "C", u" °C", ".", ",") # Convert to Celsius: ([-−]?\d+(?:[,.]\d+)*) (°C|Celsius) <- option("nonmetric") -> = measurement(\1, "C", "F", u" °F", ".", ",") # Convert to Fahrenheit: # Length ([-−]?\d+(?:[,.]\d+)*(?: 1/2| ?½)?) (ft|foot|feet)(?! [1-9]) <- option("metric") -> = measurement(\1, "ft", "cm", " cm", ".", ",") + "\n" + measurement(\1, "ft", "m", " m", ".", ",") # Convert to metric: ([-−]?\d+(?:[,.]\d+)*(?: 1/2| ?½)?) ft[.]? ([0-9]+(?: 1/2| ?½)?) in <- option("metric") -> = measurement(\1 + "*12+" + \2, "in", "cm", " cm", ".", ",") + "\n" + measurement(\1 + "*12+" + \2, "in", "m", " m", ".", ",") # Convert to metric: ([-−]?\d+(?:[,.]\d+)*(?: 1/2| ?½)?) in <- option("metric") -> = measurement(\1, "in", "mm", " mm", ".", ",") + "\n" + measurement(\1, "in", "cm", " cm", ".", ",") + "\n" + measurement(\1, "in", "m", " m", ".", ",") # Convert to metric: ([-−]?\d+(?:[,.]\d+)*) mm <- option("nonmetric") -> = measurement(\1, "mm", "in", " in", ".", ",") # Convert from metric: ([-−]?\d+(?:[,.]\d+)*) cm <- option("nonmetric") -> = measurement(\1, "cm", "in", " in", ".", ",") + "\n" + measurement(\1, "cm", "ft", " ft", ".", ",") # Convert from metric: ([-−]?\d+(?:[,.]\d+)*) (m|meter|metre) <- option("nonmetric") -> = measurement(\1, "m", "in", " in", ".", ",") + "\n" + measurement(\1, "m", "ft", " ft", ".", ",") + "\n" + measurement(\1, "m", "mi", " mi", ".", ",") # Convert from metric: ([-−]?\d+(?:[,.]\d+)*(?: 1/2| ?½)?) miles? <- option("metric") -> = measurement(\1, "mi", "m", " m", ".", ",") + "\n" + measurement(\1, "mi", "km", " km", ".", ",") # Convert to metric: ([-−]?\d+(?:[,.]\d+)*) km <- option("nonmetric") -> = measurement(\1, "km", "mi", " mi", ".", ",") # Convert to miles: ([-−]?\d+(?:,\d+)?) (yd|yards?) <- option("metric") -> = measurement(\1, "yd", "m", " m", ".", ",") # Convert to metric: # Volume ([-−]?\d+(?:,\d+)?) (gal(lons?)?) <- option("metric") -> = measurement(\1, "gal", "l", " l", ".", ",") + "\n" + measurement(\1, "uk_gal", "l", " l (in UK)", ".", ",") # Convert to metric: ([-−]?\d+(?:,\d+)?) (pint) <- option("metric") -> = measurement(\1, "pt", "dl", " dl", ".", ",") + "\n" + measurement(\1, "uk_pt", "dl", " dl (in UK)", ".", ",") + "\n" + measurement(\1, "pt", "l", " l", ".", ",") + "\n" + measurement(\1, "uk_pt", "l", " l (in UK)", ".", ",") # Convert to metric: ([-−]?\d+(?:,\d+)?) (l|L|litres?|liters?) <- option("nonmetric") -> = measurement(\1, "l", "gal", " gal", ".", ",") + "\n" + measurement(\1, "l", "gal", " gal (in UK)", ".", ",") # Convert to gallons: # Weight ([-−]?\d+(?:[,.]\d+)*) lbs?[.]? <- option("metric") -> = measurement(\1, "lbm", "kg", " kg", ".", ",") # Convert to metric: ([-−]?\d+(?:[,.]\d+)*) kg[.]? <- option("nonmetric") -> = measurement(\1, "kg", "lbm", " lb", ".", ",") # Convert to pounds: # Speed ([-−]?\d+(?:[,.]\d+)*) mph <- option("metric") -> = measurement(\1, "mph", "km/h", " km/h", ".", ",") # Convert to km/hour: ([-−]?\d+(?:[,.]\d+)*) km/h <- option("nonmetric") -> = measurement(\1, "km/h", "mph", " mph", ".", ",") # Convert to miles/hour: [code] aA = set(["eucalypti", "eucalyptus", "Eucharist", "Eucharistic", "euchre", "euchred", "euchring", "Euclid", "euclidean", "Eudora", "eugene", "Eugenia", "eugenic", "eugenically", "eugenicist", "eugenicists", "eugenics", "Eugenio", "eukaryote", "Eula", "eulogies", "eulogist", "eulogists", "eulogistic", "eulogized", "eulogizer", "eulogizers", "eulogizing", "eulogy", "eulogies", "Eunice", "eunuch", "eunuchs", "Euphemia", "euphemism", "euphemisms", "euphemist", "euphemists", "euphemistic", "euphemistically", "euphonious", "euphoniously", "euphonium", "euphony", "euphoria", "euphoric", "Euphrates", "euphuism", "Eurasia", "Eurasian", "Eurasians", "eureka", "eurekas", "eurhythmic", "eurhythmy", "Euridyce", "Euripides", "euripus", "Euro", "Eurocentric", "Euroclydon", "Eurocommunism", "Eurocrat", "eurodollar", "Eurodollar", "Eurodollars", "Euromarket", "Europa", "Europe", "European", "Europeanisation", "Europeanise", "Europeanised", "Europeanization", "Europeanize", "Europeanized", "Europeans", "europium", "Eurovision", "Eustace", "Eustachian", "Eustacia", "euthanasia", "Ewart", "ewe", "Ewell", "ewer", "ewers", "Ewing", "once", "one", "oneness", "ones", "oneself", "onetime", "oneway", "oneyear", "u", "U", "UART", "ubiquitous", "ubiquity", "Udale", "Udall", "UEFA", "Uganda", "Ugandan", "ugric", "UK", "ukase", "Ukraine", "Ukrainian", "Ukrainians", "ukulele", "Ula", "ululated", "ululation", "Ulysses", "UN", "unanimity", "unanimous", "unanimously", "unary", "Unesco", "UNESCO", "UNHCR", "uni", "unicameral", "unicameralism", "Unicef", "UNICEF", "unicellular", "Unicode", "unicorn", "unicorns", "unicycle", "unicyclist", "unicyclists", "unidimensional", "unidirectional", "unidirectionality", "unifiable", "unification", "unified", "unifier", "unifilar", "uniform", "uniformally", "uniformed", "uniformer", "uniforming", "uniformisation", "uniformise", "uniformitarian", "uniformitarianism", "uniformity", "uniformly", "uniformness", "uniforms", "unify", "unifying", "unijugate", "unilateral", "unilateralisation", "unilateralise", "unilateralism", "unilateralist", "unilaterally", "unilinear", "unilingual", "uniliteral", "uniliteralism", "uniliteralist", "unimodal", "union", "unionism", "unionist", "unionists", "unionisation", "unionise", "unionised", "unionising", "unionization", "unionize", "unionized", "unionizing", "unions", "unipolar", "uniprocessor", "unique", "uniquely", "uniqueness", "uniquer", "Uniroyal", "unisex", "unison", "Unisys", "unit", "Unitarian", "Unitarianism", "Unitarians", "unitary", "unite", "united", "unitedly", "uniter", "unites", "uniting", "unitize", "unitizing", "unitless", "units", "unity", "univ", "Univac", "univalent", "univalve", "univariate", "universal", "universalisation", "universalise", "universalised", "universaliser", "universalisers", "universalising", "universalism", "universalist", "universalistic", "universality", "universalisation", "universalization", "universalize", "universalized", "universalizer", "universalizers", "universalizing", "universally", "universalness", "universe", "universes", "universities", "university", "univocal", "Unix", "uracil", "Urals", "uranium", "Uranus", "uranyl", "urate", "urea", "uremia", "uremic", "ureter", "urethane", "urethra", "urethral", "urethritis", "Urey", "Uri", "uric", "urinal", "urinalysis", "urinary", "urinated", "urinating", "urination", "urine", "urogenital", "urokinase", "urologist", "urologists", "urology", "Uruguay", "Uruguayan", "Uruguayans", "US", "USA", "usability", "usable", "usably", "usage", "usages", "use", "used", "useful", "usefulness", "usefully", "useless", "uselessly", "uselessness", "Usenet", "user", "users", "uses", "using", "usual", "usually", "usurer", "usurers", "usuress", "usurial", "usurious", "usurp", "usurpation", "usurped", "usurper", "usurping", "usurps", "usury", "Utah", "utensil", "utensils", "uterine", "uterus", "Utica", "utilitarian", "utilitarianism", "utilities", "utility", "utilizable", "utilization", "utilize", "utilized", "utilizes", "utilizing", "utopia", "utopian", "utopians", "utopias", "Utrecht", "Uttoxeter", "uvula", "uvular"]) aAN = set(["f", "F", "FBI", "FDA", "heir", "heirdom", "heired", "heirer", "heiress", "heiring", "heirloom", "heirship", "honest", "honester", "honestly", "honesty", "honor", "honorable", "honorableness", "honorably", "honorarium", "honorary", "honored", "honorer", "honorific", "honoring", "honors", "honour", "honourable", "honourableness", "honourably", "honourarium", "honourary", "honoured", "honourer", "honourific", "honouring", "Honours", "hors", "hour", "hourglass", "hourlong", "hourly", "hours", "l", "L", "LCD", "m", "M", "MBA", "MP", "mpg", "mph", "MRI", "MSc", "MTV", "n", "N", "NBA", "NBC", "NFL", "NGO", "NHL", "r", "R", "s", "S", "SMS", "sos", "SOS", "SPF", "std", "STD", "SUV", "x", "X", "XML"]) aB = set(["H", "habitual", "hallucination", "haute", "hauteur", "herb", "herbaceous", "herbal", "herbalist", "herbalism", "heroic", "hilarious", "historian", "historic", "historical", "homage", "homophone", "horrendous", "hospitable", "horrific", "hotel", "hypothesis", "Xmas"]) def measurement(mnum, min, mout, mstr, decimal, remove): if min == "ft" or min == "in" or min == "mi": mnum = mnum.replace(" 1/2", ".5").replace(u" ½", ".5").replace(u"½",".5") m = calc("CONVERT_ADD", (float(eval(mnum.replace(remove, "").replace(decimal, ".").replace(u"−", "-"))), min, mout)) a = list(set([str(calc("ROUND", (m, 0)))[:-2], str(calc("ROUND", (m, 1))), str(calc("ROUND", (m, 2))), str(m)])) # remove duplicated rounded items a.sort(key=lambda x: len(x)) # sort by string length return (mstr + "\n").join(a).replace(".", decimal).replace("-", u"−") + mstr lightproof-1.5+git20140515/src/en/README_lightproof_en.txt0000644000175000017500000000024612054114510021402 0ustar renereneEnglish sentence checker for LibreOffice see git://anongit.freedesktop.org/libreoffice/lightproof 2011-2012 (c) László Németh, license: MPL 1.1 / GPLv3+ / LGPLv3+ lightproof-1.5+git20140515/src/en/en.dlg0000644000175000017500000000433012054114510016055 0ustar renerene# Options and title texts for the Settings and conditional rules # # THe dialog windows contain only grouped checkboxes. # # Format of the dialog definition: # # GroupID: OptionID, OptionID ... # Group2ID: OptionID, OptionID ... # ... # [Language_code=[title of the node/]title of the window] # OptionID=title of the option # Option2ID=title of the option # # The first language is the default language for other locales # (use en_US or the common language of your country) # # The OptionIDs declared here are used in the rules, too. For example: # # foo <- option("style") -> bar # bar is far better # # this rule depends from the state of the "style" checkbox. # options (starred options are checked) spelling: grammar cap dup pair punctuation: *spaces mdash quotation *times, spaces2 ndash apostrophe ellipsis, spaces3 minus - - others: metric numsep, nonmetric # titles [en_US=English sentence checking] spelling=Grammar checking grammar=Possible mistakes \n Check more grammar errors. cap=Capitalization \n Check missing capitalization of sentences. dup=Word duplication \n Check repeated words. pair=Parentheses \n Check missing or extra parentheses and quotation marks. punctuation=Punctuation spaces=Word spacing\nCheck single spaces between words. mdash=Em dash\nForce unspaced em dash instead of spaced en dash. ndash=En dash\nForce spaced en dash instead of unspaced em dash. quotation=Quotation marks\nCheck double quotation marks: "x" → “x” times=Multiplication sign\nCheck true multipliction sign: 5x5 → 5×5 spaces2=Sentence spacing\nCheck single spaces between sentences. spaces3=More spaces\nCheck more than two extra space characters between words and sentences. minus=Minus sign\nChange hyphen characters to real minus signs. apostrophe=Apostrophe\nChange typewriter apostrophe, single quotation marks and correct double primes. ellipsis=Ellipsis\nChange three dots with ellipsis. others=Others metric=Convert to metric (°C, km/h, m, kg, l)\nMeasurement conversion from °F, mph, ft, in, lb, gal and miles. numsep=Thousand separation of large numbers\nCommon (1000000 → 1,000,000) or ISO (1000000 → 1 000 000). nonmetric=Convert to non-metric (°F, mph, ft, lb, gal)\nMeasurement conversion from °C; km/h; cm, m, km; kg; l. lightproof-1.5+git20140515/src/en/en.cfg0000644000175000017500000000062112075257522016063 0ustar renerene[args] lang = en locales = en_GB en_US en_PH en_ZA en_NA en_ZW en_AU en_CA en_IE en_IN en_BZ en_BS en_GH en_JM en_NZ en_TT name = Lightproof grammar checker (English) version = 0.4.3 author = Laszlo Nemeth provider = LibreOffice implname = lightproof_en link = http://www.libreoffice.org description = English grammar checker for LibreOffice extras = README_lightproof_en.txt # logo = # sourcefiles = lightproof-1.5+git20140515/src/editor/0000755000175000017500000000000012054114510015647 5ustar renerenelightproof-1.5+git20140515/src/editor/icons/0000755000175000017500000000000012054114510016762 5ustar renerenelightproof-1.5+git20140515/src/editor/icons/debug.png0000644000175000017500000000332412054114510020560 0ustar renerenePNG  IHDRJLsRGBbKGD pHYs  tIME% áTIDATHǭV}lҵTK(D;P13۴aAȔH_dkQhp^ )#6@hG-z{>{o-81;<ϓ=:3 " #Cf &ixi@X`vL奶vh W1%0J,)5&Ɖ X +Ohaע;"ne@."靇ie, vqp( dFcg>Dh{>@ ib1}[/Y&D$YBt OsS!;qvVۑ|cI%D،bihBhP`a/Ԛb9x7/FfO'ݽzq#+3m{01dK68r 65ZcԬ"}fa2!;gV{Cޫ~:>;W.ѓS֯6%kOۯv[;DI>S"Ȏ⟛e MW8uѥ ^VJ3@#2) @Df  1To10@,(-+= +QЀQX[ PR&I? < p~:(LC4 `K3KՒORwJ _cJŻ業p^5/M4 g#S)04ok)VTTXXQAp ayaj)6\еXꫮ+"k,&#j]V}+69:-wA-p*|9P<\IENDB`lightproof-1.5+git20140515/src/editor/icons/compall.png0000644000175000017500000000161612054114510021123 0ustar renerenePNG  IHDRJLsRGBbKGD pHYs  tIME)%0IDATHǭOhw?73J1M(XL =E*CBX"Jbl% Vڊ֋zR׋RB=ĠfI23{fw}}{B9zBMrPUg+c?' vyR(NSe\kmrD2] +dƽDX}adAI' e)g LИP#gYZKdg8Hk%iZBzM#M͔h8) =sѴDb 'cpܺDQTODJYl҅O#XWp*Kf.XUM C)\`SHf{fdVHGt7iO" #̝҅+7Ə HfO hGm:9FlWb\.<»z(}%$knH?Z) FŜ7:]f9ˤwç(""ұD z;Rq\%˧K|;:g2yҺa}Xy'k$d'})Gy<&̜O8MfũirO^cK~!yo:r$~S=݌o_ܢ@6ehx-[ֽ7̛G')rmz8}f-(o;C:uiosup?eՏEQvu\IENDB`lightproof-1.5+git20140515/src/editor/icons/debug16.png0000644000175000017500000000163512054114510020732 0ustar renerenePNG  IHDRasRGBbKGD pHYs  tIME#$`KIDAT8ˍ_hu?;ΙYLg֒[DGv(`])ARӴբE ] 6͌ ¥\6%ksus^<<<_Թc*x+ߏ2?uM0ؔq5Q|>ǧ}r{0}dd;s7࡯$m,HK0;F+IZk-raKg-c䀃Լ-3=}?T|g (77nwwcg&ɂߜUd"mmX֢* S;kzm?OlA( `S%o+AlxRçc= uZ)5K3 !&DRg]Exk<7i_GA8]Z d!Xke^6dc ArvHTh[T mvp5zqZ"W_@oC[Z-L;{CS&UDyhwhbѡ`=Oh|)b"/fm\L&fø{kh0O*3 Zx/\UWUzzȏ:08el)>i GVm Oz$!94ΎJ'_yډb#׮T55EWU&EDP"t nuE6/k3G xS-5 j#"W8R59R86*uyon[$IENDB`lightproof-1.5+git20140515/src/editor/icons/comp.png0000644000175000017500000000160512054114510020430 0ustar renerenePNG  IHDRJLsRGBbKGD pHYs  tIME)lIDATHǭOh\Uf6tڄI]XHХ ҅OM\.%JJwBlklKj@[(B-"lښbCLhd&{\I!^ڻz{sqK^UeߛQ'_~bA;c/*a$gq%G*z@m6%S,++U/FTl  ~?ϴ&=CqZr>ND`P``>rs58H뜦%m-=t 2G!& ]}MK$``rBi 3 6u5B2I7FP%,)a2.<߳hZ3X#8;vh5156#֩zkj6Y" EGΑ4k±dsH\G6H/= Tw5Buӆ^pͦp::twڭhbQ4ˡvVbLfDk3ٺF8{|p/~Oߏyi,No)@(FL$N*v?wǨcDćD؉J=FE:h>$ &Lwn֣ ĥz$_ ;@ZD\z v>pИ:@CuzSI \z SG[@59R`ڨ6/BE~96ew : piA=ۆ5& (ƿ_dN#<,7)Uڨ<.~۞rQ/C__!\ǐc <3hQf<tIENDB`lightproof-1.5+git20140515/src/editor/icons/compall16.png0000644000175000017500000000106312054114510021266 0ustar renerenePNG  IHDRasRGBbKGD pHYs  tIME%/P( IDAT8ˍKTQIa9ipZ8AH!6FB2zR&P "?UD\ 73{n {ͳs8ѳך]0"+HV0 Z|{DzD#68ш a=BD 4qZr+z̧Zk 2ND4XI@;÷%?}֤8Lș'"cbC=2lZcI!36ؙڢo*Y0Ƥpdhؙk ^(e֦Uge w9N7V* Sv+9Ω͆Vb )"[^x硓=2teSI!od=o 7@ g0p"' RQ8(|A>t{IENDB`lightproof-1.5+git20140515/src/editor/editor.dat0000644000175000017500000000003112054114510017621 0ustar renerenea a -> a # Did you mean: lightproof-1.5+git20140515/src/editor/Office/0000755000175000017500000000000012054114510017042 5ustar renerenelightproof-1.5+git20140515/src/editor/Office/UI/0000755000175000017500000000000012054114510017357 5ustar renerenelightproof-1.5+git20140515/src/editor/Office/UI/StartModuleWindowState.xcu0000644000175000017500000000117112054114510024534 0ustar renerene Lightproof editor false lightproof-1.5+git20140515/src/editor/Office/UI/WriterWindowState.xcu0000644000175000017500000000115612054114510023550 0ustar renerene Lightproof editor false lightproof-1.5+git20140515/src/editor/Office/Accelerators.xcu0000644000175000017500000000204212054114510022170 0ustar renerene macro:///lightproof_editor.General.Compile macro:///lightproof_editor.General.CompileAll macro:///lightproof_editor.General.Debug lightproof-1.5+git20140515/src/editor/editor.cfg0000644000175000017500000000202712054114510017617 0ustar renerene[args] lang = editor locales = af_ZA an_ES ar be_BY bg_BG bn_BD br_FR ca cs_CZ da_DK de_DE el_GR en_AU en_CA en_GB en_US en_ZA es_ES et_EE eo fr gd_GB gl_ES gu_IN he_IL hi_IN hr_HR hu_HU it_IT ku_TR lt_LT lv_LV ne_NP nl_NL nb_NO nn_NO oc_FR pl_PL pt_BR pt_PT ro_RO ru_RU si_LK sk_SK sl_SI sh sr sv_SE sw_TZ te_IN th_TH uk_UA vi_VN name = Lightproof editor version = 0.1 author = László Németh provider = FSF.hu Foundation implname = lightproof_editor link = http://www.fsf.hu/about-us/ description = Grammar checker rule editor for LibreOffice extras = ../../pythonpath/lightproof_compile___implname__.py, README, ../../doc/syntax.txt, ../../doc/manual.txt, ../../src/en/en.dat, lightproof_editor/script.xlb, lightproof_editor/RegisteredFlag, lightproof_editor/General.xba, lightproof_editor/dialog.xlb, Office/UI/StartModuleWindowState.xcu, Office/UI/WriterWindowState.xcu, Office/Accelerators.xcu, icons/comp.png, icons/compall.png, icons/comp16.png, icons/compall16.png, icons/debug16.png, icons/debug.png, META-INF/manifest.xml, Addons.xcu lightproof-1.5+git20140515/src/editor/lightproof_editor/0000755000175000017500000000000012054114510021372 5ustar renerenelightproof-1.5+git20140515/src/editor/lightproof_editor/General.xba0000644000175000017500000001375212054114510023453 0ustar renerene ' László Németh (c) 2012, License: MPL/LGPL/GPL Sub Compile() Update(False) End Sub Sub CompileAll() Update(True) End Sub Sub Update(all) c = ThisComponent.CurrentController.getViewCursor() Dim prop prop = ThisComponent.getDocumentProperties() locale = ThisComponent.StyleFamilies.getByName("ParagraphStyles").getByName("Standard").CharLocale Dim values(1) As New com.sun.star.beans.PropertyValue rules = ThisComponent.Text.getString() if InStr(rules, "→") Then Replace("→", "->") if InStr(rules, "←") Then Replace("←", "<-") rules = ThisComponent.Text.getString() if all Then Replace("\<option\([^)]*\)", "True") values(0).Name = "Update" values(0).Value = ThisComponent.Text.getString() 'spellchecker = createUnoService("com.sun.star.linguistic2.SpellChecker") proofreader = createUnoService("org.openoffice.comp.pyuno.Lightproof.lightproof_editor") result = proofreader.doProofreading(0, rules, locale, 0, len(rules), values()) ThisComponent.Text.setString(rules) SetStyle() Replace("\n", "\n") ' convert new lines to paragraph breaks If result.aText <> "" Then If result.aText <> rules Then MsgBox result.aText + " in line " + result.nStartOfSentencePosition SetLine(result.nStartOfSentencePosition) End If End If End Sub Sub Debug() c = ThisComponent.CurrentController.getViewCursor() Dim prop prop = ThisComponent.getDocumentProperties() locale = ThisComponent.StyleFamilies.getByName("ParagraphStyles").getByName("Standard").CharLocale Dim values(1) As New com.sun.star.beans.PropertyValue rules = ThisComponent.Text.getString() 'if InStr(rules, "→") Then Replace("→", "->") 'if InStr(rules, "←") Then Replace("←", "<-") 'if all Then Replace("\<option\([^)]*\)", "True") values(0).Name = "Debug" values(0).Value = ThisComponent.Text.getString() 'spellchecker = createUnoService("com.sun.star.linguistic2.SpellChecker") proofreader = createUnoService("org.openoffice.comp.pyuno.Lightproof.lightproof_editor") result = proofreader.doProofreading(0, rules, locale, 0, len(rules), values()) ThisComponent.Text.setString(rules) SetStyle() Replace("\n", "\n") ' convert new lines to paragraph breaks If result.aText <> "" Then If result.aText <> rules Then MsgBox result.aText + " in line " + result.nStartOfSentencePosition SetLine(result.nStartOfSentencePosition) Else MsgBox "Ok" End If End If End Sub Sub SetStyle() target = ThisComponent.StyleFamilies.getByName("ParagraphStyles").getByName("Standard") source = ThisComponent.StyleFamilies.getByName("ParagraphStyles").getByName("Preformatted Text") if target.CharFontName <> source.CharFontName or target.CharHeight <> source.CharHeight then target.CharFontName = source.CharFontName target.CharHeight = source.CharHeight end if End Sub Sub SetLine(n) ' MsgBox "hello" c = ThisComponent.Text.createTextCursor() ' c = ThisComponent.CurrentController.getViewCursor c.GoToStart(False) For i = 2 to n c.gotoNextParagraph(False) ' c.gotoEndOfLine(False) ' c.goRight(1, False) ' c.setString("M") ' MsgBox c.getString() Next ThisComponent.CurrentController.getViewCursor.gotoRange(c, False) End Sub sub Replace(s, s2) rem ---------------------------------------------------------------------- rem define variables dim document as object dim dispatcher as object rem ---------------------------------------------------------------------- rem get access to the document document = ThisComponent.CurrentController.Frame dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") rem ---------------------------------------------------------------------- dispatcher.executeDispatch(document, ".uno:GoToStartOfDoc", "", 0, Array()) rem ---------------------------------------------------------------------- dim args2(18) as new com.sun.star.beans.PropertyValue args2(0).Name = "SearchItem.StyleFamily" args2(0).Value = 2 args2(1).Name = "SearchItem.CellType" args2(1).Value = 0 args2(2).Name = "SearchItem.RowDirection" args2(2).Value = true args2(3).Name = "SearchItem.AllTables" args2(3).Value = false args2(4).Name = "SearchItem.Backward" args2(4).Value = false args2(5).Name = "SearchItem.Pattern" args2(5).Value = false args2(6).Name = "SearchItem.Content" args2(6).Value = false args2(7).Name = "SearchItem.AsianOptions" args2(7).Value = false args2(8).Name = "SearchItem.AlgorithmType" args2(8).Value = 1 args2(9).Name = "SearchItem.SearchFlags" args2(9).Value = 65536 args2(10).Name = "SearchItem.SearchString" args2(10).Value = s args2(11).Name = "SearchItem.ReplaceString" args2(11).Value = s2 args2(12).Name = "SearchItem.Locale" args2(12).Value = 255 args2(13).Name = "SearchItem.ChangedChars" args2(13).Value = 2 args2(14).Name = "SearchItem.DeletedChars" args2(14).Value = 2 args2(15).Name = "SearchItem.InsertedChars" args2(15).Value = 2 args2(16).Name = "SearchItem.TransliterateFlags" args2(16).Value = 1280 args2(17).Name = "SearchItem.Command" args2(17).Value = 3 args2(18).Name = "Quiet" args2(18).Value = true dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args2()) end sub lightproof-1.5+git20140515/src/editor/lightproof_editor/dialog.xlb0000644000175000017500000000047212054114510023343 0ustar renerene lightproof-1.5+git20140515/src/editor/lightproof_editor/script.xlb0000644000175000017500000000054512054114510023411 0ustar renerene lightproof-1.5+git20140515/src/editor/lightproof_editor/RegisteredFlag0000644000175000017500000000000012054114510024172 0ustar renerenelightproof-1.5+git20140515/src/editor/Addons.xcu0000644000175000017500000000622712054114510017607 0ustar renerene com.sun.star.text.TextDocument macro:///lightproof_editor.General.Compile Apply rules (Alt-R) _self com.sun.star.text.TextDocument macro:///lightproof_editor.General.CompileAll Apply all (also optional) rules (Alt-C) _self com.sun.star.text.TextDocument macro:///lightproof_editor.General.Debug Debug rules (Alt-D) _self macro:///lightproof_editor.General.Compile %origin%/icons/comp16.png %origin%/icons/comp.png macro:///lightproof_editor.General.CompileAll %origin%/icons/compall16.png %origin%/icons/compall.png macro:///lightproof_editor.General.Debug %origin%/icons/debug16.png %origin%/icons/debug.png lightproof-1.5+git20140515/src/editor/META-INF/0000755000175000017500000000000012054114510017007 5ustar renerenelightproof-1.5+git20140515/src/editor/META-INF/manifest.xml0000644000175000017500000000321212054114510021335 0ustar renerene lightproof-1.5+git20140515/src/editor/README0000644000175000017500000000544512054114510016537 0ustar renereneLightproof grammar checker rule editor for LibreOffice source: git://anongit.freedesktop.org/libreoffice/lightproof or see cgit.freedesktop.org/libreoffice version 0.1 (2012-02-02) 2009–2012 (c) László Németh (nemeth at numbertext dot org), license: MPL 1.1 / GPLv3+ / LGPLv3+ This software was developed with support from FSF.hu Foundation, Hungary. Introduction: http://libreoffice.hu/2011/12/08/grammar-checking-in-libreoffice/ == Installation == 1. Via Tools -> Extension manager in OOo/LibreOffice 2. or with unopkg tool, for example [install_path\program\]unopkg add -f lightproof_editor-0.1.oxt == Usage == Note: there is a huge starting time (seconds) starting LibreOffice with the Lightproof editor. [Removing the unnecessary locales from src/editor/editor.cfg of Lightproof source and generating a new editor extension can solve this problem.] The Lightproof editor extension contains a special grammar checker component and a LibreOffice Writer toolbar. The editor can update its grammar checker component based on the Lightproof rules in the current Writer document. Note: for languages without 'official LibreOffice' Hunspell dictionaries or languages with default LibreOffice grammar checking (English, Russian and Hungarian in LibO 3.5) have to modify some settings, too, see doc/manual.txt in the zipped extension, or you can choose a neutral language (eg. Esperanto) for your Writer document during the rule development. Only the Hunspell-related Lightproof functions, eg. spell(), morph() need the correct language. After the successful installation (and settings), you can check the work of the grammar checking component of the editor with the following text: a a The repeating letters will be underlined with blue wavy line (thanks to the default a a -> a # Did you mean rule of the grammar checker component of the editor). Write the following Lightproof rule in an empty Writer document: b b -> b # suggestion Click on the first icon on the Lightproof editor toolbar. The 'b b' text will be underlined with blue wavy line as a grammar mistake with the 'b' suggestion and 'suggestion' explanation. Load and modify the English Lightproof rules (src/en/en.dat) or decribe new rules based on doc/syntax.txt (these files can be found in the oxt (zipped) file of the Lightproof editor extension, too). See also doc/manual.txt and http://libreoffice.hu/2011/12/08/grammar-checking-in-libreoffice/ = Toolbar icons = 1. Apply rules Compile and the default Lightproof rules in the current document and update the Lightproof editor grammar checker component. 2. Apply all rules Compile and apply all (including optional) Lightproof rules in the current document and update the relevant component. 3. Debug rules Check the current text and report run time errors (eg. in the Python conditions of the rules). lightproof-1.5+git20140515/src/converter/0000755000175000017500000000000012054114510016370 5ustar renerenelightproof-1.5+git20140515/src/converter/xml2reexp.py0000644000175000017500000005270112054114510020675 0ustar renerene# -*- coding: UTF-8 -*- import lxml.etree as ET import sys import os import codecs import copy did_you_mean = False number = 0 amount = 0 to_implement = 0 no_support = 0 class RuleModel(object): '''parse() method returns rule''' def __init__(self, rule): self.rule = rule self.pattern = rule.find('pattern') self.pattern_descendants = RuleModel.element_descendants(self.pattern) self.message = rule.find('message') self.message_descendants = RuleModel.element_descendants(self.message) self.items = RuleModel.nesting_list_killer( [i.items() for i in self.message.iterdescendants()] + [i.items() for i in self.pattern.iterdescendants()]) self.keys = RuleModel.nesting_list_killer( [i.keys() for i in self.message.iterdescendants()] + [i.keys() for i in self.pattern.iterdescendants()]) @staticmethod def nesting_list_killer(lst): result = [] for element in lst: if isinstance(element, (str, unicode, tuple)): result.append(element) else: result += RuleModel.nesting_list_killer(element) return set(result) @staticmethod def key_remover(iterable, keys_list): keys = copy.copy(keys_list) it = list(copy.copy(iterable)) for key in keys: try: it.remove(key) except ValueError: pass return it @staticmethod def space_killer(old_result): '''space killer, char dealer''' result = [i.strip() for i in old_result[1:]] for item in result: if (item in ('.', ',', ':', '!', '?', "'", '"', '([.])') and item in result or item.startswith('\\n') ): indx = result.index(item) if indx != 0: result[indx - 1] += item result.remove(item) else: result = [(item + result[:][1]), ] + result[2:] for item in result: if '\\n' in item: result[result.index(item)] = '\\n'.join(i.strip() for i in item.split('\\n')) if item.startswith('([.])') or item.endswith('([.]))'): indx = result.index(item) if indx != 0: result[indx - 1] += item result.remove(item) for item in result: if item.endswith('([.]))'): indx = result.index(item) if indx != 0: result[indx - 1] += item result.remove(item) # if '|' in item: # result[result.index(item)] = '\\n'.join(i.strip() # for i in item.split('|')) for item in result: if item.endswith("'") and (len(result) - result.index(item) >= 2): indx = result.index(item) result[indx] += result[indx + 1] result.remove(result[indx + 1]) result.insert(0, old_result[0]) return result @staticmethod def element_descendants(element): return ((i, i.tag, tuple(i.keys()), i.getchildren(), i.text, i.tail) for i in element.iterdescendants()) def parse(self, attr): result = [] suggestions = [] if attr == 'pattern': target = self.pattern_descendants elif attr == 'message': target = self.message_descendants else: raise AttributeError("wrong attr for parse()'s target ") for (element, tag, keys, _children, text, tail) in target: # start for # '''unsupported pattern keys''' if (self.keys and 'postag' in self.keys or 'postag_regexp' in self.keys or 'negate_pos' in self.keys ): if ('postag', 'SENT_START') in self.items: r = copy.copy(self.items) r.remove(('postag', 'SENT_START')) r = [i[0] for i in RuleModel.nesting_list_killer(r)] if ('postag' in r or 'postag_regexp' in r or 'negate_pos' in r): result = [[], 'Not supported', ] return result else: pass else: result = [[], 'Not supported', ] return result '''not implemented features''' if (self.keys and 'regexp_match' in self.keys or 'regexp_replace' in self.keys or 'regexp_replace' in self.keys or 'case_conversion' in self.keys # or tag == 'match' # or 'skip' in self.keys # or 'negate' in keys # or 'spacebefore' in keys # or 'inflected' in keys # or tag == 'exception' or ('postag', 'SENT_START') in self.items ): if not 'Not supported' in result: result = [[], 'Not implemented', ] return result if not len(result): result.append(element.items()) else: result[0] += element.items() #exception tag with scope attr rule if (tag == 'exception' and 'scope' in keys and not RuleModel.key_remover(keys, ['scope', ])): ''' exception tag with only the scope key''' if element.get('scope') == 'previous': result.append('(? error''' raise TypeError("'markered' elements in %s" % self.rule.get('id')) if element.getparent().tag == 'marker': children_list = element.getparent().getchildren() if len(children_list) == 1: pass #result[-1] = '(' + result[-1] + ')' else: if children_list[0] == element: if "regexp" not in element.keys(): if result[-1][0] != '(': result[-1] = '((' + result[-1] + ')' else: result[-1] = '(' + result[-1] elif len(result) > 2: if (element in children_list[1:-1] and "regexp" not in element.keys()): if not result[-1][0] == '(': result[-1] = '(' + result[-1] + ')' elif children_list[-1] == element: """ ')' after last element""" if result[-1][0] != '(': result[-1] = '(' + result[-1] + '))' elif result[-1][0] == '(': result[-1] += ')' #negate attr rule if (('negate', 'yes') in element.items() and not RuleModel.key_remover(keys, ['regexp', 'default', 'skip', 'negate'])): '''negate="yes" attribute''' if not RuleModel.key_remover([i for i in text], ('.', ',', ':', '!', '?', "'", '"',)): result.append('([^%s])' % text) elif 'regexp' in keys: result.append('(^(%s))' % text) else: result.append('(^%s)' % text) #spacebefore attr rule if ('spacebefore' in keys and not RuleModel.key_remover(keys, ['default', 'spacebefore', 'skip', 'inflected'])): if text and text.strip(): if not self.pattern.getchildren()[0] == element: if element.get('spacebefore') == 'no': result[-1] += text.strip() else: result[-1] = result[-1] + ' ' + text.strip() else: if element.get('spacebefore') == 'no': result.append('(w*)%s' % text.strip()) else: result.append('(w*) %s' % text.strip()) #spacebefore + regexp attr rule if ('spacebefore' in keys and 'regexp' in keys and not RuleModel.key_remover(keys, ['default', 'spacebefore', 'regexp', 'skip', 'inflected'])): if text and text.strip(): if not self.pattern.getchildren()[0] == element: if element.get('spacebefore') == 'no': result[-1] = ('(%s%s)' % (result[-1].translate(None, '()'), text.strip())) else: result[-1] = ('(%s %s)' % (result[-1].translate(None, '()'), text.strip())) else: if element.get('spacebefore') == 'no': result.append('()%s' % text.strip()) else: result.append('(() %s)' % text.strip()) # skip attr rule if 'skip' in keys: if element.get('skip') == '-1': result.append('(\w+ )*') else: result.append('(\w+ ){0,%d}' % int(element.get('skip'))) # rules for message # suggestion tag with no attrs or suggestion match tag with 1 attr if tag == 'suggestion' and not RuleModel.key_remover(keys, 'no'): if text and text.strip() and not keys: '''message suggestions appearance''' if [item.startswith('=') for item in result[1:]]: result.append('\\n%s' % text.strip()) suggestions.append('%s' % text.strip()) else: result.append('%s' % text.strip()) suggestions.append('%s' % text.strip()) # suggestion match rules for el in element.getchildren(): if el.tag == "match": match_no = int(el.get('no')) # match_el = self.pattern.getchildren()[match_no- 1] # print 'ZZZ', match_el.text result.append('\\%s' % (match_no)) suggestions.append('\\%s' % (match_no)) if el.tail and el.tail.strip(): result.append('%s' % el.tail.strip()) suggestions.append('%s' % el.tail.strip()) if tail and tail.strip(): suggestions.append(tail.strip()) # end for # if attr == 'message': if self.message.getchildren() and not result: '''in case of empty message''' raise TypeError('empty message!') '''message verbosity''' global did_you_mean if did_you_mean: result.append('#Did you mean?') else: result.append('#%s' % self.message.text.strip()) if self.message.tail and self.message.tail.strip(): result.append('%s' % self.message.tail.strip()) if suggestions is not None: for suggestion in suggestions: if suggestion is not None: result.append('%s' % suggestion) result = RuleModel.space_killer(result) return result class RuleView(object): '''adaptes rule's API, printer() method prints rule''' def __init__(self, rule, category): self.parse_pattern = RuleModel(rule).parse('pattern') self.pref = self.parse_pattern[0] self.pattern = self.parse_pattern[1:] self.parse_message = RuleModel(rule).parse('message') self.ix = self.parse_message[0] self.message = self.parse_message[1:] self.prefix = list(self.pref) + list(self.ix) self.id = rule.get('id')[0:15] if rule.get('id') else 'Unknown' self.rule = rule self.category = category self.supported_keys = ['regexp', 'scope', 'spacebefore', 'negate'] self.key_to_print = None self.keys = RuleModel.nesting_list_killer([i.keys() for i in self.rule.iterdescendants()]) @staticmethod def aggregate(iter1, iter2): set1 = set(iter1) set2 = set(iter2) aggregate = set1 & set2 return list(aggregate) def sys_argv(self): supported_args = {'-short': 'Print \"Did you mean?\". ' 'Default: Print full message', '-file': 'Dump rules to \'rules.txt\' file', '-attr': 'Print tags\'s attr list ' 'before rule if any', '-show=attr': 'Incompatible with other ' ' keys except maybe -short :)'} if len(sys.argv) > 1: if '-short' in sys.argv: global did_you_mean did_you_mean = True if '-file' in sys.argv: sys.stdout = codecs.open('rules.txt', encoding='utf-8', mode='a+') if '-attr' in sys.argv: if self.prefix: print sorted(list(set(self.prefix))), '=>', show_attr = [i for i in sys.argv if i.startswith('-show=')] if show_attr: if len(show_attr) == 1: self.key_to_print = show_attr[0][6:] else: raise TypeError('Too many "show" arguments') if False in [el in supported_args.keys() for el in sys.argv[1:] if not el.startswith('-show=')]: print '\n-*-sys.argv Error-*-' print '\nYou printed: python', for i in sys.argv: print i, print ('\nUsage: python %s [ Keys ]\n\n Keys:' % sys.argv[0]) for i, j in sorted(supported_args.items()): print '{0:<20}{1}'.format(i, j) sys.exit(1) @staticmethod def print_element(element): for el in element: print el, def printer(self): if (self.pattern and self.message and 'Not supported' not in self.pattern and 'Not supported' not in self.message and 'Not implemented' not in self.pattern and 'Not implemented' not in self.message): sys.stdout = open('ok.txt', 'a+') ET.dump(self.rule) sys.stdout = sys.__stdout__ RuleView.sys_argv(self) ''' if not did_you_mean: print (self.rule.get('id') if self.rule.get('id') else self.rule.getparent().get('id')) ''' if self.key_to_print: if self.key_to_print in self.prefix: if self.key_to_print in self.supported_keys: sys.stdout = sys.__stdout__ else: sys.stdout = codecs.open(os.devnull, encoding='utf-8', mode='w') global number global amount number += 1 ############### ''' API's "marker" difference handler''' if ('marker' in [el.tag for el in self.rule.find('pattern').getchildren()]): ''' regexp in marker => suggestion_counters +=1''' for string in self.message: if '\\' in string: try: parts = string.split('\\') rest = [] for el in parts[1:]: el = str(int(el[0]) + 1) + el[1:] rest.append(el) result = '\\'.join([parts[0], ] + rest) self.message[self.message.index(string)] = result except ValueError: pass self.message.append('\n') ############### RuleView.print_element(self.pattern) ############### ''' API's '<- option[...] ->' handler''' print '<- option("%s")' % self.category.get('name'), try: ''' marker in pattern => -%d> in result''' marker = [el.tag for el in self.rule.find('pattern').getchildren()].index('marker') + 1 if not 'skip' in self.keys: print '-%d>' % marker, else: print '-%d>' % (marker + 1), except ValueError: print '->', ############### RuleView.print_element(self.message) ############### For debug purposes only. elif ('Not implemented' in self.pattern or 'Not implemented' in self.message and 'Not supported' not in self.pattern and 'Not supported' not in self.message): global to_implement to_implement += 1 # print ET.dump(self.rule) sys.stdout = open('notimplemented.txt', 'a+') ET.dump(self.rule) sys.stdout = sys.__stdout__ elif ('Not supported' in self.pattern or 'Not supported' in self.message and 'Not implemented' not in self.pattern and 'Not implemented' not in self.message): global no_support no_support += 1 sys.stdout = open('unsupported.txt', 'a+') ET.dump(self.rule) sys.stdout = sys.__stdout__ class RuleController(object): '''flow control''' def __init__(self): try: os.remove(os.path.join(os.getcwd(), 'unsupported.txt')) except OSError: pass try: os.remove(os.path.join(os.getcwd(), 'notimplemented.txt')) except OSError: pass try: os.remove(os.path.join(os.getcwd(), 'rules.txt')) except OSError: pass self.categories = ET.iterparse("grammar.xml", events=('end',), tag='category') def process(self): global number global amount for _event, category in self.categories: for rule in category.iter('rule'): amount += 1 RuleView(rule, category).printer() if not did_you_mean: percent = float(number) / amount * 100 print '\n%.3f %s of rules covered (%s/%s)' % (percent, chr(37), number, amount) global to_implement print '%s rules left to cover' % to_implement global no_support print '%s unsupported rules' % no_support RuleController().process() lightproof-1.5+git20140515/src/hu_HU/0000755000175000017500000000000012335137470015405 5ustar renerenelightproof-1.5+git20140515/src/hu_HU/ChangeLog0000644000175000017500000001566712335137465017202 0ustar renerene2014-01-20 László Németh : - űlltatok nincs aláhúzva hibaként, csak álltat (OOO-875: OpenScope.org) 2013-12-16 László Németh : - r i t k í t o t t szöveg felismerése (keskeny szóköz opció bekapcsolásánál), majd cserejavaslat nem törő keskeny szóközökre, ill. szóközök nélkülire. A funkciót Pénzes Dávid javasolta. - elromlott keskeny szóközös opció működésének visszaállítása - hosszú szavak hibás exponenciális idejű elemzésének javítása (lefagyást okozott más Python komponensek, pl. LibreLogo együttes használatával), a Lightproof lefagyását Pénzes Dávid, a LibreOffice lefagyást Lakó Viktória jelezte - tizedestört vagy sorszám: nem figyelmeztet, ha pont követi, tehát sorszám - nagy számok ezrestagolásánál többszörös illeszkedés javítása 2012-12-04 László Németh : - Python 3.3 támogatás 2012-08-23 László Németh : - „a 1,5” („a másfél”) nem névelőhasználati hiba. Pénzes Dávid hívta fel a figyelmet a problémára. - A 10%-al, 10-20%-al hibás alakok javítása, Pénzes Dávid javaslatára. 2012-02-02 László Németh : - rövidebb magyarázat a „több mint” esetén + URL - "-szám" alakoknál nem feltételez kötőjeles felsorolást 2011-12-16 László Németh : - beállítások csak a kiterjesztéskezelőben hozzáférhetők ideiglenesen - webes bővebb magyarázatok támogatása (FullCommentURL) a LibO 3.5-ben, pl. Fertő-tavi -> AkH. a Wikipédiában. - új opciók: - nagy kezdőbetű: mondatok kis kezdőbetűjének keresése - zárójelpárok és idézőjelek ellenőrzése - nem elválasztott szavak elválasztását kínálja fel (pl. megint -> me-gint, meg-int) - új szabályok: - időről-időre, egytől-egyig -> időről időre, egytől egyig - földrajzi nevek (Dél-Ázsiai -> Dél-ázsiai, Árpád-híd -> Árpád híd stb.) - 1-e -> 1-je - egyel kevesebb/több -> eggyel - előre hátra -> előre-hátra - ex-alelnök -> exalelnök stb. - "kell hogy" esetén nem erőlteti az esetenként hibás vesszőt - javított szabályok: - a/az névelőt csak a helyesírási szótárban meglévő szavak előtt ellenőriz - új licenc: MPL/GPL/LGPL 2011-07-11 László Németh : - javított csomagnév (Magyar nyelvi ellenőrzés) - új opciók: - három pont - dupla szóköz, sok szóköz - idézőjelek, nagykötőjel - törtek, indexek - mínuszjel - szóismétlés (egymást közvetlenül követő szavak) - mértékegységek - 2003. Március -> 2003. március: hónap neve kisbetűvel jelenik meg a javaslatban is - javaslat: a Unikum -> nagybetűvel jelenik meg, ahogy a szövegben szerepelt - 2005 március-júniusa már nem hibásnak jelezve - a Unicode, a Unix most már nem hibás a névelővel sem - illetve hogy, illetve ha vessző nélkül - áld meg, mond el -> áldd meg, mondd el, ha a felszólítás felismerhető (mondat, tagmondathatár, esetleg "ne" szócskával bevezetve) - jó kedvel, rossz kedvel -> jó kedvvel, rossz kedvvel - halott róla, nem halottunk semmit -> hallott róla, nem hallottunk semmit - C-vitamin hiány -> C-vitamin-hiány - C-vitaminhiány -> C-vitamin-hiány (minden egybeírt összetételnél) - médiák, unszimpatikus kijelzése az opcionális stílusellenőrzésbe került - Budapest Liszt Ferenc Nemzetközi Repülőtér -> a többszörös helyesírási hiba kijelzése - felsorolások kötőjele, nagykötőjele aláhúzva egybeírás esetén: -Egy -> – Egy - 2011 július -> 2011. július (a július hiányzott az ellenőrzőtt hónapnevek közül) - kellet -> kellett (*nem kellet volna, *meg kellet ezt csinálnom, *várni is kellet - mértékegységek (mérföld, yard, láb, hüvelyk, °F, font súlyú, gallon, pint) átalakítása 2010-05-06 László Németh : - alapértelmezett ezreselválasztó-ellenőrzés kikapcsolása (Magyar Linux Libertine G Graphite automatikus ezreselválasztása miatt) 2010-02-19 László Németh : * hu_HU.dat: - "a" névelő + szám szabály javítása ("a 10") a regex match hiányzó $ jelének pótlásával - nem törő szóköz beillesztése a Celsius fok elé - a törtekre és egyéb jelekre vonatkozó tipográfiai opció bekapcsolása esetén nem törő szóköz helyett nem törő keskeny szóközt javasol a számok ezrestagolójaként, és ezt felismeri a pénzegység konzisztenciaellenőrzésénél is, valamint a régi nem törő szóközök cseréjét is javasolja. - Unicode vessző ékezet felvétele a valódi aposztrófot javasló szabályba (U+00B4 kódja miatt elöl van, és emiatt tévedésből könnyen beilleszthető) - idézőjeles szabályok bővítése: - ASCII idézőjelek cseréje: ,,valami >>volt<< ott.'' -> „valami »volt« ott.” - felcserélt belső idézőjelek cseréje - angolszász nem dupla idézőjelek cseréje - számok konzisztencia-ellenőrzésénél nem törő szóközök helyes felismerése 2010-02-12 László Németh : * hu_HU.dat: - sorszámok névelőjének ellenőrzése ("az" esetén alapból még szükséges az "oldal" stb. a sorszám után: pl. *"az 2. oldalon") * lightproof_handler.py: segédosztály megszüntetése a Mac OS X PyUNO hiba lehetséges okának kiküszöbölésére 2010-02-09 László Németh : * hu_HU.dat: - mínuszjel - szorzásjel javítása szóközök esetén is: 5 x 6 -> 5×6 - hibás névelőjavaslat tiltása római számoknál (a II., a III. stb.) - új feltételes szabályok: ligatúrák javaslata és elutasítása - nem törő szóköz és toldalékolás esetén is javasolva van a százalékjel tapadása; - javaslat évszámok előtti aposztróf esetén is ('76-ban) - pénznemek 1234,00 Ft és sima szóköz elfogadása, mint ezres tagoló (nem törő szóköz már korábban így volt kezelve): 34 500 Ft - fokjel javítása és egybeírása - törtek (ha van csak Unicode karakterrel, pl. 1/2, egyébként ha 1/x-ed, akkor "1/" Unicode karakterrel és alsó index Unicode karakterrel, különben felső index, törtjel és alsó index karakterekkel), indexek (H2O, H2SO4 stb.), fokok (Celsius, Fahrenheit jele külön Unicode karakterrel (szebb tipográfiájú pl. a Linux Libertine betűtípusban) * hu_HU.dlg: új feltételes szabályok: - ligatúrák javaslata és elutasítása - törtek, indexek, fokok menüpont - átcsoportosítás 2009-12-16 László Németh : * hu_HU.dlg: - Beállítások menü a magyar nyelvi ellenőrzéshez * hu_HU.dat: - opcionális szabályok: szóismétlés, képzett összetett szavak, (tizedes)vesszők ellenőrzése, stb. lightproof-1.5+git20140515/src/hu_HU/hu_HU.dlg0000644000175000017500000001031612054114510017072 0ustar renerene# Options and title texts for the Settings and conditional rules # # The Lightproof dialogs contain only grouped checkboxes. # # Format of the dialog definition: # # GroupID: OptionID, OptionID ... # Group2ID: OptionID, OptionID ... # ... # [Language_code=title of the window] # OptionID=title of the option # Option2ID=title of the option # # The first language is the default language for other locales # (use en_US or the common language of your country) # # The OptionIDs declared here are used in the rules, too. For example: # # foo <- option("style") -> bar # bar is far better # # this rule depends from the state of the "style" checkbox. # options (starred options are default checked ones) spelling: cap par, quot wordpart, *dash comma, numpart grammar proofreading: style *dup0, compound dup, allcompound dup2, *money dup3, SI hyphen typography: *apost *spaces frac ligature, elli spaces2 thin noligature, idx minus - - # titles [en_US=Hungarian sentence checking] spelling=Spelling cap=Capitalization par=Parentheses wordpart=Word parts of compounds comma=Comma usage proofreading=Proofreading style=Style checking compound=Underline typo-like compound words allcompound=Underline all generated compound words grammar=Possible mistakes money=Consistency of money amounts duplication=Word duplication dup0=Word duplication dup=Duplication within clauses dup2=Duplication within sentences dup3=Allow previous checkings with affixes numpart=Thousand separation of numbers typography=Typography quot=Quotation marks apost=Apostrophe dash=En dash elli=Ellipsis ligature=Ligature suggestion noligature=Underline ligatures frac=Fractions thin=Thin space spaces=Double spaces spaces2=More spaces idx=Indices minus=Minus SI=Measurements hyphen=Hyphenation of ambiguous words [hu_HU=Magyar mondatellenőrzés] spelling=Helyesírás cap=Nagy kezdőbetű\nMondatok nagy kezdőbetűjének ellenőrzése. par=Zárójelek\nZárójelpárok ellenőrzése. wordpart=Egybe- és különírási javaslatok comma=Vesszőhasználatra vonatkozó javaslatok\nA valószínűleg hiányzó és felesleges vesszők jelzése. numpart=Nagy számok tagolása szóközökkel\nEzrestagolás nem-törő szóközökkel (10000 → 10 000). proofreading=Korrektúra style=Stílusellenőrzés compound=Egyszerű nem szótári összetett szavak\nRövid, vagy rövid tagot tartalmazó, szóösszetételi szabályok alapján gyakran hibásan elfogadott alakok aláhúzása. allcompound=Minden nem szótári összetett szó\nMinden szóösszetételi szabály alapján elfogadott alak aláhúzása. grammar=Javaslat kevésbé egyértelmű esetben is dup0=Szóismétlés\nSzóismétlés egymást közvetlenül követő szavak esetében. dup=Szóismétlés tagmondaton belül dup2=Szóismétlés mondaton belül dup3=Szóismétlés eltérő toldalékok esetén is money=Számok és átírásuk\nA számmal és számnévvel is leírt mennyiség megegyezik-e? (Pl. 10, azaz tíz Ft.) typography=Tipográfia quot=Idézőjelek\nA magyar „külső” és »belső« idézőjelek ellenőrzése. apost=Aposztróf\nAz írógépes aposztróf cseréje a tipográfiailag megfelelőre (' → ’). dash=Nagykötőjel és gondolatjel\nA kiskötőjel cseréje a nagykötőjelre (- → –). elli=Három pont\nHárom pont cseréje az egalizált három pont karakterre (...→…). frac=Törtek\nPerjellel elválasztott törtek cseréje Unicode karakterre (1/2 → ½). thin=Keskeny szóköz\nKeskeny szóköz (spácium) használata ezrestagoláshoz és más esetekben. ligature=f-ligatúra javaslata\nCsere Unicode f-ligatúrára. noligature=f-ligatúra tiltása\nUnicode f-ligatúra cseréje különálló betűkre. spaces=Dupla szóköz\nKét vagy három ismétlődő szóköz cseréje egyre. spaces2=Sok szóköz\nNégy vagy több ismétlődő szóköz cseréje egy tabulátorra. idx=Indexek\nSzámok cseréje mértékegységekben és kémiai képletekben valódi indexekre (m2 → m²). minus=Mínuszjel\nKötőjelek cseréje Unicode mínuszjelre a számok előtt. SI=Mértékegységek\nNem SI mértékegységek átalakítása (°F, mérföld, yard, láb, hüvelyk, gallon, pint, font súlyú). hyphen=Hiányzó elválasztás megadása\nNem egyértelműen elválasztható szóalakok elválasztásának megadása (pl. megint, fölül). lightproof-1.5+git20140515/src/hu_HU/hu_HU.cfg0000644000175000017500000000035012335137465017100 0ustar renerene[args] lang = hu_HU locales = hu_HU name = Lightproof grammar checker (magyar) version = 1.5 author = Laszlo Nemeth provider = FSF.hu implname = lightproof_hu link = http://www.fsf.hu extras = README_lightproof_hu_HU.txt, ChangeLog lightproof-1.5+git20140515/src/hu_HU/README_lightproof_hu_HU.txt0000644000175000017500000000025012054114510022411 0ustar renereneHungarian sentence checker for LibreOffice see git://anongit.freedesktop.org/libreoffice/lightproof 2009-2012 (c) László Németh, license: MPL 1.1 / GPLv3+ / LGPLv3+ lightproof-1.5+git20140515/src/hu_HU/hu_HU.dat0000644000175000017500000014101112335137465017111 0ustar renerene# magyar szabályok (írta: Németh László) ###################### szóismétlés ################### a a -> a # Szóismétlés. és és -> és # Szóismétlés. ############## hogy (l. még vesszőhasználat) ######### hogy[ -]hogy nem -> hogyhogy nem/hogy, hogy nem # Hiányzó vessző vagy egybeírás hogy-hogy -> hogyhogy # Egybeírás. [char] # hogy előtt vessző (csak igékre és főnevekre, vessző ne kövesse, mint a hogy, hogy nemben ([-\w]+) hogy\b(?![-]) <- word(1) and morph(\1, r"po:(vrb|noun)\b") and not \1 in [u"feltéve", "kell"] -> \1, hogy # Hiányzó vessző? [word] # még több vessző ([-\w]+) hogy <- option("comma") and not re.match(u"(feltéve|ahelyett|anélkül|aszerint|hogy)$", \1) -> \1, hogy # Hiányzó vessző? # túl sok vessző ([-\w]+), (ahelyett|anélkül|aszerint), hogy -> \1, \2 hogy|\1 \2, hogy # Kötőszószerű kapcsolat esetén nem írunk a „hogy” elé vesszőt. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Az_írásjelek#243. ([-\w]+), illetve, (ha|hogy) -> \1, illetve \2 # Kötőszószerű kapcsolat esetén nem írunk az „illetve” után vesszőt. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Az_írásjelek#243. ###################### nagybetűsítés ################# [code] abbrev=re.compile(r"(?i)\b([a-zöüóőúéáűíÖÜÓŐÚÉÁŰÍ]|Áe|Áht|AkH|al|ált|ápr|aug|Avtv|bek|Bp|br|bt|Btk|cca|ci(i|ii|v|x)?|cl(i|ii|iii|iv|ix|v|vi|vii|viii|x|xi|xii|xiii|xiv|xix|xv|xvi|xvii|xviii|xx|xxi|xxii|xxiii|xxiv|xxix|xxv|xxvi|xxvii|xxviii|xxx|xxxi|xxxii|xxxiii|xxxiv|xxxix|xxxv|xxxvi|xxxvii|xxxviii)?|Co|cv(i|ii|iii)?|cx(c|ci|cii|ciii|civ|cix|cv|cvi|cvii|cviii|i|ii|iii|iv|ix|l|li|lii|liii|liv|lix|lv|lvi|lvii|lviii|v|vi|vii|viii|x|xi|xii|xiii|xiv|xix|xv|xvi|xvii|xviii|xx|xxi|xxii|xxiii|xxiv|xxix|xxv|xxvi|xxvii|xxviii)?|cs|Csjt|Cstv|csüt|dec|dk|dny|dr|du|dz(s)?|egy|ék|ÉKsz|em|ény|Épt|érk|etc|Etv|eü|ev|évf|febr|felv|Flt|ford|főisk|fsz(la|t)?|Ftv|gimn|gör|gr|Gt|gy|Gyvt|habil|hg|hiv|Hjt|honv|Hpt|hrsz|hsz|Hszt|htb|id|ifj|ig(h)?|ii(i)?|ill|Inc|ind|isk|iv|ix|izr|jan|jegyz|júl|jún|kat|kb|Kbt|ker|kft|kgy|kht|kir|kiv|Kjt|kk(t)?|koll|korm|köv|kp|Kr|krt|Kt(v)?|ld|li(i|ii|v|x)?|Ltd|ltp|Ltv|luth|lv(i|ii|iii)?|lx(i|ii|iii|iv|ix|v|vi|vii|viii|x|xi|xii|xiii|xiv|xix|xv|xvi|xvii|xviii|xx|xxi|xxii|xxiii|xxiv|xxix|xxv|xxvi|xxvii|xxviii)?|ly|máj|márc|mat|max|mb|megh|megj|MHSz|min|mk|Mo|Mt|NB|nov|ny(á)?|Nyilv|nyrt|okl|okt|olv|op|orsz|ort|ov(h)?|össz|Ötv|özv|Pf|pl(d)?|prof|prot|Ptk|pu|ref|rk(p)?|róm|röv|rt|sgt|spec|stb|sz(ept|erk)?|Szjt|szoc|Szt(v)?|szül|Tbj|tc|tel|tkp|tszf|tvr|ty|ua|ui|úm|ún|uo|Ve|Vhr|vi(i|ii)?|vö|vsz|Vt(v)?|xc(i|ii|iii|iv|ix|v|vi|vii|viii)?|xi(i|ii|v|x)?|xl(i|ii|iii|iv|ix|v|vi|vii|viii)?|xv(i|ii|iii)?|xx(i|ii|iii|iv|ix|v|vi|vii|viii|x|xi|xii|xiii|xiv|xix|xv|xvi|xvii|xviii)?|zrt)\.") # pattern for paragraph checking paralcap = re.compile(u"(?u)^[a-zöüóőúéáűí].*[.?!] [A-ZÖÜÓŐÚÉÁŰÍ].*[.?!][)”]?$") [word] low [a-zöüóőúéáűí]+ ^{low} <- paralcap.search(TEXT) and not abbrev.search(TEXT) -> = {low}.capitalize() # Hiányzó nagy kezdőbetű? # optional sentence capitalization ^{low} <- option("cap") and not abbrev.search(TEXT) -> = {low}.capitalize() # Hiányzó nagy kezdőbetű? ###################### központozás ################### [char] abc [a-zöüóűőúéáí] ABC [A-ZÖÜÓŰŐÚÉÁÍ] Abc [a-zöüóűőúéáíA-ZÖÜÓŰŐÚÉÁÍ] word [a-zöüóűőúéáíA-ZÖÜÓŰŐÚÉÁÍ]+ punct [?!,:;%‰‱°„”] "^[-—] " <- option("dash") -> "– " # A gondolatjel nagykötőjel | http://hu.wikipedia.org/wiki/Nagykötőjel " [-—]([ ,;])" <- option("dash") -> " –\1" # A gondolatjel nagykötőjel | http://hu.wikipedia.org/wiki/Nagykötőjel # És - hogy is mondjam -, jó. -> És – hogy is mondjam –, jó. ^[-–]{word} <- option("dash") -> – {word} # Gondolatjel szóközzel a felsorolásnál | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Az_írásjelek#258. "[[][.][.][.]]" <- option("elli") -> […] # Három pont | http://hu.wikipedia.org/wiki/Három_pont # [...] -> […] [.][.][.] <- option("elli") -> … # Három pont | http://hu.wikipedia.org/wiki/Három_pont # Vége... -> Vége… " +([.?!,:;)”])\b" -> "\1 " # Felcserélt szóköz és írásjel? " +([.?!,:;)”])" -> \1 # Szóköz nélkül tapadó írásjel | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Az_írásjelek#239. # A ( kicsit ) más. -> A (kicsit) más. E ( |$) # space or end of sentence "[:,;]([.?!,;:]){E}" -> \1{E} # Felesleges írásjel. "\b[.][.]{E}" -> .{E}|…{E} # Pont vagy három pont? | http://hu.wikipedia.org/wiki/Három_pont #"\b[.]([?!]){E}" -> \1{E} # Felesleges írásjel. # És,, stb.? -> És, stb.? # És.. -> És.|… (\w){punct}{Abc} -> \1{punct} {Abc} # Hiányzó szóköz? {abc}[.]{ABC} -> {abc}. {ABC} # Hiányzó szóköz? # macska,bár -> macska, bár # macska.Bár -> macska. Bár (^|\b|{punct}|[.]) {2,3}(\b|$) <- option("spaces") -> "\1 " # Felesleges szóköz. # dupla szóköz. Itt három. -> dupla szóköz. Itt három. (^|\b|{punct}|[.]) {4,}(\b|$) <- option("spaces2") -> "\1 |\1 " # Szóközök cseréje egy szóközre vagy tabulátorra: (?i)(\d+)(x| x )(\d+(-\w+)?) -> \1×\3|\1 · \3 # Szorzásjel. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Az_írásjelek#275. # 5 x 6 -> 5 × 6 # 800x600-as -> 800×600-as b {Abc}* (?i){word}['´]{b} <- option("apost") -> {word}’{b} # Valódi aposztróf. | http://hu.wikipedia.org/wiki/Aposztróf # biz' isten -> biz’ isten # ’79-ben ['´](\d\d(-\w+)?) <- option("apost") -> ’\1 # Valódi aposztróf. | http://hu.wikipedia.org/wiki/Aposztróf [)] <- option("par") and not "(" in TEXT -> # Felesleges zárójel? ######################## idézés ###################### (?i)[\"“”‟„]({word}[^\"“”‟„]*)[\"“‟] <- option("quot") -> „\1” # Idézőjelek. | http://hu.wikipedia.org/wiki/Idézőjel (?i)[\"“”‟]({word}[^\"“”‟„]*)[\"“”‟] <- option("quot") -> „\1” # Idézőjelek. | http://hu.wikipedia.org/wiki/Idézőjel # A "kicsi" macska. -> A „kicsi” macska. # ASCII idézőjelek cseréje (,,vmi'', >>vmi<<) (?i),,({word}[^\"“”‟„><']*)'' -> „\1” # Idézőjelek. | http://hu.wikipedia.org/wiki/Idézőjel (?i)>>({word}[^\"“”‟„><']*)<< -> »\1« # Idézőjelek. | http://hu.wikipedia.org/wiki/Idézőjel # angolszász idézőjelek cseréje (?i)‘+({word}[^\"“”‟„’]*)’+ -> „\1”|»\1« # Idézőjelek. | http://hu.wikipedia.org/wiki/Idézőjel [Word] "([(„»]) +" -> \1 # Szóköz nélkül tapadó írásjel. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Az_írásjelek#239. " +([«])" -> \1 # Szóköz nélkül tapadó írásjel. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Az_írásjelek#239. (?i)«({word}[^\"“”‟„’]*)» -> »\1« # Felcserélt belső idézőjelek. | http://hu.wikipedia.org/wiki/Idézőjel ############### pénz ################################# [Word] # 1 Ft (azaz két forint) -> 1 Ft (azaz egy forint) # 200.000,- Ft, azaz egyszázezer forint -> 100.000,- Ft, azaz kétszázezer forint (\d[\d   .]*)(,?(?:[-–]|00?)? Ft(?:-\w+)?(?: \(|, )(?:azaz|vagyis) )([-\w]+)( forint\w*\)?) <- option("money") and # test NUMBERTEXT function access calc("NUMBERTEXT", ("1", "hu")) and calc("NUMBERTEXT", (re.sub(u"[   .]", "", \1), "hu")).replace(u"kettő", u"két").replace(u"ezeregyszáz", u"ezerszáz") != # változatok: száz vagy egyszáz, ezer vagy egyezer, kettő vagy két re.sub(r"\begy(száz|ezer)", r"\g<1>", \3).replace(u"ezeregyszáz", u"ezerszáz").replace(u"kettő", u"két") -> = \1 + \2 + calc("NUMBERTEXT", (re.sub(u"[   .]", "", \1), "hu")) + \4 # A két összeg nem egyezik. #################### ritkított szöveg ################ # r i t k í t o t t -> ritkított ({Abc}[  ]){4,}{Abc}\b <- option("thin") -> =re.sub("[  ]", "", \0) + "\n" + re.sub("[  ]", " ", \0) # Ritkítás nélkül vagy nem törő keskeny szóközökkel: ######################## számok ###################### [Word] # nagy számok tagolása nem törő szóközökkel (U+00A0) d1 −?\d{1,3} # 1, 2 vagy 3 számjegy (opcionális mínusszal) d2 −?\d{2,3} # 2 vagy 3 számjegy (opcionális mínusszal) d3 \d{3} # 3 számjegy dn \d{3}(?![  ][0-9])(,\w{1,4})?[%‰‱°]?(-\w+)? # 3 számjegy, toldalékkal is {d2}{dn} <- option("numpart") and not option("thin") -> {d2} {dn} # Nagy számok tagolása. (AkH. 274.) {d1}{d3}{dn} <- option("numpart") and not option("thin") -> {d1} {d3} {dn} # Nagy számok tagolása. (AkH. 274.) {d1}{d3}{d3}{dn} <- option("numpart") and not option("thin") -> {d1} {d3} {d3} {dn} # Nagy számok tagolása. (AkH. 274.) # Az 1234567890 -> Az 1 234 567 890 # nagy számok tagolása nem törő keskeny szóközökkel (U+202F) (thin opciótól függően) {d2} ?{dn} <- option("numpart") and option("thin") -> {d2} {dn} # Nagy számok tagolása nem törő keskeny szóközökkel. (AkH. 274.) {d1} ?{d3} ?{dn} <- option("numpart") and option("thin") -> {d1} {d3} {dn} # Nagy számok tagolása nem törő keskeny szóközökkel. (AkH. 274.) {d1} ?{d3} ?{d3} ?{dn} <- option("numpart") and option("thin") -> {d1} {d3} {d3} {dn} # Nagy számok tagolása nem törő keskeny szóközökkel. (AkH. 274.) # nagy számok tagolása nem törő szóközökkel (U+00A0) d1 \d{1,3} # 1, 2 vagy 3 számjegy (opcionális mínusszal) d2 \d{2,3} # 2 vagy 3 számjegy (opcionális mínusszal) d3 \d{3} # 3 számjegy dn \d{3}(,\w+)?[%‰‱°]?(-\w+)? # 3 számjegy, toldalékkal is -{d2}{dn} <- option("numpart") and not option("thin") -> −{d2} {dn} # Nagy számok tagolása. (AkH. 274.) -{d1}{d3}{dn} <- option("numpart") and not option("thin") -> −{d1} {d3} {dn} # Nagy számok tagolása. (AkH. 274.) -{d1}{d3}{d3}{dn} <- option("numpart") and not option("thin") -> −{d1} {d3} {d3} {dn} # Nagy számok tagolása. (AkH. 274.) # nagy számok tagolása nem törő keskeny szóközökkel (U+202F) -{d2} ?{dn} <- option("numpart") and option("thin") -> −{d2} {dn} # Nagy számok tagolása nem törő keskeny szóközökkel. (AkH. 274.) -{d1} ?{d3} ?{dn} <- option("numpart") and option("thin") -> −{d1} {d3} {dn} # Nagy számok tagolása nem törő keskeny szóközökkel. (AkH. 274.) -{d1} ?{d3} ?{d3} ?{dn} <- option("numpart") and option("thin") -> −{d1} {d3} {d3} {dn} # Nagy számok tagolása nem törő keskeny szóközökkel. (AkH. 274.) ([-−]?\d[\d,]*)[  ]([%‰‱°](-\w*)?) -> \1\2 # Szóköz nélkül tapadó írásjel. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Az_írásjelek#275. ([-−]?\d\d*)[.](\d\d*)\b(?![.])([%‰‱°](-\w*)?) <- option("comma") -> \1,\2\3 # Tizedesvessző a helyes írásjel. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#291. (\d\d*)[.](\d)\b(?![.]) # kivéve, ha tulajdonnév előzi meg (pl. Firefox 3.5 <- option("comma") and (not word(-1) or not re.match("[A-Z]", word(-1))) -> \1,\2|\1.\2. # Tizedestört (AkH. 291.) vagy sorszám? ((\d\d*[.]){2}\d)\b(?![.]) # kivéve, ha tulajdonnév előzi meg (pl. Hunspell 1.2.8, <- option("comma") and option("grammar") and not word(-1) or not re.match("[A-Z]", word(-1)) -> \1. # A sorszámot pont követi. (\d\d\d+)[.](\d\d)\b(?![.]) <- option("comma") -> \1,\2|\1.\2. # Tizedestört (AkH. 291.) vagy sorszám? # 25.30˚, de 10.20-kor -> 25,30˚, de 10.20-kor # 1.5 -> 1,5|1.5. # 123.5 -> 123,5|123.5. # mínuszjel -(\d+([  ]\d\d\d){0,3}(,\d+)?[%‰‱°]?(-\w+)?) <- option("minus") -> −\1 # Mínuszjel kiskötőjel helyett. -(\d+([  ]\d\d\d){0,3})[.](\d+[%‰‱°]?(-\w+)?) <- option("minus") -> −\1,\2 # Mínuszjel és tizedesvessző. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#291. (−\d+([  ]\d\d\d){0,3})[.](\d+[%‰‱°]?(-\w+)?) -> \1,\2 # Tizedesvessző pont helyett. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#291. ######################## fok ######################### [word] # 12°-kal ([-−]?\d+(?:,\d+)?)[  ](°(-\w+)) -> \1\2 # Szóköz nélkül tapadó írásjel (AkH. 239.) # 12 °C-kal ([-−]?\d+(?:,\d+)?)((°C|°F|℃|℉)(-\w+)?) -> \1 \2 # Nem törő szóközzel elválasztott mértékegység. ######################## %-al ######################## # 10%-al, 10-20%-al (([-−]?\d+(,\d+)?[-–])?[-−]?\d+(,\d+)?)%-al -> \1%-kal # Hiányos toldalék. ######################## dátumok ##################### [word] year [12]\d\d\d monthnum 0?[1-9]|1[012] month január|február|március|április|május|június|július|augusztus|szeptember|október|november|december|jan[.]|febr[.]|márc[.]|ápr[.]|máj[.]|jún[.]|júl[.]|aug[.]|szept[.]|okt[.]|nov[.]|dec[.] Month Január|Február|Március|Április|Május|Június|Július|Augusztus|Szeptember|Október|November|December day [12]\d|3[01]|0?[1-9] notmonthposs (|[^-–jaáeé][a-zöüóűőúéáí]*) # 2010 június-július notmonthcomp [-–]{month}{notmonthposs} # XXX: sentence boundary modification \b{year}[.] {Month}\b -> = {year} + ". " + {Month}.lower() # A hónap nevét kisbetűvel írjuk. (AkH. 144.) year2 \d\d {year} {month}{notmonthposs} -> {year}. {month}{notmonthposs} # Az évszám után itt pontot írunk. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#294. {year} {month}{notmonthcomp} -> {year}. {month}{notmonthcomp} # Az évszám után itt pontot írunk. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#294. {year} évi -> {year}. évi # Az évszám után itt pontot írunk. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#294. {year}[-–]{year2} évi -> {year}–{year2}. évi # Az évszám után itt pontot írunk. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#294. # 2005 január -> 2005. január # 1999 augusztusban -> 1999. augusztusban # 2009-10 évi -> 2009–10. évi nu folyamán|előtti?|utáni?|közötti?|nyara|nyará\w+|tele|telé\w+|tavasza|tavaszá\w+|ősze|őszé\w+ \b{year}[.] {nu}\b -> {year} \g # Az évszám után itt nem írunk pontot. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#295. # 1974. előtti -> 1974 előtti monthposs ([jaáe]|é\w)\w* \b{year}[.] {month}{monthposs}\b -> {year} {month}{monthposs} # Az évszám után itt nem írunk pontot. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#295. # 1999. augusztusában -> 1999 augusztusában [char] optdot ([.]|) text [^\s][^\s]* w \w* djel [ ,;:?!] (?i)\b{month} {day}[.]-{w} -> {month} {day}-{w} # A nap után itt nem írunk pontot. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#296. (?i)\b{month} {day}{djel} -> {month} {day}.{djel} # Ha dátum, hiányzik a pont. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#296. # március 15.-én -> március 15-én # március 15 volt. -> március 15. volt. nu óta|előtti?|utáni?|közötti? (?i)\b{month} {day} {nu} -> {month} {day}. {nu} # A nap után itt pontot írunk. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#297. # március 15 óta -> március 15. óta (?i)\b{month} {day}[.] és {day} {nu} -> {month} {day}. és {day}. {nu} # A nap után itt pontot írunk. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#297. (?i)\b{month} {day} és {day}[.]? {nu} -> {month} {day}. és {day}. {nu} # A nap után itt pontot írunk. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#297. # március 15. és 27 között -> március 15. és 27. között # március 15 és 27. között -> március 15. és 27. között # március 15 és 27 között -> március 15. és 27. között (?i)\b{month} {day}[-–]{day} {nu} -> {month} {day}–{day}. {nu} # A nap után itt pontot írunk. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#297. (?i)\b{month} {day}-{day}. {nu} -> {month} {day}–{day}. {nu} # A napok közé nagykötőjelet írunk. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#297. # március 15-22. között -> március 15–22. között # március 15-22 között -> március 15–22. között \b{year}[.]{monthnum}[.]{day}{optdot}{text} -> {year}. {monthnum}. {day}{optdot}{text} # Szóköz a dátumban. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#293. # 2009.05.12. -> 2009. 05. 12. # 1. = elseje e e|i|ei\w*|é\w+ (?i){month} 1[.]?-{e}\b -> {month} 1-j{e} # Elseje számjegyes írása. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#296. # május 1-i -> május 1-ji # május 1-ei -> május 1-jei # május 1-én -> május 1-jén # április 1-étől május 1-ig -> április 1-jétől május 1-ig ########################## stb. ###################### #W \w+ # word # tagmondatok és mondatrészek megkülönböztetéséhez mondatelemzés kell #([(]|\w+: )(({W}, )+{W};( {W}[,;])* {W})[,]? stb. -> \1\2; stb. # Stb. előtt itt pontosvessző van. (AkH. 247/b) | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Az_írásjelek#247. #([(]|\w+: )(({W}, )*{W}), stb. -> \1\2 stb. # Stb. előtt itt nincs vessző. (AkH. 247/d) | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Az_írásjelek#247. \bstb[.], stb[.] -> stb. stb.|stb.; stb. # Két stb. közé nem teszünk vesszőt. ## Madarak: rigó, cinke, veréb, stb. -> Madarak: rigó, cinke, veréb stb. ## Állatok (rigó, cinke; nyúl, pocok stb.) -> Állatok (rigó, cinke; nyúl, pocok; stb.) # stb., stb. -> stb. stb.|stb.; stb. #################### rövidítések ##################### [word] (db|Ft)[.](?= {abc}) -> \1 # Nem ponttal írjuk ezt a rövidítést. (db|Ft)[.](?=[,;:]) -> \1 # Nem ponttal írjuk ezt a rövidítést. # 25 db. vmi -> 25 db vmi ##################### nagykötőjel #################### [char] country albán|amerikai|angol|belga|bolgár|bosnyák|brit|ciprusi|cseh|dán|észt|finn|francia|görög|holland|horvát|ír|japán|kínai|lengyel|lett|litván|macedón|magyar|máltai|német|norvég|olasz|orosz|osztrák|portugál|román|spanyol|svájci|svéd|szerb|szlovák|szlovén|török|ukrán (?i)\b{country}-{country}\b -> {country}–{country} # Népnevek közé nagykötőjelet teszünk. # magyar-német -> magyar–német # year2: Az 1000-1500 vagylagos összetételek kizárására year2 (1\d\d[1-9]|1\d[1-9]\d|20\d[1-9]|20[1-9]\d) "\b{year2}-{year}\b " -> "{year}–{year} " # Évszámok közé nagykötőjelet teszünk. "\b{year}-{year2}\b " -> "{year}–{year} " # Évszámok közé nagykötőjelet teszünk. "\b{year}-(\d\d)\b " -> "{year}–\2 " # Évszámok közé nagykötőjelet teszünk. # 1998-2000 -> 1998–2000 # 1998-99 -> 1998–99 ([A-ZÖÜÓŰŐÚÉÁÍ]\w*)-(\d+(-\w+)?) -> \1–\2 # Típusnév és -szám közé nagykötőjelet teszünk. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Az_írásjelek#263. # UTF-8 -> UTF–8 # Apolló-13-nak -> Apolló–13-nak pp[.] (\d+)-(\d+)[.] -> pp. \1–\2. # Oldalszámok közé nagykötőjelet teszünk. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Az_írásjelek#263. (\d+)-(\d+)[.] (o[.]|oldal\w*) -> \1–\2. \3 # Oldalszám # 10-12. oldalon -> 10–12. oldalon " (u[.]|utca|út|tér) (\d\d*)-(\d\d*)[.]" -> " \1 \2–\3." # Nagykötőjel a házszámban. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Egyéb_tudnivalók#298. # Széna tér 123-125. -> Széna tér 123–125. ###################### helyesírás #################### [Word] ne játs(zunk|zatok|zanak) -> ne játss\1 # Helyesírási hiba. ###################### kifejezések ################### [Word] [aá] la carte -> à la carte # Helyesen à la carte. álltat -> áltat # Áltat, hiteget értelemben egy l-lel írjuk. önáll(tat[óá]\w*) -> önál\1 # Helyesen egy l-lel. belsőséges -> bensőséges|belsőségből készült # Szótévesztés vagy szójáték? dehogy is -> dehogyis # Egybeírás „egyáltalán nem” jelentésben. dehogy nem -> dehogynem # Egybeírás „de igen” jelentésben. dehogyis nem -> dehogyisnem # Egybeírás „de igen” jelentésben. eképpen -> ekképpen # Helyesen két k-val. egyel (több\w*|kevesebb\w*) -> eggyel \1 # 1-gyel értelemben hosszú gy-vel írjuk. egyenlőre -> egyelőre|egyformára|döntetlenre|egyenlő számúra|azonos méretűre # Helyesírási (egyelőre) vagy stílushiba (egyformára). egyi(vású\w*) -> egyí\1 # Hosszú í-vel helyes. egytől-egyig -> egytől egyig # Kötőjel nélkül írjuk. előre hátra -> előre-hátra # Kötőjellel írjuk. előre láthatólag -> előreláthatólag # Egybeírás. email: -> e-mail: # e-mail (elektronikus levél) email-lel -> e-maillel # e-mail (elektronikus levél) e(mail[ -]|-mail-|-mail)(cím\w*) -> e-mail \2 # Helyesen e-mail cím. ex[- ](\w+) <- spell("ex" + \1) -> ex\1 # Egybeírás. figyelemre(méltó\w*) <- word(-1) != "igen" -> figyelemre \1 # Különírás (kivéve: „igen figyelemreméltó”). igen figyelemre (méltó\w*) -> igen figyelemre\1 # Egybeírás. (állat|csepp|csillag|ék|ellipszis|ember|félgömb|félkör|gáz|gömb|gúla|harang|háromszög|hasáb|hatszög|henger|kagyló|kereszt|kocka|korong|kör|körte|kúp|négyszög|négyzet|nyereg|patkó|piramis|piskóta|szivar|tojás|tölcsér|trapéz|vese)(formájú|alakú) -> \1 \2 # Különírás. fő(irány\w*|közlekedés\w*|szabály\w*|szervező\w*) -> fő \1 # A „fő mű”-höz hasonlóan különírjuk. hátba (támadás\w*) -> hátba\1 # Egybeírás. időről-időre -> időről időre # Különírás. jing és jang -> jin és jang # Helyesen jin és jang. kőr((öz|út|ut)\w*) <- morph(\0, r"st:kőr\b") -> kör\1 # Rövid ö-vel a kör összetételeiben. légyszíves -> légy szíves|legyél szíves # Legyél szíves értelemben különírjuk. legalább is -> legalábbis # Egybeírás. Lichten(stein\w*) -> Liechten\1 # Helyesen Liechtenstein. mellékhely(ség\w*) -> mellékhelyi\1 # Helyiség, mint szoba. mú(landó\w*) -> mu\1 # Helyesen rövid u-val. nembiztos -> nem biztos # Különírás. originált -> originál|eredeti|bontatlan # Ha nem tárgyesetben van, „t” nélkül írjuk. (szén|kén|mangán|nitrogén|ón|titán|tórium)(dioxid\w*) -> \1-\2 # Kötőjeles alak. (szén|kén|nitrogén)(monoxid\w*) -> \1-\2 # Kötőjeles alak. továbbittunk -> továbbítunk|tovább ittunk # Helyesírási hiba. [char] # Mivel az "un." rövidítésként szerepel az OpenOffice.org-ban, nagybetűs folytatás esetén nem húzzuk alá \bun[.] <- word(1) and not re.match(u"[A-ZÖÜÓŰŐÚÉÁÍ]", word(1)) -> ún. # Úgy nevezett rövidítése ún. (AkH. 282.) (?i)\bvíz(hang\w*)\b -> vissz\1 # Szótévesztés? #################### nyelvtani szabályok ################## # az "a" névelő (kivétel: a 4. a osztályban, a II. világháború, az A alaphang...) a [aA] aword [aáeéiíoóöőuúüűAÁEÉIÍOÓÖŐUÚÜŰ]\w* ^[aA] {aword} <- not re.match(r"(?i)i(ii?|[vx])$|Unicode$|Unix\w*$", {aword}) and spell({aword}) -> az {aword} # Hibás névelő? (? {a}z {aword}|{aword} # Hibás vagy felesleges névelő? # A 4. a osztály a órán az A alaphangot -> A 4. a osztály az órán|órán az A alaphangot # névelők és számok [Word] a(?! 1,5\b) <- word(1) and re.match(r"(1|5\d*|[15]\d\d\d)[.]?$", word(1)) -> az # Hibás névelő. az <- not option("grammar") and word(2) and re.match(r"(alfejezet|alszakasz|ábr|bekezdés|diagram|fejezet|kép|lap|oldal|paragrafus|szakasz|táblázat)\w*", word(2)) and re.match(r"([02-46-9]|[1-46-9]\d|[1-46-9]\d\d|[2346-9]\d\d\d)[.]", word(1)) -> a # Hibás névelő? az <- option("grammar") and word(1) and re.match(r"([02-46-9]|[1-46-9]\d|[1-46-9]\d\d|[2346-9]\d\d\d)[.]", word(1)) -> a # Hibás névelő? # g = gramm num \d+|\d+,\d+ {num} gr[.]?-mal -> {num} g-mal # grammal rövidítése g-mal (AkH. 286.) # 25 gr-mal -> 25 g-mal # 25,2 gr.-mal -> 25,2 g-mal [char] hw [a-zA-ZöüóűőúéáíÖÜÓŰŐÚÉÁÍ][a-zA-ZöüóűőúéáíÖÜÓŰŐÚÉÁÍ]* " A vitamin{w}" -> " A-vitamin{w}" # Kötőjeles név. [word] ([B-Z]) vitamin{w} -> \1-vitamin{w} # Kötőjeles név. ([A-Z])-(vitamin)(\w+) <- morph(\2+\3, "pa:") -> \1-vitamin-\2 # Két kötőjellel írt alak. # vitaminhiány külön szerepel a szótárban, ezért szóköz nélkül is javítani kell ([A-Z])-(vitamin) *(hiány) -> \1-\2-\3 # Két kötőjellel írt alak. [char] (?i)\bnyílt szívű{w} -> nyíltszívű{w} # Egybeírás. (?i)\bjó szándékú{w} -> jószándékú{w} # Egybeírás. (?i)közös lónak túrós -> közös lónak túros # Helyes kifejezés. (?i)\bnejlon harisnya\b -> nejlonharisnya # Egybeírás. (?i)\boda-vissza{hw} -> oda-vissza {hw} # Különírás. (?i)\bpro és kontra\b -> pró és kontra # Helyes latin kifejezés. (?i)\brákövetkez{hw} -> rá következ{hw} # Különírás. (?i)\btáj jellegű{w} -> tájjellegű{w} # Egybeírás. (?i)([stluv])-alakú{w} -> \1 alakú{w} # Különírás. # B vitamin -> B-vitamin # Pro és kontra -> Pró és kontra # oda-visszamentek -> oda-vissza mentek # S-alakúakat -> S alakúakat (\d\d*)-szobás{w} -> \1 szobás{w} # Különírás. (\d\d*)-részes{w} -> \1 részes{w} # Különírás. # 5-szobásat -> 5 szobásat [word] event (Advent|Húsvét|Karácsony|Mindenszentek|Pünkösd|(Anyák|Apák|Halottak|Nők) [Nn]apj){abc}+ {event} <- word(-1) and word(1) == word(1).lower() -> = {event}.lower() # Kisbetűs kifejezés, ha nem cím. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/A_kis_és_a_nagy_kezdőbetűk#145. # Nemsokára Anyák napja. -> Nemsokára anyák napja. [char] kw ([-][a-zA-ZöüóűőúéáíÖÜÓŰŐÚÉÁÍ][a-zA-ZöüóűőúéáíÖÜÓŰŐÚÉÁÍ]*)? foci ([Ev])[bB]{kw} -> foci-\1b{kw} # Kötőjeles kifejezés. # foci EB -> foci-Eb # foci vb-ről -> foci-vb-ről ^Kétség kívül -> Kétségkívül # Egybeírás. # Kétség kívül -> Kétségkívül [Word] alig alig -> alig-alig # Kötőjeles szókettőzés. (AkH. 97.) ki ki -> ki-ki # Kötőjeles szókettőzés. (AkH. 97.) is is -> is-is # Kötőjeles szókettőzés. (AkH. 97.) kinek kinek -> kinek-kinek # Kötőjeles szókettőzés. (AkH. 97.) körbe körbe -> körbe-körbe # Kötőjeles szókettőzés. (AkH. 97.) közbe közbe -> közbe-közbe # Kötőjeles szókettőzés. (AkH. 97.) külön külön -> külön-külön # Kötőjeles szókettőzés. (AkH. 97.) már már -> már-már # Kötőjeles szókettőzés. (AkH. 97.) más más -> más-más # Kötőjeles szókettőzés. (AkH. 97.) messze messze -> messze-messze # Kötőjeles szókettőzés. (AkH. 97.) nagyon nagyon -> nagyon-nagyon # Kötőjeles szókettőzés. (AkH. 97.) néha néha -> néha-néha # Kötőjeles szókettőzés. (AkH. 97.) olykor olykor -> olykor-olykor # Kötőjeles szókettőzés. (AkH. 97.) túl túl -> túl-túl # Kötőjeles szókettőzés. (AkH. 97.) sok sok -> sok-sok # Kötőjeles szókettőzés. (AkH. 97.) úgy úgy -> úgy-úgy # Kötőjeles szókettőzés. (AkH. 97.) csip csup -> csip-csup # Kötőjeles ikerszó. (AkH. 103.) éhen szomjan -> éhen-szomjan # Mellérendelő szókapcsolat. (AkH. 100.) ingó bingó -> ingó-bingó # Kötőjeles ikerszó. (AkH. 103.) sebbel lobbal -> sebbel-lobbal # Mellérendelő szókapcsolat. (AkH. 100.) szegről végről -> szegről-végről # Mellérendelő szókapcsolat. (AkH. 100.) széltében hosszában -> széltében-hosszában # Mellérendelő szókapcsolat. (AkH. 100.) szőröstül bőröstül -> szőröstül-bőröstül # Mellérendelő szókapcsolat. (AkH. 100.) szőrén szálán -> szőrén-szálán # Mellérendelő szókapcsolat. (AkH. 100.) télen nyáron -> télen-nyáron # Mellérendelő szókapcsolat. (AkH. 100.) testestől lelkestől -> testestől-lelkestől # Mellérendelő szókapcsolat. (AkH. 100.) testestül lelkestül -> testestül-lelkestül # Mellérendelő szókapcsolat. (AkH. 100.) többé kevésbé -> többé-kevésbé # Mellérendelő szókapcsolat. (AkH. 100.) törik szakad -> törik-szakad # Mellérendelő szókapcsolat. (AkH. 100.) tűzön vízen -> tűzön-vízen # Mellérendelő szókapcsolat. (AkH. 100.) tűzzel vassal -> tűzzel-vassal # Mellérendelő szókapcsolat. (AkH. 100.) véges végig -> véges-végig # Mellérendelő szókapcsolat. (AkH. 100.) tüskén bokron -> tüskén-bokron # Mellérendelő szókapcsolat. (AkH. 100.) végre valahára -> végre-valahára # Mellérendelő szókapcsolat. (AkH. 100.) imígy amúgy -> imígy-amúgy # Mellérendelő szókapcsolat. (AkH. 100.) innen onnan -> innen-onnan # Mellérendelő szókapcsolat. (AkH. 100.) itt ott -> itt-ott # Mellérendelő szókapcsolat. (AkH. 100.) ízig vérig -> ízig-vérig # Mellérendelő szókapcsolat. (AkH. 100.) ízzé porrá -> ízzé-porrá # Mellérendelő szókapcsolat. (AkH. 100.) jajjal bajjal -> jajjal-bajjal # Mellérendelő szókapcsolat. (AkH. 100.) jóban rosszban -> jóban-rosszban # Mellérendelő szókapcsolat. (AkH. 100.) jobbra balra -> jobbra-balra # Mellérendelő szókapcsolat. (AkH. 100.) jól rosszul -> jól-rosszul # Mellérendelő szókapcsolat. (AkH. 100.) kékre zöldre -> kékre-zöldre # Mellérendelő szókapcsolat. (AkH. 100.) kénytelen kelletlen -> kénytelen-kelletlen # Mellérendelő szókapcsolat. (AkH. 100.) kézen közön -> kézen-közön # Mellérendelő szókapcsolat. (AkH. 100.) körös körül -> körös-körül # Mellérendelő szókapcsolat. (AkH. 100.) kézzel lábbal -> kézzel-lábbal # Mellérendelő szókapcsolat. (AkH. 100.) kurtán furcsán -> kurtán-furcsán # Mellérendelő szókapcsolat. (AkH. 100.) lépten nyomon -> lépten-nyomon # Mellérendelő szókapcsolat. (AkH. 100.) menet jövet -> menet-jövet # Mellérendelő szókapcsolat. (AkH. 100.) nyakra főre -> nyakra-főre # Mellérendelő szókapcsolat. (AkH. 100.) örökkön örökké -> örökkön-örökké # Mellérendelő szókapcsolat. (AkH. 100.) sülve főve -> sülve-főve # Mellérendelő szókapcsolat. (AkH. 100.) úton útfélen -> úton-útfélen # Mellérendelő szókapcsolat. (AkH. 100.) üggyel bajjal -> üggyel-bajjal # Mellérendelő szókapcsolat. (AkH. 100.) # alig alig -> alig-alig # Úgy úgy -> Úgy-úgy # ágat-bogat (ág\w*) (bog\w*) <- stem(\1) == [u"ág"] and stem(\2) == ["bog"] -> \1-\2 # Kötőjeles ikerszó. (AkH. 103.) ###################### Földrajzi nevek ###################### [word] (Északi|Déli)(?:-S| [Ss])ark{w} -> \1-sark{w} # Földrajzi név. # Az Északi sarkon -> Az Északi-sarkon # Földrajzi név. # Az Északi-Sarkon -> Az Északi-sarkon # Földrajzi név. dir észak|dél|kelet|nyugat|északkelet|északnyugat|délkelet|délnyugat Dir Észak|Dél|Kelet|Nyugat|Északkelet|Északnyugat|Délkelet|Délnyugat cap {ABC}{abc}+ sc {abc}+ w {Abc}+ # Észak-Amerikai Észak-amerikai helyett {Dir}-{cap} <- morph({cap}, r"po:noun_prs.*is:i_PLACE", False) -> = {Dir} + "-" + {cap}.lower() # Kisbetűvel írt földrajzi név. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/A_tulajdonnevek_írása#179. # észak-Amerika Észak-Amerika helyett {dir}-{cap} <- morph({cap}, r"po:noun_prs", False) and not morph({cap},"is:i_PLACE", False) -> = {dir}.capitalize() + "-" + {cap} # Nagybetűvel írt földrajzi név. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/A_tulajdonnevek_írása#179. # Észak-amerikai csak akkor nagybetűs, ha mondatkezdő és nem nagybetűs az utána jövő szó {Dir}-{sc} <- word(-1) and word(1) and not word(1) == word(1).capitalize() and morph({sc}, r"po:noun_prs.*is:i_PLACE", False) -> = {Dir}.lower() + "-" + {sc} # Kisbetűvel írt földrajzi név. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/A_tulajdonnevek_írása#179. # hiányzó kötőjel {Dir} {w} <- morph({w}, r"po:noun_prs") -> {Dir}-{w} # Kötőjellel írt földrajzi név. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/A_tulajdonnevek_írása#179. # köznevek prop Tenger|Óceán|Sziget|Félsziget|Középhegység {cap}-{prop} -> = {cap} + "-" + {prop}.lower() # Kisbetűs írt köznévi tag. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/A_tulajdonnevek_írása#176. # AkH. 182. (Árpád|Erzsébet|Hajógyári|Margit|Megyeri|Petőfi|Rákóczi|Szabadság)-(híd\w*) -> \1 \2 # Különírás. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/A_tulajdonnevek_írása#182. (Szabadság)(híd\w*) -> \1 \2 # Különírás. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/A_tulajdonnevek_írása#182. (Szabadság ?)(szobo?r\w*) -> \1-\2 # Kötőjeles összetétel. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/A különírás és az egybeírás#140. # AkH. 183. (Fertő)-(([tT]ó|[tT]av)\w*) -> = \1 + " " + \2.lower() # Kötőjel nélkül írt földrajzi név. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/A_tulajdonnevek_írása#183. (Góbi|Kalahári|Szahara)-([sS]ivatag\w*) -> = \1 + " " + \2.lower() # Kötőjel nélkül írt földrajzi név. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/A_tulajdonnevek_írása#183. (Börzsöny|Bükk|Mátra|Mecsek|Pilis|Zemplén|Vértes)-([Hh]egység\w*) -> = \1 + " " + \2.lower() # Kötőjel nélkül írt földrajzi név. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/A_tulajdonnevek_írása#183. (Duna)-(folyam\w*) -> = \1 + " " + \2.lower() # Kötőjel nélkül írt földrajzi név. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/A_tulajdonnevek_írása#183. (Bodrog|Duna|Dráva|Ipoly|Körös|Maros|Rába|Sajó|Tisza|Zala)-(([Ff]olyó|[Ff]olyam)\w*) -> = \1 + " " + \2.lower() # Kötőjel nélkül írt földrajzi név. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/A_tulajdonnevek_írása#183. Budapest (Liszt Ferenc )([Nn]emzetközi [Rr]epülőt[eé])(r\w*) -> = \1 + \2.lower() + \3 + "|ferihegyi " + \1 + \2.lower() + \3 + "|" + \3.replace("r", "Ferihegy", 1).replace("gyrel", "ggyel").replace(u"gyré", u"ggyé") + "|Budapest, " + \1 + \2.lower() + \3 # A köznévi tag kisbetűs, a címet vesszővel tagoljuk. (AkH. 190., 247.; FNB 74.) | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Az_írásjelek#247. ########################## vesszők ########################## (olya\w+) (aki\w*|ami\w*) <- morph(\2, r"st:(aki|ami|amilyen)\b") -> \1, \2 # Hiányzó vessző a tagmondatok határán? ##################### nyelvtani szabályok ################### W \w+ # word W2 \w+ # word ############### egybeírt segédigék és igekötők ############# # megszabad csinálni -> meg szabad csinálni # megtudta volna tenni -> meg tudta volna tenni # megfogja majd tudni -> meg fogja majd tudni # megszeretném még enni -> meg szeretném még enni # -> Megpróbálom megcsinálni. igekoto abba|agyon|alá|által|át|be|bele|benn|egybe|együtt|el|ellen|elő|előre|fel|föl|félbe|félre|felül|fölül|fenn|fönn|hátra|haza|helyre|hozzá|ide|jóvá|keresztül|ketté|ki|kölcsön|körbe|körül|közbe|közre|külön|le|meg|mellé|neki|oda|össze|rá|rajta|széjjel|szembe|szerte|szét|tele|tova|tovább|túl|újjá|újra|utána|végbe|végig|vissza segedige (akar|bír|fog|legy|lehet|lenn|lesz|lett|szabad|szeret|talál|tud|van|vol)\w* szavak ( \w+){0,} igenev (\w+ni) [Word] {igekoto}{segedige}{szavak} {igenev} <- morph({igenev}, "INFINITIVE") and morph({igekoto}+{segedige}, r"is:[/\w]*DEF|ds:tt") -> {igekoto} {segedige}{szavak} {igenev} # Az igekötőt nem írjuk egybe a segédigével. # elvan ez már rég felejtve letige (legy|lehet|lenn|lesz|lett|van|vol)\w* igenev (\w+v[ea]) {igekoto}{letige}{szavak} {igenev} <- morph({igenev}, "_PART") and morph({igekoto}+{letige}, r"is:[/\w]*DEF|ds:tt") -> {igekoto} {letige}{szavak} {igenev} # Az igekötő a lenni + -va/-ve szerkezetben nem a létigéhez kapcsolódik. ############### had -> hadd ################ # Eltusolták az ügyet. -> Eltussolták az ügyet. # Had legyen meglepetés! -> Hadd legyen meglepetés! (had|hagy)( (ne )?){W} <- morph({W}, r"(IMPER[_\w]*SG_1|is:[_/\w]*DEF_PL)") or (not word(-1) and morph({W}, r"is:[_/\w]*DEF_SG_[23]")) -> \1d\2{W} # Hadd helyesen. ############### *Áld meg! stb. ################### (\w+[lnrz]d) {igekoto} <- (not word(-1) or word(-1).lower() == "ne") and morph(\1, "st:" + \1.lower() + r"\b") and morph(\1+"d", r"IMPER") -> \1d \2 # Felszólító mód. ############### kér, kérd ######################## kérdd el -> kérd el # „kér” felszólító módja. ############### megfedd, eltussol ########## # Aztán jól megfedte. -> Aztán jól megfeddte. # Eltusolták az ügyet. -> Eltussolták az ügyet. (megfe)(d\w*) <- morph(\1+\2, r"st:fed\b") -> \1d\2 # Megfedd helyesen. (eltus)(ol\w*) <- morph(\1+\2, r"st:tusol\b") -> \1s\2 # Eltussol helyesen (kivéve, ha zuhanyzásról van szó). ############## főkép -> főképp ############# főké(p|pen) <- word(-1) != "a" and word(-1) != "A" -> főkép\1 # Ha határozószó, akkor főképp. ############# számok ###################### [char] \b0-á(\w+) -> 0-\1 # Hibás toldalék? (\d*[14])-el\b -> \1-gyel # Hibás toldalék? (\d*2)-ő(\w+) -> \1-\2 # Hibás toldalék? (\d*3)-á\b -> \1-má # Hibás toldalék? (\d*3)-al\b -> \1-mal # Hibás toldalék? (\d*[57])-el\b -> \1-tel # Hibás toldalék? (\d*6)-á\b -> \1-tá # Hibás toldalék? (\d*8)-á\b -> \1-cá # Hibás toldalék? (\d*9)-el\b -> \1-cel # Hibás toldalék? (\d*10)-el\b -> \1-zel # Hibás toldalék? (\d*20)-á\b -> \1-szá # Hibás toldalék? (\d*30)-á\b -> \1-cá # Hibás toldalék? (\d*[4579]0)-el\b -> \1-nel # Hibás toldalék? (\d*[68]0)-á\b -> \1-ná # Hibás toldalék? \b(\d)00-á\b <- \1 != "0" -> \100-zá # Hibás toldalék? \b(\d)000-el\b <- \1 != "0" -> \1000-rel # Hibás toldalék? #(\d*\d)0000-el\b <- \1 != "0" -> \1\2000-rel # Hibás toldalék? #(\d*)(\d)00000-el\b <- \1 != "0" -> \1\2000-rel # Hibás toldalék? ############## több mint ####################### # több, mint testőr -> több mint testőr XXX tavaly, délután stb. miatt nincs kezelve # -> több, mint tavaly # több, mint unalmas -> több mint unalmas # több, mint kiváló -> több mint kiváló # több, mint 70%-uk -> több mint 70%-uk # több, mint négyen -> több mint négyen # -> öt több, mint négy # több, mint 25 ezren -> több mint 25 ezren # több, mint két embert -> több mint két embert # több, mint 9 embert -> több mint 9 embert # több, mint 9 ezer fát -> több mint 9 ezer fát [Word] több, mint <- # (több mint jó), több mint nyolcan, több mint 12-en morph(word(1), r"(po:noun.*ds:s_\w*|po:adj|PRESPART_adj|po:adj_num.*(is:|An_MODE_adv))\b") or # több mint 25 ezren, több mint 25 ezerről, több mint száz birkát # (fix: "ezer" adj-ként is szerepel, ezért külön kezelve XXX) (morph(word(1), r"(po:adj_num|^\d+$)") and morph(word(2), r"(po:noun\b.*is:|(po:adj_num|st:ezer\b).*(is:|An_MODE_adv))")) or # több mint 25 ezer birkát (re.match(r"\d+$", word(1)) and morph(word(2), r"po:adj_num|st:ezer\b") and morph(word(3), r"po:noun\b.*is:")) or # több mint 75%-a re.match(r"\d+%-", word(1)) -> több mint # Ha nem összehasonlítás, hanem a mondanivaló erősítése, itt nem használunk vesszőt. | http://hu.wikisource.org/wiki/A_magyar_helyesírás_szabályai/Az_írásjelek#243. ############ avagy, illetve, ill., valamint ########## (\w+)( avagy) -> \1,\2 # Az avagy kötőszó elé vesszőt teszünk. (\w+)( illetve) -> \1,\2 # Az illetve kötőszó elé vesszőt teszünk. (\w+)( ill[.]) -> \1,\2|\1, illetve # Az illetve kötőszó elé vesszőt teszünk. (\w+)( valamint) -> \1,\2 # A valamint kötőszó elé vesszőt teszünk. ############ mellet -> mellett ################## # a fa mellet -> a fa mellett # -> De! feszes mellet mellet <- morph(word(-1), r"po:noun.*:NOM(?!.*[di]s:)|_noun\s+ts:NOM$") -> mellett # Nem inkább mellett (vagy hibás különírás)? ############ kellet -> kellett ################## # nem kellet volna -> nem kellett volna kellet <- morph(word(-1), r"INF_|_inf") or morph(word(-2), r"INF_|_inf") -> kellett # Helyesírási hiba. kellet <- morph(word(1), r"INF_|_inf") or morph(word(2), r"INF_|_inf") or word(1) == "volna" -> kellett # Helyesírási hiba. ############### helyett kapott ####################### # is helyett kapott -> is helyet kapott # a csomagban helyett kapott -> a csomagban helyet kapott (\w+) helyett (kap\w*) <- morph(\1, r"st:(is|ismét|mellett|még)\b|is:INE") and morph(\2, r"st:kap\b") -> \1 helyet \2 # Helyesen: helyet kap. ############## halott -> hallott ################## (?<=[Nn]em )halott(am|unk) -> hallott\1 # Helyesírási hiba? (hal)(ott\w*)(?= róla\w*) -> \1l\2 # Helyesírási hiba? ############### összetett szavak ################################# [Word] # rövid összetett szó W \w{4,5} {W} <- option("compound") and morph({W}, "pa:") -> =suggest({W}) # Biztos, hogy helyes összetett szó? # rövid (kétbetűs) tagot tartalmazó összetett szó W \w{4,} {W} <- option("compound") and morph({W}, r"(?u)pa:\w\w\b") -> =suggest({W}) # Biztos, hogy helyes összetett szó? # minden képzett összetett szó {W} <- option("allcompound") and morph({W}, "pa:") -> =suggest({W}) # Biztos, hogy helyes összetett szó? ############### vesszőhasználat ######################## ############### Stílus ################################# [Word] #asszem -> azt hiszem|azt hiszem, hogy # Helyesírási hiba. #h <- option("style") -> hogy # Hibás rövidítés? #szar\w* <- option("style") and morph(\0, r"st:szar\b") -> rossz # Stílushiba. médiák <- option("style") -> médiák|média|hírek|lapok|hírcsatornák # Vitatott stílusértékű alak. unszimpatikus <- option("style") -> unszimpatikus|ellenszenves|antipatikus # Vitatott stílusértékű alak. # ezresek számjegyekkel #(\d{2,3})[  ]?000-(\w+) <- option("style") and (not word(-1) or not re.match("[0-9]+$", word(-1))) and spell("ezer" + \2) and not morph("ezer" + \2, "_adj") -> \1 ezer\2 # Ha szám, javasolt betűkkel írni. #(\d{2,3})[  ]?000[  ]?000-(\w+) # <- option("style") and (not word(-1) or not re.match("[0-9]+$", word(-1))) and spell(u"millió" + \2) -> \1 millió\2 # Ha szám, javasolt betűkkel írni. ############### különírás ############################### [char] " (-\w+)" <- option("wordpart") and morph(\0, "st:-e|po:(suffix|punct)") -> \1 # A toldalékot szóköz nélkül írjuk. [Word] (a|az|egy) (\w+) (\w+) <- option("wordpart") and spell(\2 + \3) and morph(word(1), "po:vrb") and affix(\2, "ts:NOM$") and not morph(\2, "ts:PLUR") and affix(\3, "[it]s:NOM$") -> \1 \2\3 # Hibás különírás? ############### szóismétlés ############################### W [-\w]{3,} [word] {W} \1 <- option("dup0") and (not word(-1) or not word(-1).lower() in ["a", "az", "minden"]) and word(1) != u"hátán" and word(1) != u"hátán." and not morph(word(1), "po:post", False) -> {W}|{W}-\1 # Szóismétlés vagy hiányzó kötőjel? {W}(?: [-–\w„”]+)* \1 <- option("dup") -> {W} # Túlzott szóismétlés? {W}[;,:]?(?: [-–\w„”]+[;,:]?)* \1 <- option("dup2") -> {W} # Túlzott szóismétlés? # toldalékolva is (de nem összetett szó) ([-\w]{4})([-\w]+)(?: [-–\w„”]+)* \1(\w+) <- option("dup3") and option("dup") and morph(\1+\2, r"(?u)st:\w+") == morph(\1+\3, r"(?u)st:\w+") and not morph(\1+\3, "pa:") and not morph(\1+\2, "pa:") -> \1\2 # Túlzott szóismétlés? ([-\w]{4})([-\w]+)[;,:]?(?: [-–\w„”]+[;,:]?)* \1(\w+) <- option("dup3") and option("dup2") and morph(\1+\2, r"(?u)st:\w+") == morph(\1+\3, r"(?u)st:\w+") and not morph(\1+\3, "pa:") and not morph(\1+\2, "pa:") -> \1\2 # Túlzott szóismétlés? ################# ligatúrák ################################# [word] [-\w]*f[fil][-\w]* <- option("ligature") -> =\0.replace("ffi",u"ffi").replace("ffl",u"ffl").replace("ff",u"ff").replace("fi",u"fi").replace("fl",u"fl") # A szó unicode-os f-ligatúrákkal: [-\w]*(ffi|ffl|ff|fi|fl)[-\w]* <- option("noligature") -> =\0.replace(u"ffi","ffi").replace(u"ffl","ffl").replace(u"ff","ff").replace(u"fi","fi").replace(u"fl","fl") # A szó unicode-os f-ligatúrák nélkül: ################# indexek, törtek ############################## [word] 1/2((-\w+)?) <- option("frac") -> ½\1 # Tipográfiai jel: 1/3((-\w+)?) <- option("frac") -> ⅓\1 # Tipográfiai jel: 1/4((-\w+)?) <- option("frac") -> ¼\1 # Tipográfiai jel: 3/4((-\w+)?) <- option("frac") -> ¾\1 # Tipográfiai jel: 2/3((-\w+)?) <- option("frac") -> ⅔\1 # Tipográfiai jel: 1/5((-\w+)?) <- option("frac") -> ⅕\1 # Tipográfiai jel: 1/6((-\w+)?) <- option("frac") -> ⅙\1 # Tipográfiai jel: 5/6((-\w+)?) <- option("frac") -> ⅚\1 # Tipográfiai jel: 1/8((-\w+)?) <- option("frac") -> ⅛\1 # Tipográfiai jel: 3/8((-\w+)?) <- option("frac") -> ⅜\1 # Tipográfiai jel: 5/8((-\w+)?) <- option("frac") -> ⅝\1 # Tipográfiai jel: 7/8((-\w+)?) <- option("frac") -> ⅞\1 # Tipográfiai jel: 1/(\d{1,3})((-\w+)?) <- option("frac") -> = u"⅟" + \1.replace("0", u"₀").replace("1", u"₁").replace("2", u"₂").replace("3", u"₃").replace("4", u"₄").replace("5", u"₅").replace("6", u"₆").replace("7", u"₇").replace("8", u"₈").replace("9", u"₉") + \2 # Tört tipográfiai jelekkel: ([2-9]|\d{2,3})/(\d{1,3})((-\w+)?) <- option("frac") -> = \1.replace("0", u"⁰").replace("1", u"¹").replace("2", u"²").replace("3", u"³").replace("4", u"⁴").replace("5", u"⁵").replace("6", u"⁶").replace("7", u"⁷").replace("8", u"⁸").replace("9", u"⁹") + u"⁄" + \2.replace("0", u"₀").replace("1", u"₁").replace("2", u"₂").replace("3", u"₃").replace("4", u"₄").replace("5", u"₅").replace("6", u"₆").replace("7", u"₇").replace("8", u"₈").replace("9", u"₉") + \3 # Tört tipográfiai jelekkel: [µmck]?m[23](-\w+)? <- option("idx") -> =\0.replace("2", u"²").replace("3", u"³") # Index tipográfiai jellel: (Ca(CO3|SO4)|CO2|(H2|Na2)(CO3|O|SO4)|[HNO]2|HNO3|Fe2O3|KMnO4|NO2|SiO2|SO[23])(-\w+)? <- option("idx") -> =\0.replace("2", u"₂").replace("3", u"₃").replace("4", u"₄") # Index tipográfiai jellel. [word] kedvel <- word(-1).lower() == u"jó" or word(-1).lower() == "rossz" -> kedvvel # Szótévesztés? ################### mértékegységek ########################## ([-−]?\d+(?:,\d+)?) (°F(-\w+)?) <- option("SI") -> = measurement(\1, "F", "C", " " + \2.replace("F", "C")) # Váltás SI mértékegységre ([-−]?\d+(?:,\d+)?) (℉(-\w+)?) <- option("SI") -> = measurement(\1, "F", "C", " °C" + \2[1:]) # Váltás SI mértékegységre ([-−]?\d(?:,\d+)?) (láb\w*) <- option("SI") and stem(\2) == [u"láb"] -> = measurement(\1, "ft", "cm", " " + generate(u"centiméter", \2)[0]) + "|" + measurement(\1, "ft", "m", " " + generate(u"méter", \2)[0]) # Váltás SI mértékegységre ([-−]?\d\d+(?:,\d+)?) (láb\w*) <- option("SI") and stem(\2) == [u"láb"] -> = measurement(\1, "ft", "m", " " + generate(u"méter", \2)[0]) # Váltás SI mértékegységre ([-−]?\d+(?:,\d+)?) (hüvelyk\w*) <- option("SI") -> = measurement(\1, "in", "cm", " " + generate(u"centiméter", \2)[0]) # Váltás SI mértékegységre ([-−]?\d+(?:,\d+)?) (mérföld\w*) <- option("SI") -> = measurement(\1, "mi", "km", " " + generate(u"kilométer", \2)[0]) # Váltás SI mértékegységre ([-−]?\d+(?:,\d+)?) (yard\w*) <- option("SI") -> = measurement(\1, "yd", "m", " " + generate(u"méter", \2)[0]) # Váltás SI mértékegységre ([-−]?\d+(?:,\d+)?) (font (súlyú\w*)) <- option("SI") -> = measurement(\1, "lbm", "kg", " " + generate("kilogramm", u"szomor" + \3[4:])[0]) # Váltás SI mértékegységre ([-−]?\d+(?:,\d+)?) (gallon\w*) <- option("SI") -> = measurement(\1, "gal", "l", " " + generate("liter", \2)[0]) # Váltás SI mértékegységre ([-−]?\d+(?:,\d+)?) (pint\w*) <- option("SI") -> = measurement(\1, "uk_pt", "dl", " " + generate("deciliter", \2)[0]) + "|" + measurement(\1, "us_pt", "dl", " " + generate("deciliter", \2)[0]) # Váltás SI mértékegységre (angol és amerikai pint) # elválasztás adatút <- option("hyphen") -> ada­tút|adat­út # Elválasztás: felett(em|ed|e|ünk|ük) <- option("hyphen") -> fe­let­t\1|fel­et­t\1 # Elválasztás: felettetek <- option("hyphen") -> fe­let­te­tek|fel­et­te­tek # Elválasztás: fölül <- option("hyphen") -> fö­lül|föl­ül # Elválasztás: gépelem <- option("hyphen") -> gé­pe­lem|gép­elem # Elválasztás: karóra <- option("hyphen") -> kar­óra|ka­ró­ra # Elválasztás: megás <- option("hyphen") -> me­gás|meg­ás # Elválasztás: megint <- option("hyphen") -> me­gint|meg­int # Elválasztás: [code] def measurement(mnum, min, mout, mstr): m = calc("CONVERT_ADD", (float(mnum.replace(",", ".").replace(u"−", "-")), min, mout)) a = list(set([str(calc("ROUND", (m, 0)))[:-2], str(calc("ROUND", (m, 1))), str(calc("ROUND", (m, 2))), str(m)])) # remove duplicated rounded items a.sort(key=lambda x: len(x)) # sort by string length return (mstr + "|").join(a).replace(".", ",").replace("-", u"−") + mstr lightproof-1.5+git20140515/Lightproof.py0000644000175000017500000001552612335137465016312 0ustar renerene# -*- encoding: UTF-8 -*- # Lightproof grammar checker for LibreOffice and OpenOffice.org # 2009-2012 (c) Laszlo Nemeth (nemeth at numbertext org), license: MPL 1.1 / GPLv3+ / LGPLv3+ import uno, unohelper, os, sys, traceback from lightproof_impl_${implname} import locales from lightproof_impl_${implname} import pkg import lightproof_impl_${implname} import lightproof_handler_${implname} from com.sun.star.linguistic2 import XProofreader, XSupportedLocales from com.sun.star.linguistic2 import ProofreadingResult, SingleProofreadingError from com.sun.star.lang import XServiceInfo, XServiceName, XServiceDisplayName from com.sun.star.lang import Locale # reload in obj.reload in Python 3 try: from obj import reload except: pass class Lightproof( unohelper.Base, XProofreader, XServiceInfo, XServiceName, XServiceDisplayName, XSupportedLocales): def __init__( self, ctx, *args ): self.ctx = ctx self.ServiceName = "com.sun.star.linguistic2.Proofreader" self.ImplementationName = "org.openoffice.comp.pyuno.Lightproof." + pkg self.SupportedServiceNames = (self.ServiceName, ) self.locales = [] for i in locales: l = locales[i] self.locales += [Locale(l[0], l[1], l[2])] self.locales = tuple(self.locales) currentContext = uno.getComponentContext() lightproof_impl_${implname}.SMGR = currentContext.ServiceManager lightproof_impl_${implname}.spellchecker = \ lightproof_impl_${implname}.SMGR.createInstanceWithContext("com.sun.star.linguistic2.SpellChecker", currentContext) lightproof_handler_${implname}.load(currentContext) # XServiceName method implementations def getServiceName(self): return self.ImplementationName # XServiceInfo method implementations def getImplementationName (self): return self.ImplementationName def supportsService(self, ServiceName): return (ServiceName in self.SupportedServiceNames) def getSupportedServiceNames (self): return self.SupportedServiceNames # XSupportedLocales def hasLocale(self, aLocale): if aLocale in self.locales: return True for i in self.locales: if (i.Country == aLocale.Country or i.Country == "") and aLocale.Language == i.Language: return True return False def getLocales(self): return self.locales # XProofreader def isSpellChecker(self): return False def doProofreading(self, nDocId, rText, rLocale, nStartOfSentencePos, \ nSuggestedSentenceEndPos, rProperties): aRes = uno.createUnoStruct( "com.sun.star.linguistic2.ProofreadingResult" ) aRes.aDocumentIdentifier = nDocId aRes.aText = rText aRes.aLocale = rLocale aRes.nStartOfSentencePosition = nStartOfSentencePos aRes.nStartOfNextSentencePosition = nSuggestedSentenceEndPos aRes.aProperties = () aRes.xProofreader = self aRes.aErrors = () # PATCH FOR LO 4 # Fix for http://nabble.documentfoundation.org/Grammar-checker-Undocumented-change-in-the-API-for-LO-4-td4030639.html if nStartOfSentencePos != 0: return aRes aRes.nStartOfNextSentencePosition = len(rText) # END OF PATCH if len(rProperties) > 0 and rProperties[0].Name == "Update": try: import lightproof_compile_${implname} try: code = lightproof_compile_${implname}.c(rProperties[0].Value, rLocale.Language, True) except Exception as e: aRes.aText, aRes.nStartOfSentencePosition = e return aRes path = lightproof_impl_${implname}.get_path() f = open(path.replace("_impl", ""), "w") f.write("dic = %s" % code["rules"]) f.close() if pkg in lightproof_impl_${implname}.langrule: mo = lightproof_impl_${implname}.langrule[pkg] reload(mo) lightproof_impl_${implname}.compile_rules(mo.dic) lightproof_impl_${implname}.langrule[pkg] = mo if "code" in code: f = open(path, "r") ft = f.read() f.close() f = open(path, "w") f.write(ft[:ft.find("# [code]") + 8] + "\n" + code["code"]) f.close() try: reload(lightproof_impl_${implname}) except Exception as e: aRes.aText = e.args[0] if e.args[1][3] == "": # "expected an indented block" (end of file) aRes.nStartOfSentencePosition = len(rText.split("\n")) else: aRes.nStartOfSentencePosition = rText.split("\n").index(e.args[1][3][:-1]) + 1 return aRes aRes.aText = "" return aRes except: if 'PYUNO_LOGLEVEL' in os.environ: print(traceback.format_exc()) l = rText[nSuggestedSentenceEndPos:nSuggestedSentenceEndPos+1] while l == " ": aRes.nStartOfNextSentencePosition = aRes.nStartOfNextSentencePosition + 1 l = rText[aRes.nStartOfNextSentencePosition:aRes.nStartOfNextSentencePosition+1] if aRes.nStartOfNextSentencePosition == nSuggestedSentenceEndPos and l!="": aRes.nStartOfNextSentencePosition = nSuggestedSentenceEndPos + 1 aRes.nBehindEndOfSentencePosition = aRes.nStartOfNextSentencePosition try: aRes.aErrors = lightproof_impl_${implname}.proofread( nDocId, rText, rLocale, \ nStartOfSentencePos, aRes.nBehindEndOfSentencePosition, rProperties) except Exception as e: if len(rProperties) > 0 and rProperties[0].Name == "Debug" and len(e.args) == 2: aRes.aText, aRes.nStartOfSentencePosition = e else: if 'PYUNO_LOGLEVEL' in os.environ: print(traceback.format_exc()) return aRes def ignoreRule(self, rid, aLocale): lightproof_impl_${implname}.ignore[rid] = 1 def resetIgnoreRules(self): lightproof_impl_${implname}.ignore = {} # XServiceDisplayName def getServiceDisplayName(self, aLocale): return lightproof_impl_${implname}.name g_ImplementationHelper = unohelper.ImplementationHelper() g_ImplementationHelper.addImplementation( Lightproof, \ "org.openoffice.comp.pyuno.Lightproof." + pkg, ("com.sun.star.linguistic2.Proofreader",),) g_ImplementationHelper.addImplementation( lightproof_handler_${implname}.LightproofOptionsEventHandler, \ "org.openoffice.comp.pyuno.LightproofOptionsEventHandler." + pkg, ("com.sun.star.awt.XContainerWindowEventHandler",),) lightproof-1.5+git20140515/description.xml0000644000175000017500000000133112054114510016635 0ustar renerene ${name} ${provider} lightproof-1.5+git20140515/doc/0000755000175000017500000000000012054114510014337 5ustar renerenelightproof-1.5+git20140515/doc/manual.txt0000644000175000017500000000542612054114510016364 0ustar renerene= Making a new grammar checker for LibreOffice/OpenOffice.org = == Rule development == Use Lightproof editor (LibreOffice Writer toolbar extension) to create a rule (Lightproof .dat) file. See doc/syntax.txt for more informations. After LibreOffice integration (see later) switch off the integrated grammar checker component in the Tools » Options » Language Settings » Writing Aids » Available language modules, eg. "Lightproof Grammar Checker (en)", and switch on the component "Lightproof editor" and *restart* LibreOffice for rule development. There is no visual editor for optional features, yet (dlg file), but you can compile and test all optional rules in the editor with the Apply all rules icon. Also copying your rule and dialog definition files to the src/editor folder, you can compile an extended editor extension with the following command: python make.py src/editor/editor.cfg Note: the default locales of the editor (supported languages of the edited rule document) cover only the languages with Hunspell dictionaries. Choose such languages for editing in Writer (eg. Esperanto), or add your language to the "locales" section of the src/editor/editor.cfg and compile the editor extension. == Extension development == 1. Copy src/en/en.cfg, dat and dlg files under the name src/your_locale/your_locale.cfg, dat and dlg. 2. Set cfg, translate messages, dat and dlg files (see doc/dialog.txt). 3. Compile and install your data (see README) == LibreOffice integration == Short description about the Lightproof integration with the dictionary extensions (it is not an automatic process yet): 1. Copy dialog/* and pythonpath/* directories and Lightproof.py, Linguistic.xcu of your Lightproof extension to the dictionaries/your_language/ directory of LibreOffice. (Note: pythonpath/lightproof_compiler* doesn't need for the integration.) 2. Extend COMPONENT_FILES variable of makefile.mk with these new files. 3. Extend manifest.xml with the following elements: 4. Change extension ID of dialog/OptionsDialog.xcu to the ID of the dictionary extension (see in description.xml): org.openoffice.en.hunspell.dictionaries lightproof-1.5+git20140515/doc/dialog.txt0000644000175000017500000000246412054114510016345 0ustar renerene# 1. Copy this template to the data folder, under the name of your locale # eg. en_US.dlg. # # 2. Define your group ids and option ids and the localized title # texts (see later for the syntax). # # Syntax of the dialog data file: # # Options and title texts for the Settings and conditional rules # # The Lightproof dialogs contain only grouped checkboxes. # # Format of the dialog definition: # # GroupID: OptionID [OptionsInTheSameLines_or_hyphen_placeholder], OptionID ... # Group2ID: OptionID, OptionID ... # ... # [Language_code=title of the window] # GroupID=title of the group # OptionID=title of the option [\n tooltip] # Option2ID=title of the option [\n tooltip] # # The first language is the default language for the other locales # (use en_US or the common language of your country) # # The OptionIDs are used in the rules, too. For example: # # foo <- option("style") -> bar # bar is far better # # this rule depends from the state of the "style" checkbox. # options spelling: comma, hyphen proofreading: style, moregrammar # titles [en_US=Hungarian grammar checking] spelling=Spelling comma=Comma usage hyphen=Check compound words with hyphen proofreading=Proofreading style=Style checking moregrammar=Use grammar rules with ambiguous word analysis [yourlocale=yourtitle] spelling=... wordpart=... ... lightproof-1.5+git20140515/doc/syntax.txt0000644000175000017500000002212412054114510016427 0ustar renerene= Encoding = UTF-8 = Rule syntax = pattern -> replacement # message or (see Conditions) pattern <- condition -> replacement # message or pattern <- condition -> = replacement # = expression_for_message pattern <- condition -> = expression_to_generate_replacement_string # message pattern <- condition -> = expression_to_generate_replacement_string # = expression_for_message Basically pattern and replacement will be the parameters of the standard Python re.sub() regular expression function (see also Python regex module documentation for regular expression syntax: http://docs.python.org/library/re.html). Example 0. Report "foo" in the text and suggest "bar": foo -> bar # Use bar instead of foo. Example 1. Recognize and suggest missing hyphen: foo bar -> foo-bar # Missing hyphen. = Rule Sections = Example 2. Recognize double or more spaces and suggests a single space: [char] " +" -> " " # Extra space. The line [char] changes the default word-level rules to character-level ones. Use [Word] to change back to the (case-insensitive) word-level rules. Also [word] is for the case-sensitive word-level rules, and [Char] for the case-insensitive character-level rules. ASCII " characters protect spaces in the pattern and in the replacement text. Plus sign means 1 or more repetitions of the previous space. = Other examples = Example 3. Suggest a word with correct quotation marks: \"(\w+)\" -> “\1” # Correct quotation marks. (Here \" is an ASCII quotation mark, \w means an arbitrary letter, + means 1 or more repetitions of the previous object, The parentheses define a regex group (the word). In the replacement, \1 is a reference to the (first) group of the pattern.) Example 4. Suggest the missing space after the !, ? or . signs: \b([?!.])([a-zA-Z]+) -> \1 \2 # Missing space? \b is the zero-length word boundary regex notation, so \b signs the end and the begin of the words. The [ and ] define a character pattern, the replacement will contain the actual matching character (?, ! or .), a space and the word after the punctuation character. Note: ? and . characters have special meanings in regular expressions, use [?] or [.] patterns to check "?" and "." signs in the text. == Multiple suggestions == Use | or \n (new line) in the replacement text to add multiple suggestions: foo -> Foo|FOO|Bar|BAR # Did you mean: (Foo, FOO, Bar and BAR suggestions for the input word "foo") = Expressions in the suggestions = Suggestions (and warning messages) started by an equal sign are Python string expressions extended with possible back references and named definitions: Example: foo\w+ -> = '"' + \0.upper() + '"' # With uppercase letters and quoation marks All words beginning with "foo" will be recognized, and the suggestion is the uppercase form of the string with ASCII quoation marks: eg. foom -> "FOOM". == No suggestion == You can display message without making suggestions. For this purpose, use a single character _ in the replacement field. Example: foobar -> _ # Message == Longer explanations == Warning messages can contain optional URLs for longer explanations separated by "|" or "\n": (your|her|our|their)['’]s -> \1s # Possessive pronoun:|http://en.wikipedia.org/wiki/Possessive_pronoun == Back references in explanations == (fooo) bar -> foo bar # “\1” should be: == Default variables == LOCALE It contains the current locale of the checked paragraph. Its fields: For en-US LOCALE.Language = "en" and LOCALE.Country = "US", eg. colour <- LOCALE.Language == "US" -> color # Use American English spelling. TEXT Full text of the checked paragraph. == Name definitions == Lightproof supports name definitions to simplify the description of the complex rules. Definition: name pattern # name definition Usage in the rules: "{name} " -> "{name}. " # Missing dot? {Name}s in the first part of the rules mean subpatterns (groups). {Name}s in the second part of the rules mean back references to the matched texts of the subpatterns. Example: thousand markers (10000 -> 10,000 or 10 000) # definitions d \d\d\d # name definition: 3 digits d2 \d\d # 2 digits D \d{1,3} # 1, 2 or 3 digits # rules # ISO thousand marker: space, here: no-break space (U+00A0) {d2}{d} -> {d2},{d}|{d2} {d} # Use thousand marker (common or ISO). {D}{d}{d} -> {D},{d},{d}|{D} {d} {d} # Use thousand markers (common or ISO). Note: Lightproof uses named groups for name definitions and their references, adding a hidden number to the group names in the form of "_n". You can use these explicit names in the replacement: {d2}{d} -> {d2_1},{d_1}|{d2_1} {d_1} # Use thousand marker (common or ISO). {D}{d}{d} -> {D_1},{d_1},{d_2}|{D_1} {d_1} {d_2} # Use thousand markers (common or ISO). Note: back references of name definitions are zeroed after new line characters, see this and the following example: E ( |$) # name definition: space or end of sentence "\b[.][.]{E}" -> .{E}|…{E} # Period or ellipsis? See src/en/en.dat for more examples. = Error positioning = By default, the full pattern will be underlined with blue. You can shorten the underlined text area by specifying a back reference group of the pattern. Instead of writing ->, write -n> n being the number of a back reference group. Actually, -> is similar to -0> Example (ying) and yang -1> yin # Did you mean: == Comparison == Rule 1: ying and yang -> yin and yang # Did you mean: Rule 2: (ying) and yang -1> yin # Did you mean: With the rule 1, the full pattern is underlined: ying and yang ^^^^^^^^^^^^^ With the rule 2, only the first back reference group is underlined: ying and yang ^^^^ = Conditions = A Lightproof condition is a Python condition with some modifications: the \0..\9 regex notations and the Lightproof {name} notations in the condition will be replaced by the matched subpatterns. For example, the rule \w+ <- \0 == "foo" -> Foo # Foo is a capitalized word. is equivalent of the following rule: foo -> Foo # Foo is a capitalized word. == Standard functions == There are some default function for the rule conditions. word(n) or word(-n): The function word(n) returns the Nth word (separated only by white spaces) before or after the matching pattern, or None, if this word doesn't exist. morph(word, regex pattern): morph(word, regex pattern, all): The function morph returns a matching subpattern of the morphological analysis of the input word or None, if the pattern won't match all items of the analysis of the input word. For example, the rule \ban ([a-z]\w+) <- morph(\1, "(po:verb|is:plural)") -> and \1 # Missing letter? will find the word "an" followed by a not capitalized verb or a plural noun (the notation depends from the morphological data of the Hunspell dictionary). The optional argument can modify the default "all" mode to "if exists", using the False value: morph(word, regex pattern, False): stem(word): The function returns an arraw with the stems of the input word. Usage: (\w+) <- "foo" in stem(\1) -> bar # One of the stem of the word is "foo" (\w+) <- stem(\1) == ["foo"] -> bar # The word has got only one stem, "foo". affix(word, regex pattern): affix(word, regex pattern, all): Variant of morph: it filters the affix fields from the result of the analysis before matching the pattern. The optional argument can modify the default "all" mode to "if exists", using the False value: affix(word, regex pattern, False): calc(functionname, functionparameters): Access to the Calc functions. Functionparameters is a tuple with the parameter of the Calc function: calc("CONCATENATE", ("string1", "string2")) generate(word, example_word): Morphological generation by example, eg. the result of generate("mouse", "rodents") is ["mice"] with the en_US English dictionary. (See also Hunspell (4) manual page for morphological generation.) option(optionname): Return the Boolean value of the option (see doc/dialog.txt). == Multi-line rules == Rules can be break to multiple lines by leading tabulators: pattern <- condition # only comment -> replacement # message (last comment) == User code support == Use [code] sections to add your own Python functions for the rules: Example (suggesting uppercase form for all words with underline character, for example hello_world -> HELLO_WORLD) [code] def u(s): return s.upper() [Word] # suggest uppercase form for all words with underline character \w+_\w+ -> =u(\0) # Use uppercase form (In fact, this is equivalent of the following rule: \w+_\w+ -> =\0.upper() # Use uppercase form) See English rules (src/en/en.dat) for more examples, eg. precompiled regular expressions for sentence checking, sets to handle more irregular words etc. = Typical problems = == Encoding == Python expressions (< Python 3.0) need explicit Unicode declaration for non-ASCII characters: fó -> bár # example is equivalent of the following rule (see u'string' instead of 'string') fó -> = u'bár' # example == Pattern matching == Repeating pattern matching of a single rule continues after the previous matching, so instead of general multiword patterns, like (\w+) (\w+) <- some_check(\1, \2) -> \1, \2 # foo use (\w+) <- some_check(\1, word(1)) -> \1, # foo lightproof-1.5+git20140515/META-INF/0000755000175000017500000000000012054114507014740 5ustar renerenelightproof-1.5+git20140515/META-INF/manifest.xml0000644000175000017500000000132212054114507017266 0ustar renerene lightproof-1.5+git20140515/Dialog.py0000644000175000017500000002040312335137465015362 0ustar renerene# -*- encoding: UTF-8 -*- from __future__ import unicode_literals import sys import re import os import codecs comment = re.compile(r"[\n#]") ids = re.compile(r"\w+:\s*\*?\w+(,\s*\*?\w+)*") langu = re.compile(r"\[.+=.+\]\s*") titl = re.compile(r"\w+\s*=\s*") helptexts = [] xdl_header = """ """ xdl_footer = """ """ xdl_group = '\n' xdl_item = '\n' xcs_header = """ Contains the options data used for the test extensions. """ xcs_leaf_header = r""" The data for one leaf. """ xcs_leaf = r""" """ xcs_leaf_footer = r""" """ xcs_component_header = """ """ xcs_component = """ """ xcs_footer = """ """ xcu_header = u""" Dictionaries Szótárak """ xcu_node_header = """ org.openoffice.comp.pyuno.lightproof.oxt.%s """ xcu_node = """ %s """ xcu_node_footer = """ %%origin%%/%s.xdl org.openoffice.comp.pyuno.LightproofOptionsEventHandler.%s """ xcu_footer = """ """ indexes = {} indexes_def = {} modules = {} def create_xdl(pkg, lines, target, lang): global indexes global indexes_def global modules indexes[lang] = [] indexes_def[lang] = [] modules[lang] = [] f2 = "" state = 0 f2n = "dialog/" + lang + ".xdl" f2 = f2 + xdl_header%lang k = 0 k2 = 0 lin = 0 ok = False for i in lines: i = i.strip() if "=" in i and r"\n" in i: helptexts.append(i.split("=")[0]) for i in lines: i = i.strip().replace(r"\n", "@#@") + "\n" lin = lin + 1 if not comment.match(i): if state == 0: ok = True if ids.match(i.strip()): j = i.strip().split(":") f2 = f2 + xdl_group%(j[0].strip(), k, k2 * 10 + 5, j[0].strip()) for l in j[1].split(","): k = k + 1 k2 = k2 + 1 l = l.strip() la = l.split(" ") l3 = 0 itemlen = int(240 / len(la)) for l2 in la: if l2 != "-": checked = "false" if l2[0] == '*': checked = "true" l2 = l2[1:] indexes_def[lang] += [l2] indexes[lang] += [l2] helptext = "" if l2 in helptexts: helptext = "dlg:help-text=\"&hlp_" + l2 + "\"" f2 = f2 + xdl_item%(l2, k, 10 + itemlen * l3, k2 * 10 + 5, itemlen, l2, checked, helptext) l3 = l3 + 1 k = k + 1 k2 = k2 + 1 k = k + 1 else: ok = False if langu.match(i.strip()): if "xdl" in f2n: f2 = f2 + xdl_footer target.writestr(f2n, f2) f2 = "" i = i.strip() langname = i[1:i.find("=")] modules[lang] += [langname[:langname.find("_")], i[i.find("=")+1:-1]] f2n = "dialog/" + lang + "_" + langname + ".properties" state = state + 1 if state == 1: target.writestr("dialog/" + lang + "_" + langname + ".default", "") elif titl.match(i.strip()): hlp = i.encode("unicode-escape").decode('ascii').replace(r"\n","\n").replace(r"\t","\t").replace(r"\x","\\u00").split("@#@", 1) if len(hlp) > 1: helptexts.append(hlp[0].split("=")[0]) f2 = f2 + "hlp_" + hlp[0].split("=")[0] + "=" + hlp[1] hlp[0] = hlp[0] + "\n" f2 = f2 + hlp[0] elif not ok: print ("Syntax error in line %d: %s" %(lin, i)) if "xdl" in f2n: f2 = f2 + xdl_footer target.writestr(f2n, f2) #def c(pkg, author, language, inpdir, target, prgtarget, dlg): def c(pkg, dlgdata, target, lang): # create xdl dialog data files create_xdl(pkg, dlgdata, target, lang) s = xcs_header% ("Lightproof_" + pkg) for i in indexes: s = s + xcs_leaf_header%i + \ xcs_leaf*len(indexes[i])%tuple(indexes[i]) + \ xcs_leaf_footer s = s + xcs_component_header for i in indexes: s = s + xcs_component%(i,i) target.writestr("dialog/OptionsDialog.xcs", s + xcs_footer) s = "" for i in indexes: s = s + xcu_node_header%(pkg, pkg) + \ xcu_node*(len(modules[i])//2)%tuple(modules[i]) + \ xcu_node_footer%(i, pkg) target.writestr("dialog/OptionsDialog.xcu", (xcu_header + s + xcu_footer).encode("utf-8")) # python resource file s = """lopts = {} lopts_default = {} """ for i in indexes: s = s + "lopts['" + i + "'] = " + str(indexes[i]) + "\n" for i in indexes: s = s + "lopts_default['" + i + "'] = " + str(indexes_def[i]) + "\n" target.writestr("pythonpath/lightproof_opts_%s.py"%pkg, s) lightproof-1.5+git20140515/COPYING0000644000175000017500000000111112054114507014625 0ustar renereneGPL 2.0/LGPL 2.1/MPL 1.1 tri-license The contents of this software may be used under the terms of the GNU General Public License Version 2 or later (the "GPL"), or the GNU Lesser General Public License Version 2.1 or later (the "LGPL") or the Mozilla Public License Version 1.1 or later (the "MPL"). Software distributed under these licenses is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the licences on http://www.fsf.org and http://www.opensource.org for the specific language governing rights and limitations under the licenses. lightproof-1.5+git20140515/README0000644000175000017500000000402512335137465014473 0ustar renereneLightproof grammar checker framework for Libreoffice/OpenOffice.org source: git://anongit.freedesktop.org/libreoffice/lightproof or see cgit.freedesktop.org/libreoffice version 1.5 (2012-08-23) 2009–2012 (c) László Németh (nemeth at numbertext dot org), license: MPL 1.1 / GPLv3+ / LGPLv3+ This software was developed with support from FSF.hu Foundation, Hungary. (For more information, see http://www.fsf.hu/index.php/About_us.) == Build OOo/LibO extension == Requirements: Python 3.3 or later. Building: python make.py [config_file] For example: python make.py src/en/en.cfg or with own Python 3.3 of LibreOffice, on Windows: [install_path]\program\python make.py src\en\en.cfg or on Linux (libreoffice.org distribution): /opt/libreoffice4.1/program/python make.py src/en/en.cfg The result is an oxt (OpenOffice.org/LibreOffice) extension. == Compile development tool == python make.py src/editor/editor.cfg == Installation == 1. Via Tools -> Extension manager in OOo/LibreOffice 2. or with unopkg tool, for example [install_path\program\]unopkg add -f lightproof_en-0.4.2.oxt == Features == - Lightproof is a grammar checker extension generator (see doc/manual.txt): the result of the generation is a single Lightproof or vendor specific grammar checker language package, eg. lightproof-en.oxt or your-grammar-checker-en_US.oxt. - language-neutral proofreading tool (see data/ for language data) - OpenOffice.org grammar checker extension generator - Lightproof editor (rule development tool / LibreOffice toolbar) - high-level regex-based rule definition language - optional Python conditions in the rules - integration with Hunspell morphological analyzer - written in Python using fast regex module of CPython - lazy loading of language modules - template (data/template.dat) for new languages == Rule compilation == For the default language modules (en_US, hu_HU, ru_RU): make See doc/manual.txt to add a new language module or develop a new grammar checker extension for your language == Documentation == doc/manual.txt