Kajiki-0.8.2/0000755000076500000240000000000013567202501012777 5ustar amolstaff00000000000000Kajiki-0.8.2/PKG-INFO0000644000076500000240000002620613567202501014102 0ustar amolstaff00000000000000Metadata-Version: 1.1 Name: Kajiki Version: 0.8.2 Summary: Fast XML-based template engine with Genshi syntax and Jinja blocks Home-page: https://github.com/nandoflorestan/kajiki Author: Nando Florestan Author-email: nandoflorestan@gmail.com License: MIT Description-Content-Type: UNKNOWN Description: Kajiki provides fast well-formed XML templates ============================================== Because Kajiki's input is XML, it can ensure that your HTML/XML output is well-formed. The Genshi-like syntax, based on XML attributes or tags, is simply beautiful and easily understood (or ignored) by web designers. But instead of the slow performance of Genshi_, Kajiki compiles templates to Python code that renders with blazing-fast speed, so Kajiki can compete with the speed of Jinja_, Mako_, Chameleon_ and others. Also, one of Genshi's misfeatures -- py:match -- is replaced with blocks which work like Jinja's blocks. By combining the best ideas out there -- XML input, Genshi's syntax and features, Jinja's template inheritance and final compilation to Python --, Kajiki is ready to become the most widely used templating engine for web development in Python. And more features are coming soon; stay tuned! Example ======= .. code:: python >>> import kajiki >>> Template = kajiki.XMLTemplate(''' ... $title ... ...

$title

... ... ... ''') >>> print(Template(dict(title='Kajiki is teh awesome!', repetitions=3)).render()) Kajiki is teh awesome!

Kajiki is teh awesome!

Links ===== Documentation_ Kajiki is licensed under an MIT-style license_. The git repository and `issue tracker`_ are at GitHub_. Previously the project used SourceForge_ for the hg repository, issue tracker and forums. We use Travis_ for continuous integration. .. _Documentation: http://kajiki.readthedocs.org/ .. _license: https://github.com/nandoflorestan/kajiki/blob/master/LICENSE.rst .. _`issue tracker`: https://github.com/nandoflorestan/kajiki/issues .. _GitHub: https://github.com/nandoflorestan/kajiki .. _SourceForge: http://sourceforge.net/p/kajiki/ .. _Travis: https://travis-ci.org/nandoflorestan/kajiki .. _Genshi: https://pypi.python.org/pypi/Genshi .. _Jinja: https://pypi.python.org/pypi/Jinja2 .. _Mako: https://pypi.python.org/pypi/Mako .. _Chameleon: https://pypi.python.org/pypi/Chameleon CHANGES ======= 0.8.2 (2019-11-26) ------------------ * Fixed some HTML entities not being properly recognised 0.8.1 (2019-10-20) ------------------ * Fixed unexpected when including templates 0.8.0 (2019-06-03) ------------------ * Fixed support for Python 3.8 * Dropped support for Python 2.6 and 3.3 0.7.2 (2018-04-16) ------------------ * Improve parsing of ``${}`` expressions and fix syntax errors reporting in braced expressions. * Improve parsing of documents with comments before the root element 0.7.1 (2017-09-11) ------------------ * Allow to replace ``gettext`` function by providing it in the template context or through ``base_globals`` in Loader 0.7.0 (2017-06-27) ------------------ * Text for i18n is now extracted ignoring the empty spaces surrounding the text itself. Empty text will always be treated as non translatable nodes for performance reasons. * ``extract_python`` option will now report syntax errors when extracting text for translation. 0.6.3 (2017-05-25) ------------------ * Added ``extract_python`` option to babel message extractor, this allows extracting gettext calls in ``${}`` expressions 0.6.1 (2016-11-28) ------------------ * Actually report 0.6 in kajiki/version.py * Expose ``strip_text`` option in loader 0.6.0 (2016-11-27) ------------------ * Fixed ``py:switch`` error message wrongly mentioning ``py:with`` * Support for multiline ``${}`` expressions * Subsequent text nodes are now squashed into a single text node. This allows translating whole paragraphs instead of single sentences. * Allow code and function calls inside tag attributes * Added ``strip_text`` option to XMLTemplate and i18n collector to ensure leading and trailing spaces are stipped by text nodes (also leads to minified HTML) * Some HTML nodes that do not require being closed but is commonly considered best practice to close them are now emitted with ending tag (IE:

) * Generally improved code documentation to lower entry barrier for contributors 0.5.5 (2016-06-08) ------------------ * ``py:attrs`` will now emit the attribute name itself or will omit the attribute at all in case of ``bool`` values for 'checked', 'disabled', 'readonly', 'multiple', 'selected', 'nohref', 'ismap', 'declare' and 'defer', 0.5.4 (2016-06-04) ------------------ * ``py:switch`` now correctly supports multiple ``py:case`` statements. * text inside ``' perform(source, output, mode='html') perform(source, output, mode='xml') def test_script_escaping(self): '''In HTML script and style tags are automatically CDATA; in XML they must be explicitly be made so. ''' script = 'if (1 < 2) { doc.write("

Offen bach

"); }\n' src = ''.format(script) perform(src, mode='html', expected_output=''.format(script)) perform(src, ''.format( script), mode='xml') def test_style_escaping(self): style = 'html > body { display: none; }\n' src = ''.format(style) perform(src, ''.format(style), mode='xml') perform(src, ''.format(style), mode='html') def test_script_variable(self): '''Interpolate variables inside ' perform(src, '', mode='xml') perform(src, '', mode='html') def test_CDATA_disabled(self): src = '' perform(src, '', mode='xml', cdata_scripts=False) perform(src, '', mode='html', cdata_scripts=False) def test_CDATA_escaping(self): src = '''''' perform(src, '', mode='xml') perform(src, '', mode='html') def test_CDATA_escaping_mixed(self): src = ''' >''' perform(src, ' >', mode='xml') perform(src, ' >', mode='html') def test_script_commented_CDATA(self): script = 'if (1 < 2) { doc.write("

Offen bach

"); }\n' src = ''.format(script) perform(src, mode='html', expected_output=''.format(script)) perform(src, ''.format( script), mode='xml') def test_escape_dollar(self): perform('
$$
', '
$
') def test_escape_dollar_followed_by_dollar(self): perform('
$$$
', '
$$
') def test_double_escape_dollar(self): perform('
$$$$
', '
$$
') def test_preserve_dollar_not_variable_brace(self): perform('
$(
', '
$(
') perform('
$.
', '
$.
') def test_expr_name(self): perform('
Hello, $name
', '
Hello, Rick
') def test_expr_braced(self): perform('
Hello, ${name}
', '
Hello, Rick
') def test_expr_brace_complex(self): perform("
Hello, ${{'name':name}['name']}
", '
Hello, Rick
') def test_expr_multiline(self): perform("""
Hello, ${{'name': 'Rick', 'age': 26}['name']}
""", '
Hello, Rick
') def test_expr_multiline_and_IndentationError(self): try: XMLTemplate("""
Hello, ${ 'pippo' + 'baudo'}
""")().render() except XMLTemplateCompileError as e: assert "`'pippo' +\n 'baudo'`" in str(e), str(e) assert 'Hello' in str(e) assert 'baudo' in str(e) def test_expr_multiline_cdata(self): perform("""""", '') def test_jquery_call_is_not_expr(self): '''Ensure we handle '$(' as a text literal, since it cannot be a valid variable sequence. This simplifies, for example, templates containing inline scripts with jQuery calls which otherwise have to be written '$$(...' ''' js = "$(function () { alert('.ready()'); });" src = "
" + js + "
" out = "
" + js + "
" perform(src, out) def test_jquery_shortcut_is_not_expr(self): '''Ensure we handle '$.' as a text literal in script blocks''' js = "$.extend({}, {foo: 'bar'})" src = "
" + js + "
" out = "
" + js + "
" perform(src, out) def test_xml_entities(self): source = "
Cookies & Cream
" perform(source, source) def test_html_entities(self): source = "
Spam Spam < Spam > Spam …
" output = '
Spam Spam < Spam > Spam \u2026
' assert chr(32) in output # normal space assert chr(160) in output # non breaking space perform(source, output) class TestSwitch(TestCase): def test_switch(self): perform('''
$i is even odd
''', '''
0 is even
1 is odd
''') def test_switch_multi(self): perform('''
$i is ok nearly nope
''', '''
0 is ok
1 is nearly
2 is nope
3 is nope
4 is ok
5 is nearly
6 is nope
7 is nope
''') def test_case_elem(self): perform('''
0 1 2
''', '
\n 1\n
') def test_switch_div(self): try: tpl = perform('''

True

False

''', '
False
') except XMLTemplateCompileError as e: self.assertTrue( 'py:switch directive can only contain py:case and py:else nodes' in str(e) ) else: self.assertTrue(False, msg='Should have raised XMLTemplateParseError') class TestElse(TestCase): def test_pyif_pyelse(self): try: tpl = perform('''
True
False
''', '''
False
''') except XMLTemplateCompileError as e: self.assertTrue( 'py:else directive must be inside a py:switch or directly after py:if' in str(e) ) else: self.assertTrue(False, msg='Should have raised XMLTemplateParseError') def test_pyiftag_pyelse_continuation(self): tpl = perform( '''
True
False
''', '''
False
''' ) def test_pyif_pyelse_continuation(self): tpl = perform( '''
TrueFalse
''', '''
False
''' ) class TestWith(TestCase): def test_with(self): perform('''
$a
$a
$a
''', '''
foo
5
foo
''') def test_with_multiple(self): perform('''
$a - $b
$a - $b
$a - $b
''', '''
foo - 3
5 - 1
foo - 3
''') def test_with_multiple_and_whitespace(self): perform('''
$a - $b
''', '
foo - 3
') def test_with_trailing_semicolon(self): perform('''
$a
''', '
foo
') def test_with_ordered_multiple(self): perform('''
''' '''$a $b $c $d
''', '
foo foofoo oofoof oof
') def test_with_multiple_with_embedded_semicolons(self): perform('''
$a$b
''', '
;-)
') def test_standalone(self): perform('''
$a$b
''', '
;-)
') class TestFunction(TestCase): def test_function(self): perform('''
evenodd
$i is ${evenness(i)}
''', '''
0 is
even
1 is
odd
''') def test_empty_function(self): '''Do not crash if a function has no content.''' perform('
', '
') def test_function_in_attr(self): '''Attribute value with a function call.''' perform('''
text/$sz/$n
''', '
') class TestCall(TestCase): def test_call(self): perform('''
  • Quoth $speaker, ${caller(i)}
Nevermore $n
''', '''
''') class TestImport(TestCase): def test_import(self): loader = MockLoader({ 'lib.html': XMLTemplate(source='''
evenodd half of $n is ${evenness(n/2)}
'''), 'tpl.html': XMLTemplate(source='''
  • $i is ${simple_function.evenness(i)} ${simple_function.half_evenness(i)}
''') }) tpl = loader.import_('tpl.html') rsp = tpl(dict(name='Rick')).render() assert rsp == '''
''', rsp def test_import_auto(self): loader = MockLoader({ 'lib.html': XMLTemplate(source='''
evenodd half of $n is ${evenness(n/2)}
'''), 'tpl.html': XMLTemplate(source='''
  • $i is ${lib.evenness(i)} ${lib.half_evenness(i)}
''') }) tpl = loader.import_('tpl.html') rsp = tpl(dict(name='Rick')).render() assert rsp == '''
''', rsp def test_include(self): '''Must NOT result in: NameError: global name 'name' is not defined''' loader = MockLoader({ 'included.html': XMLTemplate('

The included template must also ' 'access Kajiki globals and the template context: ' '${value_of("name")}

\n'), 'tpl.html': XMLTemplate('

This is the body

\n' '') }) tpl = loader.import_('tpl.html') rsp = tpl(dict(name='Rick')).render() assert ('

This is the body

\n' '

The included template must also access Kajiki globals and ' 'the template context: Rick

' == rsp) def test_include_html5(self): '''Should not have DOCTYPE''' class XMLSourceLoader(MockLoader): """Fakes a FileLoader, but with source in a lookup table. It differs from MockLoader because MockLoader doesn't create the template on load, it's already pre-instantiated by the user of the MockLoader """ def __init__(self, sources): self.sources = sources super(XMLSourceLoader, self).__init__({}) def _load(self, name, encoding='utf-8', *args, **kwargs): return XMLTemplate(source=self.sources[name], mode='html5', *args, **kwargs) loader = XMLSourceLoader({ 'included.html': '

The included template must also ' 'access Kajiki globals and the template context: ' '${value_of("name")}

\n', 'tpl.html': '

This is the body

\n' '' }) tpl = loader.import_('tpl.html') rsp = tpl(dict(name='Rick')).render() assert ('\n

This is the body

\n' '

The included template must also access Kajiki globals and ' 'the template context: Rick

' == rsp), rsp class TestExtends(TestCase): def test_basic(self): loader = MockLoader({ 'parent.html': XMLTemplate('''

Header name=$name

Footer
id() = ${id()} local.id() = ${local.id()} self.id() = ${self.id()} child.id() = ${child.id()}
parent ${header()} ${body()} ${footer()}
'''), 'mid.html': XMLTemplate('''mid'''), 'child.html': XMLTemplate('''child

Child Body

${parent.body()}
''')}) tpl = loader.import_('child.html') rsp = tpl(dict(name='Rick')).render() assert rsp == '''

Header name=Rick

Child Body

id() = child local.id() = parent self.id() = child child.id() = mid
Footer
''', rsp def test_dynamic(self): loader = MockLoader({ 'parent0.html': XMLTemplate('Parent 0'), 'parent1.html': XMLTemplate('Parent 1'), 'child.html': XMLTemplate('''
''') }) tpl = loader.import_('child.html') rsp = tpl(dict(p=0)).render() assert rsp == '
Parent 0
', rsp rsp = tpl(dict(p=1)).render() assert rsp == '
Parent 1
', rsp def test_block(self): loader = MockLoader({ 'parent.html': XMLTemplate('''
Hello, $name!Sincerely,
$name
${greet(to)}

It was good seeing you last Friday. Thanks for the gift!

${sign(from_)}
'''), 'child.html': XMLTemplate('''Dear $name:${parent_block()}

And don't forget you owe me money!

''')}) parent = loader.import_('parent.html') rsp = parent({'to': 'Mark', 'from_': 'Rick'}).render() assert rsp == '''
Hello, Mark!

It was good seeing you last Friday. Thanks for the gift!

Sincerely,
Rick
''', rsp child = loader.import_('child.html') rsp = child({'to': 'Mark', 'from_': 'Rick'}).render() assert rsp == '''
Dear Mark:

It was good seeing you last Friday. Thanks for the gift!

And don't forget you owe me money!

Sincerely,
Rick
''', rsp def test_autoblocks(self): loader = MockLoader({ 'parent.html': XMLTemplate('''

It was good seeing you last Friday. Thanks for the gift!

'''), 'child.html': XMLTemplate(''' Great conference this weekend! ''', autoblocks=['body'])}) parent = loader.import_('parent.html') rsp = parent().render() assert rsp == '''

It was good seeing you last Friday. Thanks for the gift!

''', rsp child = loader.import_('child.html') rsp = child().render() assert rsp == ''' Great conference this weekend! ''', rsp def test_autoblocks_disabling(self): loader = MockLoader({ 'parent.html': XMLTemplate('''

It was good seeing you last Friday. Thanks for the gift!

''', autoblocks=['body']), 'child.html': XMLTemplate(''' Great conference this weekend! ''', autoblocks=['body'])}) parent = loader.import_('parent.html') rsp = parent().render() assert rsp == '''

It was good seeing you last Friday. Thanks for the gift!

''', rsp child = loader.import_('child.html') rsp = child().render() assert rsp == ''' Great conference this weekend! ''', rsp class TestClosure(TestCase): def test(self): perform('''
${x+y}${inner(x*2)}${add(5)}
''', '
15
') class TestPython(TestCase): def test_basic(self): perform('''
${os.path.join('a', 'b', 'c')}
''', '
a/b/c
') def test_indent(self): perform('''
${os.path.join('a','b','c')}
''', '
a/b/c
') def test_short(self): perform('''
${os.path.join('a', 'b', 'c')}
''', '
a/b/c
') def test_mod(self): perform('''
${os.path.join('a', 'b', 'c')}${test()}
''', '
a/b/c
') class TestComment(TestCase): def test_basic(self): perform('
' '
', '
') class TestAttributes(TestCase): def test_basic(self): perform('''
''', '
') def test_content(self): perform('''
''', '
foo
') def test_replace(self): perform('''
''', 'foo') def test_attrs(self): perform('
', '
') perform('''
''', '''
''') perform('
', '
') perform('
', '
') perform('
', '
') perform('
', '
') def test_strip(self): TPL = '

Header

' perform(TPL, '
Header
', context=dict(header=True)) perform(TPL, '

Header

', context=dict(header=False)) TPL = '''

It's...

''' perform(TPL, "
It's...
") def test_html_attrs(self): TPL = '' context0 = dict(checked=None) context1 = dict(checked=True) perform(TPL, '', context0, mode='xml') perform(TPL, '', context1, mode='xml') perform(TPL, '', context0, mode='html') perform(TPL, '', context1, mode='html') perform(TPL, '\n', context1, mode='html5', is_fragment=False) perform('\n' + TPL, '\n', context1, mode=None, is_fragment=False) def test_xml_namespaces(self): '''Namespaced attributes pass through.''' TPL = '

English text

' perform(TPL, TPL, mode='xml') perform(TPL, TPL, mode='html') def test_escape_attr_values(self): '''Escape static and dynamic attribute values.''' context = dict(url='https://domain.com/path?a=1&b=2') source = '''Link''' output = 'Link' perform(source, output, context, mode='html') perform(source, output, context, mode='xml') class TestDebug(TestCase): def test_debug(self): loader = FileLoader(path=os.path.join(os.path.dirname(__file__), 'data')) tpl = loader.import_('debug.html') try: tpl().render() assert False, 'Should have raised ValueError' except ValueError: exc_info = sys.exc_info() stack = traceback.extract_tb(exc_info[2]) # Verify we have stack trace entries in the template for fn, lno, func, line in stack: if fn.endswith('debug.html'): break else: assert False, 'Stacktrace is all python' class TestPackageLoader(TestCase): def test_pkg_loader(self): loader = PackageLoader() loader.import_('kajiki.tests.data.debug') class TestBuiltinFunctions(TestCase): def test_defined(self): perform('''
\
$albatross
\

$parrot

''', expected_output='

Bereft of life, it rests in peace

', context=dict(parrot='Bereft of life, it rests in peace')) def test_value_of(self): TPL = "

${value_of('albatross', 'Albatross!!!')}

" perform(TPL, expected_output="

It's

", context=dict(albatross="It's")) perform(TPL, expected_output="

Albatross!!!

") def test_literal(self): '''Escape by default; literal() marks as safe.''' context = dict(albatross="Albatross!!!") expected_output = "

Albatross!!!

" perform("

${literal(albatross)}

", expected_output, context) perform("

${Markup(albatross)}

", expected_output, context) perform("

$albatross

", "

<em>Albatross!!!</em>

", context) from kajiki.util import literal markup = '"&"' assert ''.join(list(literal(markup))) == markup class TestTranslation(TestCase): def test_scripts_non_translatable(self): src = '
Hi
' doc = _Parser('', src).parse() for n in _Compiler('', doc).compile(): text = getattr(n, 'text', '') if text in ('hello world', 'hello style'): self.assertFalse(isinstance(n, TranslatableTextNode)) for n in _Compiler('', doc, cdata_scripts=False).compile(): text = getattr(n, 'text', '') if text in ('hello world', 'hello style'): self.assertFalse(isinstance(n, TranslatableTextNode)) def test_extract_translate(self): src = '''
Hi

Hello World

''' expected = { False: '''
TRANSLATED(Hi)

\n\n TRANSLATED(Hello World)

''', True: '''
TRANSLATED(Hi)

TRANSLATED(Hello World)

''' } for strip_text in (False, True): # Build translation table messages = {} for _, _, msgid, _ in i18n.extract(BytesIO(src.encode('utf-8')), None, None, { 'strip_text': strip_text }): messages[msgid] = 'TRANSLATED(%s)' % msgid # Provide a fake translation function default_gettext = i18n.gettext i18n.gettext = lambda s: messages[s] try: perform(src, expected[strip_text], strip_text=strip_text) finally: i18n.gettext = default_gettext def test_extract_python_inside(self): src = '''
${_('hi')}

Hello World

''' expected = '''
xi

\n\n TRANSLATED(Hello World)

''' # Build translation table messages = {'hi': 'xi'} for _, _, msgid, _ in i18n.extract(BytesIO(src.encode('utf-8')), [], None, { 'extract_python': True }): messages[msgid] = 'TRANSLATED(%s)' % msgid # Provide a fake translation function default_gettext = i18n.gettext i18n.gettext = lambda s: messages[s] try: perform(src, expected) finally: i18n.gettext = default_gettext def test_extract_python_inside_invalid(self): src = '''
${_('hi' +)}
''' try: x = list(i18n.extract(BytesIO(src.encode('utf-8')), [], None, { 'extract_python': True })) except XMLTemplateCompileError as e: assert "_('hi' +)" in str(e) else: assert False, 'Should have raised' def test_substituting_gettext_with_lambda(self): src = '''hi''' expected = '''spam''' perform(src, expected, context=dict(gettext=lambda x: 'spam')) def test_substituting_gettext_with_lambda_extending(self): gettext = lambda x: 'egg' loader = MockLoader({ 'parent.html': XMLTemplate('''
parent
'''), 'child.html': XMLTemplate('''
child
''')}) tpl = loader.import_('child.html') rsp = tpl(dict(gettext=gettext)).render() assert rsp == '''
egg
egg
''', rsp def test_substituting_gettext_with_lambda_extending_twice(self): gettext = lambda x: 'egg' loader = MockLoader({ 'parent.html': XMLTemplate('''
parent
'''), 'mid.html': XMLTemplate('''
${variable}
'''), 'child.html': XMLTemplate('''
child
''')}) tpl = loader.import_('child.html') rsp = tpl(dict(variable='spam', gettext=gettext)).render() # variables must not be translated assert rsp == '''
egg
spam
egg
''', rsp def test_substituting_gettext_with_lambda_extending_file(self): loader = FileLoader(path=os.path.join(os.path.dirname(__file__), 'data'), base_globals=dict(gettext=lambda x: 'egg')) tpl = loader.import_('file_child.html') rsp = tpl(dict()).render() assert rsp == '''
egg
egg
''', rsp def test_without_substituting_gettext_with_lambda_extending_file(self): # this should use i18n.gettext loader = FileLoader(path=os.path.join(os.path.dirname(__file__), 'data')) tpl = loader.import_('file_child.html') rsp = tpl(dict()).render() assert rsp == '''
parent
child
''', rsp class TestDOMTransformations(TestCase): def test_empty_text_extraction(self): doc = kajiki.xml_template._Parser('', ''' text ''').parse() doc = kajiki.xml_template._DomTransformer(doc, strip_text=False).transform() text_data = [n.data for n in doc.firstChild.childNodes] self.assertEqual([' ', 'text', ' '], text_data) def test_empty_text_extraction_lineno(self): doc = kajiki.xml_template._Parser('', ''' text ''').parse() doc = kajiki.xml_template._DomTransformer(doc, strip_text=False).transform() linenos = [n.lineno for n in doc.firstChild.childNodes] self.assertEqual([1, 3, 3], linenos) # Last node starts on same line as it starts with \n class TestErrorReporting(TestCase): def test_syntax_error(self): for strip_text in (False, True): try: perform('
${i}
', '', strip_text=strip_text) except KajikiSyntaxError as exc: assert '--> for i i range(1, 2):' in str(exc), exc else: assert False def test_code_error(self): for strip_text in (False, True): try: child = FileLoader( os.path.join(os.path.dirname(__file__), 'data') ).load('error.html', strip_text=strip_text) child().render() except ZeroDivisionError as exc: import traceback, sys l = traceback.format_exception(*sys.exc_info()) last_line = l[-2] assert '${3/0}' in last_line, last_line else: assert False class TestBracketsInExpression(TestCase): def test_simple(self): perform('${\'ok\'}', 'ok') def test_some_brackets(self): perform('${\'{ok}\'}', '{ok}') def test_brackets_asymmetric(self): perform('${\'{o{k}k { \'}', '{o{k}k { ') def test_complex(self): perform(u"
${'ciao { } {' + \"a {} b {{{{} w}}rar\"}${'sd{}'} ${1+1}
", u"
ciao { } {a {} b {{{{} w}}rarsd{} 2
") def test_with_padding_space(self): perform(' ${ "hello" + "world" } ', ' helloworld ') def test_raise_unclosed_string(self): try: XMLTemplate('${"ciao}') assert False, 'must raise' except XMLTemplateCompileError as e: # assert "can't compile" in str(e), e # different between pypy and cpython assert '"ciao' in str(e), e def test_raise_plus_with_an_operand(self): try: XMLTemplate('${"ciao" + }') assert False, 'must raise' except XMLTemplateCompileError as e: assert 'detected an invalid python expression' in str(e), e assert '"ciao" +' in str(e), e def test_unclosed_braced(self): try: XMLTemplate('${"ciao"') assert False, 'must raise' except XMLTemplateCompileError as e: assert 'Braced expression not terminated' in str(e), e def test_leading_opening_brace(self): if sys.version_info[:2] == (2, 6): raise SkipTest('Python 2.6 compiler raises a different kind of error') try: XMLTemplate('${{"a", "b"}') assert False, 'must raise' except XMLTemplateCompileError as e: assert 'Braced expression not terminated' in str(e), e class TestMultipleChildrenInDOM(TestCase): def test_ok(self): XMLTemplate('${1+1}') def test_comment(self): res = XMLTemplate('${1+1}')().render() assert res == '2' def test_multiple_nodes(self): try: XMLTemplate('${1+1}${1+1}') except XMLTemplateParseError as e: assert 'junk after document element' in str(e), e else: assert False, 'should have raised' def test_only_comment(self): try: XMLTemplate('') except XMLTemplateParseError as e: assert 'no element found' in str(e), e else: assert False, 'should have raised' class TestSyntaxErrorCallingWithTrailingParenthesis(TestCase): def test_raise(self): try: XMLTemplate(u'''
$x${echo('hello'))}
''') assert False, 'should raise' except XMLTemplateCompileError as e: pass if __name__ == '__main__': main() Kajiki-0.8.2/kajiki/tests/test_ir.py0000644000076500000240000002211513003220733017417 0ustar amolstaff00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import (absolute_import, division, print_function, unicode_literals) from unittest import TestCase, main import kajiki from kajiki import ir class TestBasic(TestCase): def setUp(self): self.tpl = ir.TemplateNode( defs=[ir.DefNode( '__main__()', ir.TextNode('Hello, '), ir.ExprNode('name'), ir.TextNode('\n'))]) def test(self): tpl = kajiki.template.from_ir(self.tpl) rsp = tpl(dict(name='Rick')).render() assert rsp == 'Hello, Rick\n', rsp class TestSwitch(TestCase): def setUp(self): self.tpl = ir.TemplateNode( defs=[ir.DefNode( '__main__()', ir.ForNode( 'i in range(2)', ir.ExprNode('i'), ir.TextNode(' is '), ir.SwitchNode( 'i % 2', ir.CaseNode( '0', ir.TextNode('even\n')), ir.ElseNode( ir.TextNode('odd\n')))))]) def test_basic(self): tpl = kajiki.template.from_ir(self.tpl) rsp = tpl(dict()).render() assert rsp == '0 is even\n1 is odd\n', rsp class TestFunction(TestCase): def setUp(self): self.tpl = ir.TemplateNode( defs=[ir.DefNode( 'evenness(n)', ir.IfNode( 'n % 2 == 0', ir.TextNode('even')), ir.ElseNode( ir.TextNode('odd'))), ir.DefNode( '__main__()', ir.ForNode( 'i in range(2)', ir.ExprNode('i'), ir.TextNode(' is '), ir.ExprNode('evenness(i)'), ir.TextNode('\n')))]) def test_basic(self): tpl = kajiki.template.from_ir(self.tpl) rsp = tpl(dict(name='Rick')).render() assert rsp == '0 is even\n1 is odd\n', rsp class TestCall(TestCase): def setUp(self): self.tpl = ir.TemplateNode( defs=[ir.DefNode( 'quote(caller, speaker)', ir.ForNode( 'i in range(2)', ir.TextNode('Quoth '), ir.ExprNode('speaker'), ir.TextNode(', "'), ir.ExprNode('caller(i)'), ir.TextNode('."\n'))), ir.DefNode( '__main__()', ir.CallNode( '$caller(n)', "quote($caller, 'the raven')", ir.TextNode('Nevermore '), ir.ExprNode('n')))]) def test_basic(self): tpl = kajiki.template.from_ir(self.tpl) rsp = tpl(dict(name='Rick')).render() assert ( rsp == 'Quoth the raven, "Nevermore 0."\n' 'Quoth the raven, "Nevermore 1."\n'), rsp class TestImport(TestCase): def setUp(self): lib = ir.TemplateNode( defs=[ir.DefNode( 'evenness(n)', ir.IfNode( 'n % 2 == 0', ir.TextNode('even')), ir.ElseNode( ir.TextNode('odd'))), ir.DefNode( 'half_evenness(n)', ir.TextNode(' half of '), ir.ExprNode('n'), ir.TextNode(' is '), ir.ExprNode('evenness(n/2)'))]) tpl = ir.TemplateNode( defs=[ir.DefNode( '__main__()', ir.ImportNode( 'lib.txt', 'simple_function'), ir.ForNode( 'i in range(4)', ir.ExprNode('i'), ir.TextNode(' is '), ir.ExprNode('simple_function.evenness(i)'), ir.ExprNode('simple_function.half_evenness(i)'), ir.TextNode('\n')))]) loader = kajiki.loader.MockLoader({ 'lib.txt': kajiki.template.from_ir(lib), 'tpl.txt': kajiki.template.from_ir(tpl)}) self.tpl = loader.import_('tpl.txt') def test_import(self): rsp = self.tpl(dict(name='Rick')).render() assert (rsp == '0 is even half of 0 is even\n' '1 is odd half of 1 is odd\n' '2 is even half of 2 is odd\n' '3 is odd half of 3 is odd\n'), rsp class TestInclude(TestCase): def setUp(self): hdr = ir.TemplateNode( defs=[ ir.DefNode( '__main__()', ir.TextNode('# header\n'))]) tpl = ir.TemplateNode( defs=[ ir.DefNode( '__main__()', ir.TextNode('a\n'), ir.IncludeNode('hdr.txt'), ir.TextNode('b\n'))]) loader = kajiki.loader.MockLoader({ 'hdr.txt': kajiki.template.from_ir(hdr), 'tpl.txt': kajiki.template.from_ir(tpl)}) self.tpl = loader.import_('tpl.txt') def test_include(self): rsp = self.tpl(dict(name='Rick')).render() assert rsp == 'a\n# header\nb\n', rsp class TestExtends(TestCase): def setUp(self): parent_tpl = ir.TemplateNode( defs=[ ir.DefNode( '__main__()', ir.ExprNode('header()'), ir.ExprNode('body()'), ir.ExprNode('footer()')), ir.DefNode( 'header()', ir.TextNode('# Header name='), ir.ExprNode('name'), ir.TextNode('\n')), ir.DefNode( 'body()', ir.TextNode('## Parent Body\n'), ir.TextNode('local.id() = '), ir.ExprNode('local.id()'), ir.TextNode('\n'), ir.TextNode('self.id() = '), ir.ExprNode('self.id()'), ir.TextNode('\n'), ir.TextNode('child.id() = '), ir.ExprNode('child.id()'), ir.TextNode('\n')), ir.DefNode( 'footer()', ir.TextNode('# Footer\n')), ir.DefNode( 'id()', ir.TextNode('parent'))]) mid_tpl = ir.TemplateNode( defs=[ ir.DefNode( '__main__()', ir.ExtendNode('parent.txt')), ir.DefNode( 'id()', ir.TextNode('mid'))]) child_tpl = ir.TemplateNode( defs=[ ir.DefNode( '__main__()', ir.ExtendNode('mid.txt')), ir.DefNode( 'body()', ir.TextNode('## Child Body\n'), ir.ExprNode('parent.body()')), ir.DefNode( 'id()', ir.TextNode('child'))]) loader = kajiki.loader.MockLoader({ 'parent.txt': kajiki.template.from_ir(parent_tpl), 'mid.txt': kajiki.template.from_ir(mid_tpl), 'child.txt': kajiki.template.from_ir(child_tpl)}) self.loader = loader self.tpl = loader.import_('child.txt') def test_extends(self): rsp = self.tpl(dict(name='Rick')).render() assert (rsp == '# Header name=Rick\n' '## Child Body\n' '## Parent Body\n' 'local.id() = parent\n' 'self.id() = child\n' 'child.id() = mid\n' '# Footer\n'), rsp class TestDynamicExtends(TestCase): def setUp(self): p0 = ir.TemplateNode( defs=[ ir.DefNode( '__main__()', ir.TextNode('Parent 0'))]) p1 = ir.TemplateNode( defs=[ ir.DefNode( '__main__()', ir.TextNode('Parent 1'))]) child = ir.TemplateNode( defs=[ ir.DefNode( '__main__()', ir.IfNode( 'p==0', ir.ExtendNode('parent0.txt')), ir.ElseNode( ir.ExtendNode('parent1.txt')))]) loader = kajiki.loader.MockLoader({ 'parent0.txt': kajiki.template.from_ir(p0), 'parent1.txt': kajiki.template.from_ir(p1), 'child.txt': kajiki.template.from_ir(child)}) self.loader = loader self.tpl = loader.import_('child.txt') def test_extends(self): rsp = self.tpl(dict(p=0)).render() assert rsp == 'Parent 0', rsp rsp = self.tpl(dict(p=1)).render() assert rsp == 'Parent 1', rsp if __name__ == '__main__': main() Kajiki-0.8.2/kajiki/tests/test_runtime.py0000644000076500000240000001663712554436352020524 0ustar amolstaff00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import (absolute_import, division, print_function, unicode_literals) from unittest import TestCase, main import kajiki class TestBasic(TestCase): def setUp(self): class tpl: @kajiki.expose def __main__(): yield 'Hello,' yield name yield '\n' self.tpl = kajiki.Template(tpl) def test_basic(self): rsp = self.tpl(dict(name='Rick')).render() assert rsp == 'Hello,Rick\n', rsp class TestSwitch(TestCase): def setUp(self): class tpl: @kajiki.expose def __main__(): for i in range(2): yield local.__kj__.escape(i) yield ' is ' local.__kj__.push_switch(i % 2) if local.__kj__.case(0): yield 'even\n' else: yield 'odd\n' self.tpl = kajiki.Template(tpl) def test_basic(self): rsp = self.tpl().render() assert rsp == '0 is even\n1 is odd\n', rsp class TestFunction(TestCase): def setUp(self): class tpl: @kajiki.expose def evenness(n): if n % 2 == 0: yield 'even' else: yield 'odd' @kajiki.expose def __main__(): for i in range(2): yield local.__kj__.escape(i) yield ' is ' yield evenness(i) yield '\n' self.tpl = kajiki.Template(tpl) def test_basic(self): rsp = self.tpl(dict(name='Rick')).render() assert rsp == '0 is even\n1 is odd\n', rsp class TestCall(TestCase): def setUp(self): class tpl: @kajiki.expose def quote(caller, speaker): for i in range(2): yield 'Quoth ' yield speaker yield ', "' yield caller(i) yield '."\n' @kajiki.expose def __main__(): @__kj__.flattener.decorate def _kj_lambda(n): yield 'Nevermore ' yield local.__kj__.escape(n) yield quote(_kj_lambda, 'the raven') del _kj_lambda self.tpl = kajiki.Template(tpl) def test_basic(self): rsp = self.tpl(dict(name='Rick')).render() assert ( rsp == 'Quoth the raven, "Nevermore 0."\n' 'Quoth the raven, "Nevermore 1."\n'), rsp class TestImport(TestCase): def setUp(self): class lib_undec: @kajiki.expose def evenness(n): if n % 2 == 0: yield 'even' else: yield 'odd' @kajiki.expose def half_evenness(n): yield ' half of ' yield local.__kj__.escape(n) yield ' is ' yield evenness(n / 2) lib = kajiki.Template(lib_undec) class tpl: @kajiki.expose def __main__(): simple_function = lib(dict(globals())) for i in range(4): yield local.__kj__.escape(i) yield ' is ' yield simple_function.evenness(i) yield simple_function.half_evenness(i) yield '\n' self.tpl = kajiki.Template(tpl) def test_import(self): rsp = self.tpl(dict(name='Rick')).render() assert (rsp == '0 is even half of 0 is even\n' '1 is odd half of 1 is odd\n' '2 is even half of 2 is odd\n' '3 is odd half of 3 is odd\n'), rsp class TestInclude(TestCase): def setUp(self): class hdr_undec: @kajiki.expose def __main__(): yield '# header\n' hdr = kajiki.Template(hdr_undec) class tpl_undec: @kajiki.expose def __main__(): yield 'a\n' yield hdr().__main__() yield 'b\n' tpl = kajiki.Template(tpl_undec) self.tpl = tpl def test_include(self): rsp = self.tpl(dict(name='Rick')).render() assert rsp == 'a\n# header\nb\n', rsp class TestExtends(TestCase): def setUp(_self): class parent_tpl_undec: @kajiki.expose def __main__(): yield header() yield body() yield footer() @kajiki.expose def header(): yield '# Header name=' yield name yield '\n' @kajiki.expose def body(): yield '## Parent Body\n' yield 'local.id() = ' yield local.id() yield '\n' yield 'self.id() = ' yield self.id() yield '\n' yield 'child.id() = ' yield child.id() yield '\n' @kajiki.expose def footer(): yield '# Footer' yield '\n' @kajiki.expose def id(): yield 'parent' parent_tpl = kajiki.Template(parent_tpl_undec) class mid_tpl_undec: @kajiki.expose def __main__(): yield local.__kj__.extend(parent_tpl).__main__() @kajiki.expose def id(): yield 'mid' mid_tpl = kajiki.Template(mid_tpl_undec) class child_tpl_undec: @kajiki.expose def __main__(): yield local.__kj__.extend(mid_tpl).__main__() @kajiki.expose def body(): yield '## Child Body\n' yield parent.body() @kajiki.expose def id(): yield 'child' child_tpl = kajiki.Template(child_tpl_undec) _self.parent_tpl = parent_tpl _self.child_tpl = child_tpl def test_extends(self): rsp = self.child_tpl(dict(name='Rick')).render() assert (rsp == '# Header name=Rick\n' '## Child Body\n' '## Parent Body\n' 'local.id() = parent\n' 'self.id() = child\n' 'child.id() = mid\n' '# Footer\n'), rsp class TestDynamicExtends(TestCase): def setUp(_self): class parent_0_undec: @kajiki.expose def __main__(): yield 'Parent 0' parent_0 = kajiki.Template(parent_0_undec) class parent_1_undec: @kajiki.expose def __main__(): yield 'Parent 1' parent_1 = kajiki.Template(parent_1_undec) class child_tpl: @kajiki.expose def __main__(): if p == 0: yield local.__kj__.extend(parent_0).__main__() else: yield local.__kj__.extend(parent_1).__main__() _self.child_tpl = kajiki.Template(child_tpl) def test_extends(self): rsp = self.child_tpl(dict(p=0)).render() assert rsp == 'Parent 0', rsp rsp = self.child_tpl(dict(p=1)).render() assert rsp == 'Parent 1', rsp if __name__ == '__main__': main() Kajiki-0.8.2/kajiki/tests/__init__.py0000644000076500000240000000020613003220742017502 0ustar amolstaff00000000000000# -*- coding: utf-8 -*- from __future__ import (absolute_import, division, print_function, unicode_literals) Kajiki-0.8.2/kajiki/tests/test_doctype.py0000644000076500000240000000310412554436352020471 0ustar amolstaff00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import (absolute_import, division, print_function, unicode_literals) from unittest import TestCase, main from nine import str from kajiki.doctype import DocumentTypeDeclaration, extract_dtd XHTML1 = '' class TestDTD(TestCase): def test_dtd(self): dtd = DocumentTypeDeclaration.by_uri[''] assert dtd.name == 'html5' assert str(dtd) == '', str(dtd) assert dtd.rendering_mode == 'html5' dtd = DocumentTypeDeclaration.by_uri[None] assert dtd.name == 'xhtml5' assert str(dtd) == '', str(dtd) assert dtd.rendering_mode == 'xml' dtd = DocumentTypeDeclaration.by_uri[ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"] assert dtd.name == 'xhtml1transitional' assert str(dtd) == XHTML1 assert dtd.rendering_mode == 'xml' def test_extract_dtd(self): html = '
Test template
' markup = XHTML1 + html extracted, pos, rest = extract_dtd(markup) # The function being tested assert extracted == XHTML1 assert pos == 0 assert rest == html dtd = DocumentTypeDeclaration.matching(extracted) # Another function assert dtd is DocumentTypeDeclaration.by_uri[ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"] if __name__ == '__main__': main() Kajiki-0.8.2/kajiki/tests/test_text.py0000644000076500000240000002236613003162475020011 0ustar amolstaff00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import (absolute_import, division, print_function, unicode_literals) import os import sys import traceback from unittest import TestCase, main from kajiki import MockLoader, FileLoader, TextTemplate class TestBasic(TestCase): def test_auto_escape(self): tpl = TextTemplate(source="${'

'}", autoescape=True) rsp = tpl().render() assert rsp == '<h1>', rsp def test_auto_escape_disable(self): tpl = TextTemplate(source="${literal('

')}") rsp = tpl().render() assert rsp == '

', rsp tpl = TextTemplate(source="${'

'}", autoescape=False) rsp = tpl().render() assert rsp == '

', rsp def test_expr_brace(self): tpl = TextTemplate(source='Hello, ${name}\n') rsp = tpl(dict(name='Rick')).render() assert rsp == 'Hello, Rick\n', rsp def test_expr_None(self): tpl = TextTemplate(source='Hello, ${name}\n') rsp = tpl(dict(name=None)).render() assert rsp == 'Hello, \n', rsp def test_expr_brace_complex(self): tpl = TextTemplate(source="Hello, ${{'name':name}['name']}\n") rsp = tpl(dict(name='Rick')).render() assert rsp == 'Hello, Rick\n', rsp def test_expr_name(self): tpl = TextTemplate(source='Hello, $name\n') rsp = tpl(dict(name='Rick')).render() assert rsp == 'Hello, Rick\n', rsp tpl = TextTemplate(source='Hello, $obj.name\n') class Empty: pass Empty.name = 'Rick' rsp = tpl(dict(obj=Empty)).render() assert rsp == 'Hello, Rick\n', rsp def test_expr_multiline(self): tpl = TextTemplate(source="""Hello, ${{'name': 'Rick', 'age': 26}['name']}""") rsp = tpl().render() assert rsp == 'Hello, Rick', (rsp, 'Hello, Rick') class TestSwitch(TestCase): def test_switch(self): tpl = TextTemplate('''%for i in range(2) $i is {%switch i % 2 %}{%case 0%}even\n{%else%}odd\n{%end%}\\ %end''') rsp = tpl(dict(name='Rick')).render() assert rsp == '0 is even\n1 is odd\n', rsp def test_ljust(self): tpl = TextTemplate(''' %for i in range(2) $i is {%switch i % 2 %}{%case 0%}even\n{%else%}odd\n{%end%}\\ %end''') rsp = tpl(dict(name='Rick')).render() assert rsp == '0 is even\n1 is odd\n', rsp tpl = TextTemplate(''' {%-for i in range(2)%}\\ $i is {%switch i % 2 %}{%case 0%}even{%else%}odd{%end%} {%-end%}''') rsp = tpl(dict(name='Rick')).render() assert rsp == '0 is even\n1 is odd\n', rsp def test_rstrip(self): tpl = TextTemplate(''' %for i in range(2) $i is {%switch i % 2 %}{%case 0-%} even\n{%else%}odd\n{%end%}\\ %end''') rsp = tpl(dict(name='Rick')).render() assert rsp == '0 is even\n1 is odd\n', rsp class TestFunction(TestCase): def test_function(self): tpl = TextTemplate('''%def evenness(n) {%if n % 2 == 0 %}even{%else%}odd{%end%}\\ %end %for i in range(2) $i is ${evenness(i)} %end ''') rsp = tpl(dict(name='Rick')).render() assert rsp == '0 is even\n1 is odd\n', rsp class TestCall(TestCase): def test_call(self): tpl = TextTemplate('''%def quote(caller, speaker) %for i in range(2) Quoth $speaker, "${caller(i)}." %end %end %call(n) quote(%caller ,'the raven') Nevermore $n\\ %end''') rsp = tpl(dict(name='Rick')).render() assert ( rsp == 'Quoth the raven, "Nevermore 0."\n' 'Quoth the raven, "Nevermore 1."\n'), rsp class TestImport(TestCase): def test_import_simple(self): lib = TextTemplate('''%def evenness(n) %if n % 2 == 0 even\\ %else odd\\ %end %end %def half_evenness(n) half of $n is ${evenness(n/2)}\\ %end''') tpl = TextTemplate('''%import "lib.txt" as simple_function %for i in range(4) $i is ${simple_function.evenness(i)}${simple_function.half_evenness(i)} %end''') loader = MockLoader({ 'lib.txt': lib, 'tpl.txt': tpl}) tpl = loader.import_('tpl.txt') rsp = tpl(dict(name='Rick')).render() assert (rsp == '0 is even half of 0 is even\n' '1 is odd half of 1 is odd\n' '2 is even half of 2 is odd\n' '3 is odd half of 3 is odd\n'), rsp def test_import_auto(self): lib = TextTemplate('''%def evenness(n) %if n % 2 == 0 even\\ %else odd\\ %end %end %def half_evenness(n) half of $n is ${evenness(n/2)}\\ %end''') tpl = TextTemplate('''%import "lib.txt" %for i in range(4) $i is ${lib.evenness(i)}${lib.half_evenness(i)} %end''') loader = MockLoader({ 'lib.txt': lib, 'tpl.txt': tpl}) tpl = loader.import_('tpl.txt') rsp = tpl(dict(name='Rick')).render() assert (rsp == '0 is even half of 0 is even\n' '1 is odd half of 1 is odd\n' '2 is even half of 2 is odd\n' '3 is odd half of 3 is odd\n'), rsp def test_include(self): loader = MockLoader({ 'hdr.txt': TextTemplate('# header\n'), 'tpl.txt': TextTemplate('''a %include "hdr.txt" b ''')}) tpl = loader.import_('tpl.txt') rsp = tpl(dict(name='Rick')).render() assert rsp == 'a\n# header\nb\n', rsp class TestExtends(TestCase): def test_basic(self): parent = TextTemplate(''' %def header() # Header name=$name %end %def footer() # Footer %end %def body() ## Parent Body id() = ${id()} local.id() = ${local.id()} self.id() = ${self.id()} child.id() = ${child.id()} %end %def id() parent\\ %end ${header()}${body()}${footer()}''') mid = TextTemplate('''%extends "parent.txt" %def id() mid\\ %end ''') child = TextTemplate('''%extends "mid.txt" %def id() child\\ %end %def body() ## Child Body ${parent.body()}\\ %end ''') loader = MockLoader({ 'parent.txt': parent, 'mid.txt': mid, 'child.txt': child}) tpl = loader.import_('child.txt') rsp = tpl(dict(name='Rick')).render() assert (rsp == '# Header name=Rick\n' '## Child Body\n' '## Parent Body\n' 'id() = child\n' 'local.id() = parent\n' 'self.id() = child\n' 'child.id() = mid\n' '# Footer\n'), rsp def test_dynamic(self): loader = MockLoader({ 'parent0.txt': TextTemplate('Parent 0'), 'parent1.txt': TextTemplate('Parent 1'), 'child.txt': TextTemplate('''%if p == 0 %extends "parent0.txt" %else %extends "parent1.txt" %end ''') }) tpl = loader.import_('child.txt') rsp = tpl(dict(p=0)).render() assert rsp == 'Parent 0', rsp rsp = tpl(dict(p=1)).render() assert rsp == 'Parent 1', rsp def test_block(self): loader = MockLoader({ 'parent.txt': TextTemplate('''%def greet(name) Hello, $name!\\ %end %def sign(name) Sincerely, $name\\ %end ${greet(to)} %block body It was good seeing you last Friday. Thanks for the gift! %end ${sign(from_)} '''), 'child.txt': TextTemplate('''%extends "parent.txt" %def greet(name) Dear $name:\\ %end %block body ${parent_block()}\\ And don't forget you owe me money! %end ''')}) child = loader.import_('child.txt') rsp = child({'to': 'Mark', 'from_': 'Rick'}).render() assert (rsp == '''Dear Mark: It was good seeing you last Friday. Thanks for the gift! And don't forget you owe me money! Sincerely, Rick '''), rsp class TestClosure(TestCase): def test(self): tpl = TextTemplate('''%def add(x) %def inner(y) ${x+y}\\ %end ${inner(x*2)}\\ %end ${add(5)} ''') rsp = tpl(dict(name='Rick')).render() assert rsp == '15\n', rsp class TestPython(TestCase): def test_basic(self): tpl = TextTemplate('''%py import os %end ${os.path.join('a','b','c')}''') rsp = tpl(dict(name='Rick')).render() assert rsp == 'a/b/c' def test_indent(self): tpl = TextTemplate('''%py import os import re %end ${os.path.join('a','b','c')}''') rsp = tpl(dict(name='Rick')).render() assert rsp == 'a/b/c' def test_short(self): tpl = TextTemplate('''%py import os ${os.path.join('a','b','c')}''') rsp = tpl(dict(name='Rick')).render() assert rsp == 'a/b/c' def test_mod(self): tpl = TextTemplate('''%py% import os %def test() ${os.path.join('a','b','c')}\\ %end ${test()}''') rsp = tpl(dict(name='Rick')).render() assert rsp == 'a/b/c' class TestDebug(TestCase): def test_debug(self): loader = FileLoader(path=os.path.join(os.path.dirname(__file__), 'data')) tpl = loader.import_('debug.txt') try: tpl().render() except ValueError: exc_info = sys.exc_info() stack = traceback.extract_tb(exc_info[2]) else: assert False, 'Should have raised ValueError' # Verify we have stack trace entries in the template for fn, lno, func, line in stack: if fn.endswith('debug.txt'): break else: assert False, 'Stacktrace is all python' if __name__ == '__main__': main() Kajiki-0.8.2/kajiki/tests/data/0000755000076500000240000000000013567202501016314 5ustar amolstaff00000000000000Kajiki-0.8.2/kajiki/tests/data/file_parent.html0000644000076500000240000000002213155474165021476 0ustar amolstaff00000000000000
parent
Kajiki-0.8.2/kajiki/tests/data/file_child.html0000644000076500000240000000010213155474165021267 0ustar amolstaff00000000000000
child
Kajiki-0.8.2/kajiki/tests/data/debug.txt0000644000076500000240000000016212554436352020152 0ustar amolstaff00000000000000%def one() ${two()} %end %def two() ${three()} %end %def three() %py raise ValueError('Test error') %end ${one()} Kajiki-0.8.2/kajiki/tests/data/__init__.py0000644000076500000240000000000012554436352020423 0ustar amolstaff00000000000000Kajiki-0.8.2/kajiki/tests/data/debug.html0000644000076500000240000000031112554436352020273 0ustar amolstaff00000000000000
${two()} ${three()} ${one()}
Kajiki-0.8.2/kajiki/tests/data/error.html0000644000076500000240000000005313003513322020320 0ustar amolstaff00000000000000
${3/0}
Kajiki-0.8.2/kajiki/tests/data/simple.html0000644000076500000240000000030612554436352020502 0ustar amolstaff00000000000000
${two()} ${three()} ${one()}
Kajiki-0.8.2/kajiki/__init__.py0000644000076500000240000000056612554436352016371 0ustar amolstaff00000000000000# -*- coding: utf-8 -*- from __future__ import (absolute_import, division, print_function, unicode_literals) from .util import expose, flattener from .template import Template from .loader import MockLoader, FileLoader, PackageLoader from .text import TextTemplate from .xml_template import XMLTemplate from .version import __version__, __release__ Kajiki-0.8.2/kajiki/ir.py0000644000076500000240000003122513004733257015233 0ustar amolstaff00000000000000# -*- coding: utf-8 -*- from __future__ import (absolute_import, division, print_function, unicode_literals) from itertools import chain import re from .util import gen_name, flattener, window from nine import nine def generate_python(ir): cur_indent = 0 for node in flattener(ir): if isinstance(node, IndentNode): cur_indent += 4 elif isinstance(node, DedentNode): cur_indent -= 4 for line in node.py(): yield line.indent(cur_indent) class Node(object): def __init__(self): self.filename = '' self.lineno = 0 def py(self): # pragma no cover return [] def __iter__(self): yield self def line(self, text): return PyLine(self.filename, self.lineno, text) class PassNode(Node): def py(self): # 'pass' would result in: TypeError: 'NoneType' object is not iterable yield self.line('yield ""') class HierNode(Node): '''Base for nodes that contain an indented Python block (def, for, if etc.) ''' def __init__(self, body): super(HierNode, self).__init__() self.body = tuple(x for x in body if x is not None) def body_iter(self): for x in optimize(flattener(map(flattener, self.body))): yield x def __iter__(self): yield self yield IndentNode() for x in self.body_iter(): yield x yield DedentNode() class IndentNode(Node): pass class DedentNode(Node): pass class TemplateNode(HierNode): """Represents the root Intermediate Representation node of a template. Iterating over this will generate the Python code for the class that provides all the functions that are part of the template including the ``__main__`` function that represents the template code itself. The generated class will then be passed to :meth:`kajiki.template.Template` to create a :class:`kajiki.template._Template` subclass that has the ``render`` method to render the template. """ class TemplateTail(Node): def py(self): yield self.line('template = kajiki.Template(template)') def __init__(self, mod_py=None, defs=None): super(TemplateNode, self).__init__(defs) if mod_py is None: mod_py = [] if defs is None: defs = [] self.mod_py = [x for x in mod_py if x is not None] def py(self): yield self.line('class template:') def __iter__(self): for x in flattener(self.mod_py): yield x for x in super(TemplateNode, self).__iter__(): yield x yield self.TemplateTail() class ImportNode(Node): def __init__(self, tpl_name, alias=None): super(ImportNode, self).__init__() self.tpl_name = tpl_name self.alias = alias def py(self): yield self.line( 'local.__kj__.import_(%r, %r, self.__globals__)' % ( self.tpl_name, self.alias)) class IncludeNode(Node): def __init__(self, tpl_name): super(IncludeNode, self).__init__() self.tpl_name = tpl_name def py(self): yield self.line( 'yield local.__kj__.import_(%r, None, self.__globals__).__main__()' % ( self.tpl_name)) class ExtendNode(Node): def __init__(self, tpl_name): super(ExtendNode, self).__init__() self.tpl_name = tpl_name def py(self): yield self.line( 'yield local.__kj__.extend(%r).__main__()' % ( self.tpl_name)) class DefNode(HierNode): prefix = '@kajiki.expose' def __init__(self, decl, *body): super(DefNode, self).__init__(body) self.decl = decl def py(self): yield self.line(self.prefix) yield self.line('def %s:' % (self.decl)) def __iter__(self): yield self yield IndentNode() is_empty = True for x in self.body_iter(): yield x is_empty = False if is_empty: # In Python, a function without a body is a SyntaxError. yield PassNode() # Prevent creation of a function without a body yield DedentNode() class InnerDefNode(DefNode): prefix = '@__kj__.flattener.decorate' class CallNode(HierNode): class CallTail(Node): def __init__(self, call): super(CallNode.CallTail, self).__init__() self.call = call def py(self): yield self.line('yield ' + self.call) def __init__(self, caller, callee, *body): super(CallNode, self).__init__(body) fname = gen_name() self.decl = caller.replace('$caller', fname) self.call = callee.replace('$caller', fname) def py(self): yield self.line('@__kj__.flattener.decorate') yield self.line('def %s:' % (self.decl)) def __iter__(self): yield self yield IndentNode() for x in self.body_iter(): yield x yield DedentNode() yield self.CallTail(self.call) class ForNode(HierNode): def __init__(self, decl, *body): super(ForNode, self).__init__(body) self.decl = decl def py(self): yield self.line('for %s:' % (self.decl)) class WithNode(HierNode): assignment_pattern = re.compile(r'(?:^|;)\s*([^;=]+)=(?!=)', re.M) class WithTail(Node): def __init__(self, var_names): super(WithNode.WithTail, self).__init__() self.var_names = var_names def py(self): yield self.line('(%s,) = local.__kj__.pop_with()' % (','.join(self.var_names),)) # yield self.line('if %s == (): del %s' % (v, v)) def __init__(self, vars, *body): super(WithNode, self).__init__(body) assignments = [] matches = self.assignment_pattern.finditer(vars) for m1, m2 in window(chain(matches, [None]), 2): lhs = m1.group(1).strip() rhs = vars[m1.end():(m2.start() if m2 else len(vars))] assignments.append((lhs, rhs)) self.vars = assignments self.var_names = [l for l, _ in assignments] def py(self): yield self.line( 'local.__kj__.push_with(locals(), [%s])' % ( ','.join('"%s"' % k for k in self.var_names),)) for k, v in self.vars: yield self.line('%s = %s' % (k, v)) def __iter__(self): yield self for x in self.body_iter(): yield x yield self.WithTail(self.var_names) class SwitchNode(HierNode): class SwitchTail(Node): def py(self): yield self.line('local.__kj__.pop_switch()') def __init__(self, decl, *body): super(SwitchNode, self).__init__(body) self.decl = decl def py(self): yield self.line('local.__kj__.push_switch(%s)' % self.decl) yield self.line('if False: pass') def __iter__(self): yield self for x in self.body_iter(): yield x yield self.SwitchTail() class CaseNode(HierNode): def __init__(self, decl, *body): super(CaseNode, self).__init__(body) self.decl = decl def py(self): yield self.line('elif local.__kj__.case(%s):' % self.decl) class IfNode(HierNode): def __init__(self, decl, *body): super(IfNode, self).__init__(body) self.decl = decl def py(self): yield self.line('if %s:' % self.decl) class ElseNode(HierNode): def __init__(self, *body): super(ElseNode, self).__init__(body) def py(self): yield self.line('else:') class TextNode(Node): '''Node that outputs Python literals.''' def __init__(self, text, guard=None): super(TextNode, self).__init__() self.text = text self.guard = guard def py(self): s = 'yield %r' % self.text if self.guard: yield self.line('if %s: %s' % (self.guard, s)) else: yield self.line(s) class TranslatableTextNode(TextNode): def py(self): text = self.text.strip() if text: s = 'yield local.__kj__.gettext(%r)' % self.text else: s = 'yield %r' % self.text if self.guard: yield self.line('if %s: %s' % (self.guard, s)) else: yield self.line(s) class ExprNode(Node): '''Node that contains a Python expression to be evaluated when the template is executed. ''' def __init__(self, text, safe=False): super(ExprNode, self).__init__() self.text = text self.safe = safe def py(self): if self.safe: yield self.line('yield %s' % self.text) else: yield self.line('yield self.__kj__.escape(%s)' % self.text) class AttrNode(HierNode): '''Node that renders HTML/XML attributes.''' class AttrTail(Node): def __init__(self, parent): super(AttrNode.AttrTail, self).__init__() self.p = parent def py(self): gen = self.p.genname x = gen_name() yield self.line("%s = self.__kj__.collect(%s())" % (gen, gen)) yield self.line( 'for %s in self.__kj__.render_attrs({%r:%s}, %r):' % (x, self.p.attr, gen, self.p.mode)) yield self.line(' yield %s' % x) def __init__(self, attr, value, guard=None, mode='xml'): super(AttrNode, self).__init__(value) self.attr = attr self.guard = guard self.mode = mode self.genname = gen_name() def py(self): yield self.line('def %s():' % self.genname) def __iter__(self): if self.guard: new_body = IfNode( self.guard, AttrNode(self.attr, value=self.body, mode=self.mode)) for x in new_body: yield x else: yield self yield IndentNode() if self.body: for part in self.body_iter(): yield part else: yield TextNode('') yield DedentNode() yield self.AttrTail(self) class AttrsNode(Node): def __init__(self, attrs, guard=None, mode='xml'): super(AttrsNode, self).__init__() self.attrs = attrs self.guard = guard self.mode = mode def py(self): x = gen_name() def _body(): yield self.line( 'for %s in self.__kj__.render_attrs(%s, %r):' % ( x, self.attrs, self.mode)) yield self.line(' yield %s' % x) if self.guard: yield self.line('if %s:' % self.guard) for l in _body(): yield l.indent() else: for l in _body(): yield l class PythonNode(Node): def __init__(self, *body): super(PythonNode, self).__init__() self.module_level = False blocks = [] for b in body: assert isinstance(b, TextNode) blocks.append(b.text) text = ''.join(blocks) if text[0] == '%': self.module_level = True text = text[1:] self.lines = list(self._normalize(text)) def py(self): for line in self.lines: yield self.line(line) def _normalize(self, text): if text.startswith('#\n'): text = text[2:] prefix = None for line in text.splitlines(): if prefix is None: rest = line.lstrip() prefix = line[:len(line) - len(rest)] assert line.startswith(prefix) yield line[len(prefix):] def optimize(iter_node): last_node = None for node in iter_node: if (type(node) == TextNode and type(last_node) == TextNode and last_node.guard == node.guard): last_node.text += node.text # Erase this node by not yielding it. continue if last_node is not None: yield last_node last_node = node if last_node is not None: yield last_node @nine class PyLine(object): def __init__(self, filename, lineno, text, indent=0): self._filename = filename self._lineno = lineno self._text = text self._indent = indent def indent(self, sz=4): return PyLine(self._filename, self._lineno, self._text, self._indent + sz) def __str__(self): return (' ' * self._indent) + self._text if self._lineno: return (' ' * self._indent) + self._text + '\t# %s:%d' % ( self._filename, self._lineno) else: return (' ' * self._indent) + self._text def __repr__(self): return '%s:%s %s' % (self._filename, self._lineno, self) Kajiki-0.8.2/kajiki/loader.py0000644000076500000240000001054113103146272016060 0ustar amolstaff00000000000000# -*- coding: utf-8 -*- from __future__ import (absolute_import, division, print_function, unicode_literals) from nine import basestring, itervalues import os import pkg_resources class Loader(object): def __init__(self): self.modules = {} def import_(self, name, *args, **kwargs): '''Returns the template if it is already in the cache, else loads the template, caches it and returns it. ''' mod = self.modules.get(name) if mod: return mod mod = self._load(name, *args, **kwargs) mod.loader = self self.modules[name] = mod return mod def default_alias_for(self, name): return os.path.splitext(os.path.basename(name))[0] @property def load(self): return self.import_ class MockLoader(Loader): def __init__(self, modules): super(MockLoader, self).__init__() self.modules.update(modules) for v in itervalues(self.modules): v.loader = self class FileLoader(Loader): def __init__(self, path, reload=True, force_mode=None, autoescape_text=False, xml_autoblocks=None, **template_options): super(FileLoader, self).__init__() from kajiki import XMLTemplate, TextTemplate if isinstance(path, basestring): self.path = path.split(';') else: self.path = path self._timestamps = {} self._reload = reload self._force_mode = force_mode self._autoescape_text = autoescape_text self._xml_autoblocks = xml_autoblocks self._template_options = template_options self.extension_map = dict( txt=lambda *a, **kw: TextTemplate( autoescape=self._autoescape_text, *a, **kw), xml=XMLTemplate, html=lambda *a, **kw: XMLTemplate(mode='html', *a, **kw), html5=lambda *a, **kw: XMLTemplate(mode='html5', *a, **kw)) def _filename(self, name): for base in self.path: fn = os.path.join(base, name) if os.path.exists(fn): return fn return None def import_(self, name, *args, **kwargs): filename = self._filename(name) if self._reload and name in self.modules: mtime = os.stat(filename).st_mtime if mtime > self._timestamps.get(name, 0): del self.modules[name] return super(FileLoader, self).import_(name, *args, **kwargs) def _load(self, name, encoding='utf-8', *args, **kwargs): '''Text templates are read in text mode and XML templates are read in binary mode. Thus, the ``encoding`` argument is only used for reading text template files. ''' from kajiki import XMLTemplate, TextTemplate options = self._template_options.copy() options.update(kwargs) filename = self._filename(name) if filename is None: raise IOError('Unknown template %r' % name) self._timestamps[name] = os.stat(filename).st_mtime if self._force_mode == 'text': return TextTemplate(filename=filename, autoescape=self._autoescape_text, *args, **options) elif self._force_mode: return XMLTemplate(filename=filename, mode=self._force_mode, autoblocks=self._xml_autoblocks, *args, **options) else: ext = os.path.splitext(filename)[1][1:] return self.extension_map[ext]( source=None, filename=filename, *args, **options) class PackageLoader(FileLoader): def __init__(self, reload=True, force_mode=None): super(PackageLoader, self).__init__(None, reload, force_mode) def _filename(self, name): package, module = name.rsplit('.', 1) found = dict() for fn in pkg_resources.resource_listdir(package, '.'): if fn == name: return pkg_resources.resource_filename(package, fn) root, ext = os.path.splitext(fn) if root == module: found[ext] = fn for ext in ('.xml', '.html', '.html5', '.txt'): if ext in found: return pkg_resources.resource_filename(package, found[ext]) else: raise IOError('Unknown template %r' % name) Kajiki-0.8.2/kajiki/text.py0000644000076500000240000002617713003162475015614 0ustar amolstaff00000000000000# -*- coding: utf-8 -*- '''Text template compiler. Notable in this module are: * TextTemplate - function building a template from text string or filename. * _pattern - the regex used to find the beginnings of tags and expressions. * _Scanner - scans text and generates a stream of tokens. * _Parser - parses a stream of tokens into the internal representation (IR) tree. * _Parser._parse_ - consumes the body of a tag and returns an ir.Node. ''' from __future__ import (absolute_import, division, print_function, unicode_literals) import codecs import re from .ddict import defaultdict from itertools import chain from nine import iteritems, str from shlex import split as shlex_split # Prior to Python 2.7.3, the from sys import version_info # *shlex* module did not support if version_info < (2, 7, 3): # Unicode input. Work around: _shlex_split = shlex_split shlex_split = lambda txt: _shlex_split(txt.encode('utf-8')) del version_info import kajiki from . import ir _pattern = r''' \$(?: (?P\$) | # Escape $$ (?P[_a-z][_a-z0-9.]*) | # $foo.bar {(?P) | # ${.... (?P) ) | ^\s*%(?: (?P[a-z]+) | # %for, %end, etc. (?P) )| ^\s*{%-(?P[a-z]+)| # {%-for, {%-end, etc. {%(?: (?P[a-z]+) | # {%for, {%end, etc. (?P) ) ''' _re_pattern = re.compile(_pattern, re.VERBOSE | re.IGNORECASE | re.MULTILINE) def TextTemplate(source=None, filename=None, autoescape=False, encoding='utf-8'): assert source or filename, "You must either provide a *source* argument " \ "or a *filename* argument to TextTemplate()." if source is None: with codecs.open(filename, encoding=encoding) as f: source = f.read() if filename is None: filename = '' assert isinstance(source, str), \ "*source* must be a unicode string, not a {}".format(type(source)) scanner = _Scanner(filename, source) tree = _Parser(scanner, autoescape).parse() tree.filename = filename return kajiki.template.from_ir(tree) class _Scanner(object): def __init__(self, filename, source): self.filename = filename self.source = source self.lineno = 1 self.pos = 0 def __iter__(self): source = self.source for mo in _re_pattern.finditer(source): start = mo.start() if start > self.pos: yield self.text(source[self.pos:start]) self.pos = start groups = mo.groupdict() if groups['expr_braced'] is not None: self.pos = mo.end() yield self._get_braced_expr() elif groups['expr_named'] is not None: self.pos = mo.end() yield self.expr(groups['expr_named']) elif groups['expr_escaped'] is not None: self.pos = mo.end() yield self.text('$') elif groups['tag_bare'] is not None: self.pos = mo.end() yield self._get_tag_bare(groups['tag_bare']) elif groups['tag_begin'] is not None: self.pos = mo.end() yield self._get_tag(groups['tag_begin']) elif groups['tag_begin_ljust'] is not None: self.pos = mo.end() yield self._get_tag(groups['tag_begin_ljust']) elif groups['tag_bare_invalid'] is not None: continue else: msg = 'Syntax error %s:%s' % (self.filename, self.lineno) for i, line in enumerate(self.source.splitlines()): print('%3d %s' % (i + 1, line)) print(msg) assert False, groups if self.pos != len(source): yield self.text(source[self.pos:]) def _get_pos(self): return self._pos def _set_pos(self, value): assert value >= getattr(self, '_pos', 0) self._pos = value pos = property(_get_pos, _set_pos) def text(self, text): self.lineno += text.count('\n') return _Text(self.filename, self.lineno, text) def expr(self, text): self.lineno += text.count('\n') return _Expr(self.filename, self.lineno, text) def tag(self, tagname, body): tag = _Tag(self.filename, self.lineno, tagname, body) self.lineno += tag.text.count('\n') return tag def _get_tag_bare(self, tagname): end = self.source.find('\n', self.pos) if end == -1: end = len(self.source) body = self.source[self.pos:end] self.lineno += 1 self.pos = end + 1 return self.tag(tagname, body) def _get_tag(self, tagname): end = self.source.find('%}', self.pos) assert end > 0 body = self.source[self.pos:end] self.pos = end + 2 if body.endswith('-'): body = body[:-1] while self.source[self.pos] in ' \t': self.pos += 1 return self.tag(tagname, body) def _get_braced_expr(self): try: compile(self.source[self.pos:], '', 'eval') except SyntaxError as se: end = self.pos + sum([se.offset] + [len(line) + 1 for idx, line in enumerate(self.source[self.pos:].splitlines()) if idx < se.lineno - 1]) text = self.source[self.pos:end - 1] self.pos = end return self.expr(text) class _Parser(object): def __init__(self, tokenizer, autoescape=False): self.tokenizer = tokenizer self.functions = defaultdict(list) self.functions['__main__()'] = [] self.mod_py = [] # module-level python blocks self.iterator = iter(self.tokenizer) self.autoescape = autoescape self._in_def = False self._is_child = False def parse(self): body = list(self._parse_body()) self.functions['__main__()'] = body[:-1] defs = [ir.DefNode(k, *v) for k, v in iteritems(self.functions)] return ir.TemplateNode(self.mod_py, defs) def text(self, token): text = ''.join(_unescape_newlines(token.text)) node = ir.TextNode(text) node.filename = token.filename node.lineno = token.lineno return node def expr(self, token): node = ir.ExprNode(token.text, safe=not self.autoescape) node.filename = token.filename node.lineno = token.lineno return node def push_tok(self, token): self.iterator = chain([token], self.iterator) def _parse_body(self, *stoptags): while True: try: token = next(self.iterator) if isinstance(token, _Text): yield self.text(token) elif isinstance(token, _Expr): yield self.expr(token) elif isinstance(token, _Tag): if token.tagname in stoptags: yield token break parser = getattr(self, '_parse_%s' % token.tagname) yield parser(token) else: msg = 'Parse error: %r unexpected' % token assert False, msg except StopIteration: yield None break def _parse_def(self, token): old_in_def, self._in_def = self._in_def, True body = list(self._parse_body('end')) self._in_def = old_in_def if self._in_def: return ir.InnerDefNode(token.body, *body[:-1]) else: self.functions[token.body.strip()] = body[:-1] return None def _parse_call(self, token): b = token.body.find('(') e = token.body.find(')', b) assert e > b > -1 arglist = token.body[b:e + 1] call = token.body[e + 1:].strip() body = list(self._parse_body('end')) return ir.CallNode( '$caller%s' % arglist, call.replace('%caller', '$caller'), *body[:-1]) def _parse_if(self, token): body = list(self._parse_body('end', 'else')) stoptok = body[-1] if stoptok.tagname == 'else': self.push_tok(stoptok) return ir.IfNode(token.body, *body[:-1]) def _parse_for(self, token): body = list(self._parse_body('end')) return ir.ForNode(token.body, *body[:-1]) def _parse_switch(self, token): body = list(self._parse_body('end')) return ir.SwitchNode(token.body, *body[:-1]) def _parse_case(self, token): body = list(self._parse_body('case', 'else', 'end')) stoptok = body[-1] self.push_tok(stoptok) return ir.CaseNode(token.body, *body[:-1]) def _parse_else(self, token): body = list(self._parse_body('end')) return ir.ElseNode(*body[:-1]) def _parse_extends(self, token): parts = shlex_split(token.body) fn = parts[0] assert len(parts) == 1 self._is_child = True return ir.ExtendNode(fn) def _parse_import(self, token): parts = shlex_split(token.body) fn = parts[0] if len(parts) > 1: assert parts[1] == 'as' return ir.ImportNode(fn, parts[2]) else: return ir.ImportNode(fn) def _parse_include(self, token): parts = shlex_split(token.body) fn = parts[0] assert len(parts) == 1 return ir.IncludeNode(fn) def _parse_py(self, token): body = token.body.strip() if body: body = [ir.TextNode(body), None] else: body = list(self._parse_body('end')) node = ir.PythonNode(*body[:-1]) if node.module_level: self.mod_py.append(node) return None else: return node def _parse_block(self, token): fname = '_kj_block_' + token.body.strip() decl = fname + '()' body = list(self._parse_body('end'))[:-1] self.functions[decl] = body if self._is_child: parent_block = 'parent.' + fname body.insert(0, ir.PythonNode(ir.TextNode('parent_block=%s' % parent_block))) return None else: return ir.ExprNode(decl) class _Token(object): def __init__(self, filename, lineno, text): self.filename = filename self.lineno = lineno self.text = text def __repr__(self): # pragma no cover return '<%s %r>' % ( self.__class__.__name__, self.text) class _Expr(_Token): pass class _Text(_Token): pass class _Tag(_Token): def __init__(self, filename, lineno, tagname, body): self.tagname = tagname self.body = body text = tagname + ' ' + body super(_Tag, self).__init__(filename, lineno, text) def _unescape_newlines(text): i = 0 while i < len(text): if text[i] == '\\': if text[i + 1] != '\n': yield text[i + 1] i += 2 else: yield text[i] i += 1 Kajiki-0.8.2/kajiki/template.py0000644000076500000240000004067513567176225016457 0ustar amolstaff00000000000000# -*- coding: utf-8 -*- from __future__ import (absolute_import, division, print_function, unicode_literals) import re import types from nine import IS_PYTHON2, basestring, str, iteritems from sys import version_info try: from functools import update_wrapper except: def update_wrapper(wrapper, wrapped, assigned=('__module__', '__name__', '__doc__'), updated = ('__dict__',)): for attr in assigned: setattr(wrapper, attr, getattr(wrapped, attr)) for attr in updated: getattr(wrapper, attr).update(getattr(wrapped, attr)) return wrapper import kajiki from .util import flattener, literal from .html_utils import HTML_EMPTY_ATTRS from .ir import generate_python from . import lnotab from kajiki import i18n class _obj(object): def __init__(self, **kw): for k, v in iteritems(kw): setattr(self, k, v) class _Template(object): """Base Class for all compiled Kajiki Templates. All kajiki templates created from a :class:`kajiki.ir.TemplateNode` will be subclasses of this class. As the template body code runs inside ``__main__`` method of this class, the instance of this class is always available as ``self`` inside the template code. This class also makes available some global object inside the template code itself: - ``local`` which is the instance of the template - ``defined`` which checks if the given variable is defined inside the template scope. - ``Markup`` which marks the passed object as markup code and prevents escaping for its content. - ``__kj__`` which is a special object used by generated code providing features like keeping track of py:with stack or or the gettext function used to translate text. """ __methods__ = () loader = None base_globals = None filename = None def __init__(self, context=None): if context is None: context = {} self._context = context base_globals = self.base_globals or {} self.__globals__ = dict(local=self, self=self, defined=lambda x: x in self.__globals__, literal=literal, Markup=literal, gettext=i18n.gettext, __builtins__=__builtins__, __kj__=kajiki) self.__globals__.update(base_globals) for k, v in self.__methods__: v = v.bind_instance(self) setattr(self, k, v) self.__globals__[k] = v self.__kj__ = _obj( extend=self._extend, push_switch=self._push_switch, pop_switch=self._pop_switch, case=self._case, import_=self._import, escape=self._escape, gettext=self._gettext, render_attrs=self._render_attrs, push_with=self._push_with, pop_with=self._pop_with, collect=self._collect, ) self._switch_stack = [] self._with_stack = [] self.__globals__.update(context) self.__globals__['_'] = self.__globals__['gettext'] self.__globals__['value_of'] = self.__globals__.get def __iter__(self): """We convert the chunk to string because it can be of any type -- after all, the template supports expressions such as ${x+y}. Here, ``chunk`` can be the computed expression result. """ for chunk in self.__main__(): yield str(chunk) def render(self): """Render the template to a string.""" return ''.join(self) def _gettext(self, s): """Used by the code generated by the template to translate static text""" return self.__globals__['gettext'](s) def _push_with(self, locals_, vars): """Enter a ``py:with`` block. When a ``py:with`` block is encountered, previous values of the variables assigned inside the ``py:with`` statement are pushed on top of a stack by :class:`kajiki.ir.WithNode` so that when the node is exited the previous values can be recovered. """ self._with_stack.append([locals_.get(k, ()) for k in vars]) def _pop_with(self): """Exists a ``py:with`` block. When a ``py:with`` block is exited the values stack is popped and the head returned to :class:`kajiki.ir.WithNode` so that it can set any previously existing variable to its old value. """ return self._with_stack.pop() def _extend(self, parent): """ Called when a child template extends a parent template the first thing it does is asking the loader of the child template to load the parent template """ if isinstance(parent, basestring): parent = self.loader.import_(parent) p_inst = parent(self._context) p_globals = p_inst.__globals__ # Find overrides for k, v in iteritems(self.__globals__): if k == '__main__': continue if not isinstance(v, TplFunc): continue p_globals[k] = v # Find inherited funcs for k, v in iteritems(p_inst.__globals__): if k == '__main__': continue if not isinstance(v, TplFunc): continue if k not in self.__globals__: self.__globals__[k] = v if not hasattr(self, k): def _(k=k): '''Capture the 'k' variable in a closure''' def trampoline(*a, **kw): global parent return getattr(parent, k)(*a, **kw) return trampoline setattr(self, k, TplFunc(_()).bind_instance(self)) p_globals['child'] = self p_globals['local'] = p_inst p_globals['self'] = self.__globals__['self'] self.__globals__['parent'] = p_inst self.__globals__['local'] = self return p_inst def _push_switch(self, expr): """Enter a ``py:switch`` block. Pushes provided value on the stack used to check ``py:case`` statements against. Calling :meth:`._pop_switch` will exit the switch block. """ self._switch_stack.append(expr) def _pop_switch(self): """Exit current ``py:switch`` block. Pops current value from the stack used to check ``py:case`` statements against. """ self._switch_stack.pop() def _case(self, obj): """Check against current ``py:switch`` value.""" return obj == self._switch_stack[-1] def _import(self, name, alias, gbls): # Load template as a fragment to avoid extra in included output. # Due to loader cache, this has the side effect that if the same # template is both included and used as a standalone page # it might act as a fragment or not depending on the order it was loaded. # But usually templates meant for inclusion are not standalone pages. # Also there is no way to set a template as a fragment once loaded. # So we can only do it through the loader. tpl_cls = self.loader.import_(name, is_fragment=True) if alias is None: alias = self.loader.default_alias_for(name) r = gbls[alias] = tpl_cls(gbls) return r def _escape(self, value): """Returns the given HTML with ampersands, carets and quotes encoded.""" if value is None or isinstance(value, flattener): return value if hasattr(value, '__html__'): return value.__html__() uval = str(value) if self._re_escape.search(uval): # Scan the string before working. # stdlib escape() is inconsistent between Python 2 and Python 3. # In 3, html.escape() translates the single quote to ''' # In 2.6 and 2.7, cgi.escape() does not touch the single quote. # Preserve our tests and Kajiki behaviour across Python versions: return uval.replace('&', '&').replace('<', '<') \ .replace('>', '>').replace('"', '"') # .replace("'", ''')) # Above we do NOT escape the single quote; we don't need it because # all HTML attributes are double-quoted in our output. else: return uval _re_escape = re.compile(r'&|<|>|"') def _render_attrs(self, attrs, mode): """Render tag attributes in key="value" format. A :class:`kajiki.ir.AttrsNode` will generate code that in fact leads to this function to generate the html for tag attributes. """ if hasattr(attrs, 'items'): attrs = attrs.items() if attrs is not None: for k, v in sorted(attrs): if k in HTML_EMPTY_ATTRS and v in (True, False): v = k if v else None if v is None: continue if mode.startswith('html') and k in HTML_EMPTY_ATTRS: yield ' ' + k.lower() else: yield ' %s="%s"' % (k, self._escape(v)) def _collect(self, it): result = [] for part in it: if part is None: continue if isinstance(part, flattener): result.append(str(part.accumulate_str())) else: result.append(str(part)) if result: return ''.join(result) else: return None @classmethod def annotate_lnotab(cls, py_to_tpl): for name, meth in cls.__methods__: meth.annotate_lnotab(cls.filename, py_to_tpl, dict(py_to_tpl)) def defined(self, name): """Check if a variable was provided to the template or not""" return name in self._context def Template(ns): """Creates a new :class:`._Template` subclass from an entity with ``exposed`` functions. Kajiki uses classes as containers of the exposed functions for convenience, but any object that can have the functions as attributes works. To be a valid template the original entity must provide at least a ``__main__`` function:: class Example: @kajiki.expose def __main__(): yield 'Hi' t = kajiki.Template(Example) output = t().render() print(output) 'Hi' """ dct = {} methods = dct['__methods__'] = [] for name in dir(ns): value = getattr(ns, name) if getattr(value, 'exposed', False): methods.append((name, TplFunc(getattr(value, '__func__', value)))) return type(ns.__name__, (_Template,), dct) def from_ir(ir_node, base_globals=None): """Creates a template class from Intermediate Representation TemplateNode. This actually creates the class defined by the TemplateNode by executing its code and returns a subclass of it. The returned class is a subclass of :class:`kajiki.template._Template`. It is possible to use `base_globals` to set context values or replace default ones """ if base_globals is None: base_globals = dict() py_lines = list(generate_python(ir_node)) py_text = '\n'.join(map(str, py_lines)) py_linenos = [] last_lineno = 0 for i, l in enumerate(py_lines): lno = max(last_lineno, l._lineno or 0) py_linenos.append((i + 1, lno)) last_lineno = lno dct = dict(kajiki=kajiki) try: exec(py_text, dct) except (SyntaxError, IndentationError) as e: # pragma no cover raise KajikiSyntaxError(e.msg, py_text, e.filename, e.lineno, e.offset) tpl = dct['template'] tpl.base_globals = base_globals.copy() tpl.base_globals.update(dct) tpl.py_text = py_text tpl.filename = ir_node.filename tpl.annotate_lnotab(py_linenos) return tpl class TplFunc(object): """A template function attached to a _Template. By default template functions (ie: __main__) depends on variables like ``self``, ``local`` and so on which are provided by :class:`._Template`. This is used by :meth:`.Template` to create a new ``_Template`` with the attached functions. """ def __init__(self, func, inst=None): self._func = func self._inst = inst self._bound_func = None def bind_instance(self, inst): return TplFunc(self._func, inst) def __repr__(self): # pragma no cover if self._inst: return '' % ( self._func.__name__, self._inst) else: return '' % (self._func.__name__) def __call__(self, *args, **kwargs): if self._bound_func is None: self._bound_func = self._bind_globals( self._inst.__globals__) return self._bound_func(*args, **kwargs) def _bind_globals(self, globals): '''Return a function which has the globals dict set to 'globals' and which flattens the result of self._func'. ''' func = types.FunctionType( self._func.__code__, globals, self._func.__name__, self._func.__defaults__, self._func.__closure__ ) return update_wrapper( lambda *a, **kw: flattener(func(*a, **kw)), func) def annotate_lnotab(self, filename, py_to_tpl, py_to_tpl_dct): if not py_to_tpl: return code = self._func.__code__ new_lnotab_numbers = [] for bc_off, py_lno in lnotab.lnotab_numbers( code.co_lnotab, code.co_firstlineno): tpl_lno = py_to_tpl_dct.get(py_lno, None) if tpl_lno is None: print('ERROR LOOKING UP LINE #%d' % py_lno) continue new_lnotab_numbers.append((bc_off, tpl_lno)) if not new_lnotab_numbers: return new_firstlineno = py_to_tpl_dct.get(code.co_firstlineno, 0) new_lnotab = lnotab.lnotab_string(new_lnotab_numbers, new_firstlineno) new_code = patch_code_file_lines( code, filename, new_firstlineno, new_lnotab) self._func.__code__ = new_code return if IS_PYTHON2: def patch_code_file_lines(code, filename, firstlineno, lnotab): return types.CodeType(code.co_argcount, code.co_nlocals, code.co_stacksize, code.co_flags, code.co_code, code.co_consts, code.co_names, code.co_varnames, filename.encode('utf-8'), code.co_name, firstlineno, lnotab, code.co_freevars, code.co_cellvars) else: def patch_code_file_lines(code, filename, firstlineno, lnotab): code_args = [code.co_argcount] if version_info >= (3, 8): code_args.append(code.co_posonlyargcount) code_args.extend([ code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize, code.co_flags, code.co_code, code.co_consts, code.co_names, code.co_varnames, filename, code.co_name, firstlineno, lnotab, code.co_freevars, code.co_cellvars, ]) return types.CodeType(*code_args) class KajikiSyntaxError(Exception): def __init__(self, msg, source, filename, linen, coln): super(KajikiSyntaxError, self).__init__( '[%s:%s] %s\n%s' % (filename, linen, msg, self._get_source_snippet(source, linen)) ) self.filename = filename self.linenum = linen self.colnum = coln def _get_source_snippet(self, source, linen): SURROUNDING = 2 linen -= 1 parts = [] for i in range(SURROUNDING, 0, -1): parts.append('\t %s\n' % self._get_source_line(source, linen - i)) parts.append('\t --> %s\n' % self._get_source_line(source, linen)) for i in range(1, SURROUNDING+1): parts.append('\t %s\n' % self._get_source_line(source, linen + i)) return ''.join(parts) def _get_source_line(self, source, linen): if linen < 0: return '' try: return source.splitlines()[linen] except: return '' Kajiki-0.8.2/kajiki/doctype.py0000644000076500000240000001372613005371560016272 0ustar amolstaff00000000000000# -*- coding: utf-8 -*- from __future__ import (absolute_import, division, print_function, unicode_literals) import re from nine import str, nine, itervalues from nine.decorator import reify @nine class DocumentTypeDeclaration(object): """Represents a http://en.wikipedia.org/wiki/Document_Type_Declaration This is used to lookup DTDs details by its string, DTDs can be registered in :attr:`.by_uri` and can then be looked up using :meth:`.matching` method:: >>> from kajiki.doctype import DocumentTypeDeclaration >>> dtd = DocumentTypeDeclaration("html4transitional", ... "-//W3C//DTD HTML 4.01 Transitional//EN", ... "http://www.w3.org/TR/html4/loose.dtd", ... rendering_mode='html') >>> print dtd.uri http://www.w3.org/TR/html4/loose.dtd >>> DocumentTypeDeclaration.by_uri["http://www.w3.org/TR/html4/loose.dtd"] = dtd >>> match = DocumentTypeDeclaration.matching( ... '' ... ) >>> print match.name 'html4transitional' DocumentTypeDeclaration is used by :class:`kajiki.xml_template._Compiler` to detect the document doctype and tune generated template (for example by deciding if tags closed inline are allowed or not). """ def __init__(self, name, fpi='', uri='', rendering_mode='xml', root_element='html', kind='PUBLIC'): '''*fpi* is the Formal Public Identifier.''' self.name = name self.fpi = fpi self.uri = uri self.rendering_mode = rendering_mode self.root_element = root_element assert kind in ('PUBLIC', 'SYSTEM', ''), \ '*kind* can be either "PUBLIC", "SYSTEM", or empty.' self.kind = kind self._cached_str = None def __str__(self): if not self._cached_str: alist = ['' return self._cached_str @reify def regex(self): return re.compile(str(self).replace(' ', r'\s+').replace('.', r'\.') .replace('[', r'\[').replace(']', r'\]'), flags=re.IGNORECASE) by_uri = dict() # We store the public DTDs here. @classmethod def matching(cls, dtd_string): '''Looks up the known DTDs and returns the instance that matches the provided dtd_string. ''' for dtd in itervalues(cls.by_uri): if dtd.regex.match(dtd_string): return dtd else: return None REGEX = re.compile(r']+>') # This matches any DTD. # Build the public DTDs dictionary for dtd in ( DocumentTypeDeclaration('html5', kind='', rendering_mode='html5'), DocumentTypeDeclaration('xhtml5', kind='', uri=None), DocumentTypeDeclaration('xhtml1transitional', "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"), DocumentTypeDeclaration('xhtml1strict', "-//W3C//DTD XHTML 1.0 Strict//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"), DocumentTypeDeclaration('xhtml1rdfa', "-//W3C//DTD XHTML+RDFa 1.0//EN", "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"), DocumentTypeDeclaration('xhtml11', "-//W3C//DTD XHTML 1.1//EN", "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"), DocumentTypeDeclaration('xhtml1frameset', "-//W3C//DTD XHTML 1.0 Frameset//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"), DocumentTypeDeclaration('xhtmlbasic11', "-//W3C//DTD XHTML Basic 1.1//EN", "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd"), DocumentTypeDeclaration('xhtmlmobile12', "-//WAPFORUM//DTD XHTML Mobile 1.2//EN", "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd"), DocumentTypeDeclaration('html4transitional', "-//W3C//DTD HTML 4.01 Transitional//EN", "http://www.w3.org/TR/html4/loose.dtd", rendering_mode='html'), DocumentTypeDeclaration('html4strict', "-//W3C//DTD HTML 4.01//EN", "http://www.w3.org/TR/html4/strict.dtd", rendering_mode='html'), DocumentTypeDeclaration('html4frameset', "-//W3C//DTD HTML 4.01 Frameset//EN", "http://www.w3.org/TR/html4/frameset.dtd", rendering_mode='html'), # html3='', # html2='', # xml='', ): DocumentTypeDeclaration.by_uri[dtd.uri] = dtd def extract_dtd(markup): """Lookup the DTD in the provided markup code. Tries to find any DTD in the string *markup* and returns a tuple (dtd_string, position, markup_without_the_DTD). Note the first of these values might be an empty string:: >>> markup = ''' ... ... ... ... ... ... ... ... ... ... ''' >>> import kajiki.doctype >>> dtd, dtd_pos, html = kajiki.doctype.extract_dtd(markup) >>> print dtd """ match = DocumentTypeDeclaration.REGEX.search(markup) if not match: return '', 0, markup found = match.group() return found, match.start(), markup.replace(found, '', 1) Kajiki-0.8.2/kajiki/i18n.py0000644000076500000240000000335013265153311015372 0ustar amolstaff00000000000000# -*- coding: utf-8 -*- from __future__ import (absolute_import, division, print_function, unicode_literals) from io import BytesIO from tokenize import TokenError from .ir import TranslatableTextNode, ExprNode def gettext(s): return s def extract(fileobj, keywords, comment_tags, options): """Babel entry point that extracts translation strings from XML templates.""" from .template import KajikiSyntaxError from .xml_template import _Parser, _Compiler, _DomTransformer try: from babel.messages.extract import extract_python extract_expr = options.get('extract_python', False) except ImportError: extract_python = None extract_expr = False source = fileobj.read() if isinstance(source, bytes): source = source.decode('utf-8') doc = _Parser(filename='', source=source).parse() doc = _DomTransformer(doc, strip_text=options.get('strip_text', False)).transform() compiler = _Compiler(filename='', doc=doc, mode=options.get('mode', 'xml'), is_fragment=options.get('is_fragment', False)) ir = compiler.compile() for node in ir: if isinstance(node, TranslatableTextNode): if node.text.strip(): yield (node.lineno, '_', node.text, []) elif extract_expr and isinstance(node, ExprNode): try: for e in extract_python(BytesIO(node.text.encode('utf-8')), keywords, comment_tags, options): yield (node.lineno, e[1], e[2], e[3]) except (TokenError, SyntaxError) as e: raise KajikiSyntaxError(e, source, '', node.lineno, 0) Kajiki-0.8.2/kajiki/entities.py0000644000076500000240000016210712554436352016456 0ustar amolstaff00000000000000# -*- coding: utf-8 -*- '''python3.3/html/entities.py, plus HTMLParser.decode(), for Python 2 compat''' from __future__ import (absolute_import, division, print_function, unicode_literals) import re def unescape(s): '''Decode HTML entities.''' if '&' not in s: return s return UNESCAPE_RE.sub(_replace_entities, s) try: UNESCAPE_RE = re.compile(r"&(#?[xX]?(?:[0-9a-fA-F]+;|\w{1,32};?))", flags=re.ASCII) except AttributeError: UNESCAPE_RE = re.compile(br"&(#?[xX]?(?:[0-9a-fA-F]+;|\w{1,32};?))") def _replace_entities(s): s = s.groups()[0] try: if s[0] == "#": s = s[1:] if s[0] in ['x', 'X']: c = int(s[1:].rstrip(';'), 16) else: c = int(s.rstrip(';')) return chr(c) except ValueError: return '&#' + s else: if s in html5: return html5[s] elif s.endswith(';'): return '&' + s for x in range(2, len(s)): if s[:x] in html5: return html5[s[:x]] + s[x:] else: return '&' + s # Maps HTML5 named character references to the equivalent Unicode character(s) html5 = { 'Aacute': '\xc1', 'aacute': '\xe1', 'Aacute;': '\xc1', 'aacute;': '\xe1', 'Abreve;': '\u0102', 'abreve;': '\u0103', 'ac;': '\u223e', 'acd;': '\u223f', 'acE;': '\u223e\u0333', 'Acirc': '\xc2', 'acirc': '\xe2', 'Acirc;': '\xc2', 'acirc;': '\xe2', 'acute': '\xb4', 'acute;': '\xb4', 'Acy;': '\u0410', 'acy;': '\u0430', 'AElig': '\xc6', 'aelig': '\xe6', 'AElig;': '\xc6', 'aelig;': '\xe6', 'af;': '\u2061', 'Afr;': '\U0001d504', 'afr;': '\U0001d51e', 'Agrave': '\xc0', 'agrave': '\xe0', 'Agrave;': '\xc0', 'agrave;': '\xe0', 'alefsym;': '\u2135', 'aleph;': '\u2135', 'Alpha;': '\u0391', 'alpha;': '\u03b1', 'Amacr;': '\u0100', 'amacr;': '\u0101', 'amalg;': '\u2a3f', 'AMP': '&', 'amp': '&', 'AMP;': '&', 'amp;': '&', 'And;': '\u2a53', 'and;': '\u2227', 'andand;': '\u2a55', 'andd;': '\u2a5c', 'andslope;': '\u2a58', 'andv;': '\u2a5a', 'ang;': '\u2220', 'ange;': '\u29a4', 'angle;': '\u2220', 'angmsd;': '\u2221', 'angmsdaa;': '\u29a8', 'angmsdab;': '\u29a9', 'angmsdac;': '\u29aa', 'angmsdad;': '\u29ab', 'angmsdae;': '\u29ac', 'angmsdaf;': '\u29ad', 'angmsdag;': '\u29ae', 'angmsdah;': '\u29af', 'angrt;': '\u221f', 'angrtvb;': '\u22be', 'angrtvbd;': '\u299d', 'angsph;': '\u2222', 'angst;': '\xc5', 'angzarr;': '\u237c', 'Aogon;': '\u0104', 'aogon;': '\u0105', 'Aopf;': '\U0001d538', 'aopf;': '\U0001d552', 'ap;': '\u2248', 'apacir;': '\u2a6f', 'apE;': '\u2a70', 'ape;': '\u224a', 'apid;': '\u224b', 'apos;': "'", 'ApplyFunction;': '\u2061', 'approx;': '\u2248', 'approxeq;': '\u224a', 'Aring': '\xc5', 'aring': '\xe5', 'Aring;': '\xc5', 'aring;': '\xe5', 'Ascr;': '\U0001d49c', 'ascr;': '\U0001d4b6', 'Assign;': '\u2254', 'ast;': '*', 'asymp;': '\u2248', 'asympeq;': '\u224d', 'Atilde': '\xc3', 'atilde': '\xe3', 'Atilde;': '\xc3', 'atilde;': '\xe3', 'Auml': '\xc4', 'auml': '\xe4', 'Auml;': '\xc4', 'auml;': '\xe4', 'awconint;': '\u2233', 'awint;': '\u2a11', 'backcong;': '\u224c', 'backepsilon;': '\u03f6', 'backprime;': '\u2035', 'backsim;': '\u223d', 'backsimeq;': '\u22cd', 'Backslash;': '\u2216', 'Barv;': '\u2ae7', 'barvee;': '\u22bd', 'Barwed;': '\u2306', 'barwed;': '\u2305', 'barwedge;': '\u2305', 'bbrk;': '\u23b5', 'bbrktbrk;': '\u23b6', 'bcong;': '\u224c', 'Bcy;': '\u0411', 'bcy;': '\u0431', 'bdquo;': '\u201e', 'becaus;': '\u2235', 'Because;': '\u2235', 'because;': '\u2235', 'bemptyv;': '\u29b0', 'bepsi;': '\u03f6', 'bernou;': '\u212c', 'Bernoullis;': '\u212c', 'Beta;': '\u0392', 'beta;': '\u03b2', 'beth;': '\u2136', 'between;': '\u226c', 'Bfr;': '\U0001d505', 'bfr;': '\U0001d51f', 'bigcap;': '\u22c2', 'bigcirc;': '\u25ef', 'bigcup;': '\u22c3', 'bigodot;': '\u2a00', 'bigoplus;': '\u2a01', 'bigotimes;': '\u2a02', 'bigsqcup;': '\u2a06', 'bigstar;': '\u2605', 'bigtriangledown;': '\u25bd', 'bigtriangleup;': '\u25b3', 'biguplus;': '\u2a04', 'bigvee;': '\u22c1', 'bigwedge;': '\u22c0', 'bkarow;': '\u290d', 'blacklozenge;': '\u29eb', 'blacksquare;': '\u25aa', 'blacktriangle;': '\u25b4', 'blacktriangledown;': '\u25be', 'blacktriangleleft;': '\u25c2', 'blacktriangleright;': '\u25b8', 'blank;': '\u2423', 'blk12;': '\u2592', 'blk14;': '\u2591', 'blk34;': '\u2593', 'block;': '\u2588', 'bne;': '=\u20e5', 'bnequiv;': '\u2261\u20e5', 'bNot;': '\u2aed', 'bnot;': '\u2310', 'Bopf;': '\U0001d539', 'bopf;': '\U0001d553', 'bot;': '\u22a5', 'bottom;': '\u22a5', 'bowtie;': '\u22c8', 'boxbox;': '\u29c9', 'boxDL;': '\u2557', 'boxDl;': '\u2556', 'boxdL;': '\u2555', 'boxdl;': '\u2510', 'boxDR;': '\u2554', 'boxDr;': '\u2553', 'boxdR;': '\u2552', 'boxdr;': '\u250c', 'boxH;': '\u2550', 'boxh;': '\u2500', 'boxHD;': '\u2566', 'boxHd;': '\u2564', 'boxhD;': '\u2565', 'boxhd;': '\u252c', 'boxHU;': '\u2569', 'boxHu;': '\u2567', 'boxhU;': '\u2568', 'boxhu;': '\u2534', 'boxminus;': '\u229f', 'boxplus;': '\u229e', 'boxtimes;': '\u22a0', 'boxUL;': '\u255d', 'boxUl;': '\u255c', 'boxuL;': '\u255b', 'boxul;': '\u2518', 'boxUR;': '\u255a', 'boxUr;': '\u2559', 'boxuR;': '\u2558', 'boxur;': '\u2514', 'boxV;': '\u2551', 'boxv;': '\u2502', 'boxVH;': '\u256c', 'boxVh;': '\u256b', 'boxvH;': '\u256a', 'boxvh;': '\u253c', 'boxVL;': '\u2563', 'boxVl;': '\u2562', 'boxvL;': '\u2561', 'boxvl;': '\u2524', 'boxVR;': '\u2560', 'boxVr;': '\u255f', 'boxvR;': '\u255e', 'boxvr;': '\u251c', 'bprime;': '\u2035', 'Breve;': '\u02d8', 'breve;': '\u02d8', 'brvbar': '\xa6', 'brvbar;': '\xa6', 'Bscr;': '\u212c', 'bscr;': '\U0001d4b7', 'bsemi;': '\u204f', 'bsim;': '\u223d', 'bsime;': '\u22cd', 'bsol;': '\\', 'bsolb;': '\u29c5', 'bsolhsub;': '\u27c8', 'bull;': '\u2022', 'bullet;': '\u2022', 'bump;': '\u224e', 'bumpE;': '\u2aae', 'bumpe;': '\u224f', 'Bumpeq;': '\u224e', 'bumpeq;': '\u224f', 'Cacute;': '\u0106', 'cacute;': '\u0107', 'Cap;': '\u22d2', 'cap;': '\u2229', 'capand;': '\u2a44', 'capbrcup;': '\u2a49', 'capcap;': '\u2a4b', 'capcup;': '\u2a47', 'capdot;': '\u2a40', 'CapitalDifferentialD;': '\u2145', 'caps;': '\u2229\ufe00', 'caret;': '\u2041', 'caron;': '\u02c7', 'Cayleys;': '\u212d', 'ccaps;': '\u2a4d', 'Ccaron;': '\u010c', 'ccaron;': '\u010d', 'Ccedil': '\xc7', 'ccedil': '\xe7', 'Ccedil;': '\xc7', 'ccedil;': '\xe7', 'Ccirc;': '\u0108', 'ccirc;': '\u0109', 'Cconint;': '\u2230', 'ccups;': '\u2a4c', 'ccupssm;': '\u2a50', 'Cdot;': '\u010a', 'cdot;': '\u010b', 'cedil': '\xb8', 'cedil;': '\xb8', 'Cedilla;': '\xb8', 'cemptyv;': '\u29b2', 'cent': '\xa2', 'cent;': '\xa2', 'CenterDot;': '\xb7', 'centerdot;': '\xb7', 'Cfr;': '\u212d', 'cfr;': '\U0001d520', 'CHcy;': '\u0427', 'chcy;': '\u0447', 'check;': '\u2713', 'checkmark;': '\u2713', 'Chi;': '\u03a7', 'chi;': '\u03c7', 'cir;': '\u25cb', 'circ;': '\u02c6', 'circeq;': '\u2257', 'circlearrowleft;': '\u21ba', 'circlearrowright;': '\u21bb', 'circledast;': '\u229b', 'circledcirc;': '\u229a', 'circleddash;': '\u229d', 'CircleDot;': '\u2299', 'circledR;': '\xae', 'circledS;': '\u24c8', 'CircleMinus;': '\u2296', 'CirclePlus;': '\u2295', 'CircleTimes;': '\u2297', 'cirE;': '\u29c3', 'cire;': '\u2257', 'cirfnint;': '\u2a10', 'cirmid;': '\u2aef', 'cirscir;': '\u29c2', 'ClockwiseContourIntegral;': '\u2232', 'CloseCurlyDoubleQuote;': '\u201d', 'CloseCurlyQuote;': '\u2019', 'clubs;': '\u2663', 'clubsuit;': '\u2663', 'Colon;': '\u2237', 'colon;': ':', 'Colone;': '\u2a74', 'colone;': '\u2254', 'coloneq;': '\u2254', 'comma;': ',', 'commat;': '@', 'comp;': '\u2201', 'compfn;': '\u2218', 'complement;': '\u2201', 'complexes;': '\u2102', 'cong;': '\u2245', 'congdot;': '\u2a6d', 'Congruent;': '\u2261', 'Conint;': '\u222f', 'conint;': '\u222e', 'ContourIntegral;': '\u222e', 'Copf;': '\u2102', 'copf;': '\U0001d554', 'coprod;': '\u2210', 'Coproduct;': '\u2210', 'COPY': '\xa9', 'copy': '\xa9', 'COPY;': '\xa9', 'copy;': '\xa9', 'copysr;': '\u2117', 'CounterClockwiseContourIntegral;': '\u2233', 'crarr;': '\u21b5', 'Cross;': '\u2a2f', 'cross;': '\u2717', 'Cscr;': '\U0001d49e', 'cscr;': '\U0001d4b8', 'csub;': '\u2acf', 'csube;': '\u2ad1', 'csup;': '\u2ad0', 'csupe;': '\u2ad2', 'ctdot;': '\u22ef', 'cudarrl;': '\u2938', 'cudarrr;': '\u2935', 'cuepr;': '\u22de', 'cuesc;': '\u22df', 'cularr;': '\u21b6', 'cularrp;': '\u293d', 'Cup;': '\u22d3', 'cup;': '\u222a', 'cupbrcap;': '\u2a48', 'CupCap;': '\u224d', 'cupcap;': '\u2a46', 'cupcup;': '\u2a4a', 'cupdot;': '\u228d', 'cupor;': '\u2a45', 'cups;': '\u222a\ufe00', 'curarr;': '\u21b7', 'curarrm;': '\u293c', 'curlyeqprec;': '\u22de', 'curlyeqsucc;': '\u22df', 'curlyvee;': '\u22ce', 'curlywedge;': '\u22cf', 'curren': '\xa4', 'curren;': '\xa4', 'curvearrowleft;': '\u21b6', 'curvearrowright;': '\u21b7', 'cuvee;': '\u22ce', 'cuwed;': '\u22cf', 'cwconint;': '\u2232', 'cwint;': '\u2231', 'cylcty;': '\u232d', 'Dagger;': '\u2021', 'dagger;': '\u2020', 'daleth;': '\u2138', 'Darr;': '\u21a1', 'dArr;': '\u21d3', 'darr;': '\u2193', 'dash;': '\u2010', 'Dashv;': '\u2ae4', 'dashv;': '\u22a3', 'dbkarow;': '\u290f', 'dblac;': '\u02dd', 'Dcaron;': '\u010e', 'dcaron;': '\u010f', 'Dcy;': '\u0414', 'dcy;': '\u0434', 'DD;': '\u2145', 'dd;': '\u2146', 'ddagger;': '\u2021', 'ddarr;': '\u21ca', 'DDotrahd;': '\u2911', 'ddotseq;': '\u2a77', 'deg': '\xb0', 'deg;': '\xb0', 'Del;': '\u2207', 'Delta;': '\u0394', 'delta;': '\u03b4', 'demptyv;': '\u29b1', 'dfisht;': '\u297f', 'Dfr;': '\U0001d507', 'dfr;': '\U0001d521', 'dHar;': '\u2965', 'dharl;': '\u21c3', 'dharr;': '\u21c2', 'DiacriticalAcute;': '\xb4', 'DiacriticalDot;': '\u02d9', 'DiacriticalDoubleAcute;': '\u02dd', 'DiacriticalGrave;': '`', 'DiacriticalTilde;': '\u02dc', 'diam;': '\u22c4', 'Diamond;': '\u22c4', 'diamond;': '\u22c4', 'diamondsuit;': '\u2666', 'diams;': '\u2666', 'die;': '\xa8', 'DifferentialD;': '\u2146', 'digamma;': '\u03dd', 'disin;': '\u22f2', 'div;': '\xf7', 'divide': '\xf7', 'divide;': '\xf7', 'divideontimes;': '\u22c7', 'divonx;': '\u22c7', 'DJcy;': '\u0402', 'djcy;': '\u0452', 'dlcorn;': '\u231e', 'dlcrop;': '\u230d', 'dollar;': '$', 'Dopf;': '\U0001d53b', 'dopf;': '\U0001d555', 'Dot;': '\xa8', 'dot;': '\u02d9', 'DotDot;': '\u20dc', 'doteq;': '\u2250', 'doteqdot;': '\u2251', 'DotEqual;': '\u2250', 'dotminus;': '\u2238', 'dotplus;': '\u2214', 'dotsquare;': '\u22a1', 'doublebarwedge;': '\u2306', 'DoubleContourIntegral;': '\u222f', 'DoubleDot;': '\xa8', 'DoubleDownArrow;': '\u21d3', 'DoubleLeftArrow;': '\u21d0', 'DoubleLeftRightArrow;': '\u21d4', 'DoubleLeftTee;': '\u2ae4', 'DoubleLongLeftArrow;': '\u27f8', 'DoubleLongLeftRightArrow;': '\u27fa', 'DoubleLongRightArrow;': '\u27f9', 'DoubleRightArrow;': '\u21d2', 'DoubleRightTee;': '\u22a8', 'DoubleUpArrow;': '\u21d1', 'DoubleUpDownArrow;': '\u21d5', 'DoubleVerticalBar;': '\u2225', 'DownArrow;': '\u2193', 'Downarrow;': '\u21d3', 'downarrow;': '\u2193', 'DownArrowBar;': '\u2913', 'DownArrowUpArrow;': '\u21f5', 'DownBreve;': '\u0311', 'downdownarrows;': '\u21ca', 'downharpoonleft;': '\u21c3', 'downharpoonright;': '\u21c2', 'DownLeftRightVector;': '\u2950', 'DownLeftTeeVector;': '\u295e', 'DownLeftVector;': '\u21bd', 'DownLeftVectorBar;': '\u2956', 'DownRightTeeVector;': '\u295f', 'DownRightVector;': '\u21c1', 'DownRightVectorBar;': '\u2957', 'DownTee;': '\u22a4', 'DownTeeArrow;': '\u21a7', 'drbkarow;': '\u2910', 'drcorn;': '\u231f', 'drcrop;': '\u230c', 'Dscr;': '\U0001d49f', 'dscr;': '\U0001d4b9', 'DScy;': '\u0405', 'dscy;': '\u0455', 'dsol;': '\u29f6', 'Dstrok;': '\u0110', 'dstrok;': '\u0111', 'dtdot;': '\u22f1', 'dtri;': '\u25bf', 'dtrif;': '\u25be', 'duarr;': '\u21f5', 'duhar;': '\u296f', 'dwangle;': '\u29a6', 'DZcy;': '\u040f', 'dzcy;': '\u045f', 'dzigrarr;': '\u27ff', 'Eacute': '\xc9', 'eacute': '\xe9', 'Eacute;': '\xc9', 'eacute;': '\xe9', 'easter;': '\u2a6e', 'Ecaron;': '\u011a', 'ecaron;': '\u011b', 'ecir;': '\u2256', 'Ecirc': '\xca', 'ecirc': '\xea', 'Ecirc;': '\xca', 'ecirc;': '\xea', 'ecolon;': '\u2255', 'Ecy;': '\u042d', 'ecy;': '\u044d', 'eDDot;': '\u2a77', 'Edot;': '\u0116', 'eDot;': '\u2251', 'edot;': '\u0117', 'ee;': '\u2147', 'efDot;': '\u2252', 'Efr;': '\U0001d508', 'efr;': '\U0001d522', 'eg;': '\u2a9a', 'Egrave': '\xc8', 'egrave': '\xe8', 'Egrave;': '\xc8', 'egrave;': '\xe8', 'egs;': '\u2a96', 'egsdot;': '\u2a98', 'el;': '\u2a99', 'Element;': '\u2208', 'elinters;': '\u23e7', 'ell;': '\u2113', 'els;': '\u2a95', 'elsdot;': '\u2a97', 'Emacr;': '\u0112', 'emacr;': '\u0113', 'empty;': '\u2205', 'emptyset;': '\u2205', 'EmptySmallSquare;': '\u25fb', 'emptyv;': '\u2205', 'EmptyVerySmallSquare;': '\u25ab', 'emsp13;': '\u2004', 'emsp14;': '\u2005', 'emsp;': '\u2003', 'ENG;': '\u014a', 'eng;': '\u014b', 'ensp;': '\u2002', 'Eogon;': '\u0118', 'eogon;': '\u0119', 'Eopf;': '\U0001d53c', 'eopf;': '\U0001d556', 'epar;': '\u22d5', 'eparsl;': '\u29e3', 'eplus;': '\u2a71', 'epsi;': '\u03b5', 'Epsilon;': '\u0395', 'epsilon;': '\u03b5', 'epsiv;': '\u03f5', 'eqcirc;': '\u2256', 'eqcolon;': '\u2255', 'eqsim;': '\u2242', 'eqslantgtr;': '\u2a96', 'eqslantless;': '\u2a95', 'Equal;': '\u2a75', 'equals;': '=', 'EqualTilde;': '\u2242', 'equest;': '\u225f', 'Equilibrium;': '\u21cc', 'equiv;': '\u2261', 'equivDD;': '\u2a78', 'eqvparsl;': '\u29e5', 'erarr;': '\u2971', 'erDot;': '\u2253', 'Escr;': '\u2130', 'escr;': '\u212f', 'esdot;': '\u2250', 'Esim;': '\u2a73', 'esim;': '\u2242', 'Eta;': '\u0397', 'eta;': '\u03b7', 'ETH': '\xd0', 'eth': '\xf0', 'ETH;': '\xd0', 'eth;': '\xf0', 'Euml': '\xcb', 'euml': '\xeb', 'Euml;': '\xcb', 'euml;': '\xeb', 'euro;': '\u20ac', 'excl;': '!', 'exist;': '\u2203', 'Exists;': '\u2203', 'expectation;': '\u2130', 'ExponentialE;': '\u2147', 'exponentiale;': '\u2147', 'fallingdotseq;': '\u2252', 'Fcy;': '\u0424', 'fcy;': '\u0444', 'female;': '\u2640', 'ffilig;': '\ufb03', 'fflig;': '\ufb00', 'ffllig;': '\ufb04', 'Ffr;': '\U0001d509', 'ffr;': '\U0001d523', 'filig;': '\ufb01', 'FilledSmallSquare;': '\u25fc', 'FilledVerySmallSquare;': '\u25aa', 'fjlig;': 'fj', 'flat;': '\u266d', 'fllig;': '\ufb02', 'fltns;': '\u25b1', 'fnof;': '\u0192', 'Fopf;': '\U0001d53d', 'fopf;': '\U0001d557', 'ForAll;': '\u2200', 'forall;': '\u2200', 'fork;': '\u22d4', 'forkv;': '\u2ad9', 'Fouriertrf;': '\u2131', 'fpartint;': '\u2a0d', 'frac12': '\xbd', 'frac12;': '\xbd', 'frac13;': '\u2153', 'frac14': '\xbc', 'frac14;': '\xbc', 'frac15;': '\u2155', 'frac16;': '\u2159', 'frac18;': '\u215b', 'frac23;': '\u2154', 'frac25;': '\u2156', 'frac34': '\xbe', 'frac34;': '\xbe', 'frac35;': '\u2157', 'frac38;': '\u215c', 'frac45;': '\u2158', 'frac56;': '\u215a', 'frac58;': '\u215d', 'frac78;': '\u215e', 'frasl;': '\u2044', 'frown;': '\u2322', 'Fscr;': '\u2131', 'fscr;': '\U0001d4bb', 'gacute;': '\u01f5', 'Gamma;': '\u0393', 'gamma;': '\u03b3', 'Gammad;': '\u03dc', 'gammad;': '\u03dd', 'gap;': '\u2a86', 'Gbreve;': '\u011e', 'gbreve;': '\u011f', 'Gcedil;': '\u0122', 'Gcirc;': '\u011c', 'gcirc;': '\u011d', 'Gcy;': '\u0413', 'gcy;': '\u0433', 'Gdot;': '\u0120', 'gdot;': '\u0121', 'gE;': '\u2267', 'ge;': '\u2265', 'gEl;': '\u2a8c', 'gel;': '\u22db', 'geq;': '\u2265', 'geqq;': '\u2267', 'geqslant;': '\u2a7e', 'ges;': '\u2a7e', 'gescc;': '\u2aa9', 'gesdot;': '\u2a80', 'gesdoto;': '\u2a82', 'gesdotol;': '\u2a84', 'gesl;': '\u22db\ufe00', 'gesles;': '\u2a94', 'Gfr;': '\U0001d50a', 'gfr;': '\U0001d524', 'Gg;': '\u22d9', 'gg;': '\u226b', 'ggg;': '\u22d9', 'gimel;': '\u2137', 'GJcy;': '\u0403', 'gjcy;': '\u0453', 'gl;': '\u2277', 'gla;': '\u2aa5', 'glE;': '\u2a92', 'glj;': '\u2aa4', 'gnap;': '\u2a8a', 'gnapprox;': '\u2a8a', 'gnE;': '\u2269', 'gne;': '\u2a88', 'gneq;': '\u2a88', 'gneqq;': '\u2269', 'gnsim;': '\u22e7', 'Gopf;': '\U0001d53e', 'gopf;': '\U0001d558', 'grave;': '`', 'GreaterEqual;': '\u2265', 'GreaterEqualLess;': '\u22db', 'GreaterFullEqual;': '\u2267', 'GreaterGreater;': '\u2aa2', 'GreaterLess;': '\u2277', 'GreaterSlantEqual;': '\u2a7e', 'GreaterTilde;': '\u2273', 'Gscr;': '\U0001d4a2', 'gscr;': '\u210a', 'gsim;': '\u2273', 'gsime;': '\u2a8e', 'gsiml;': '\u2a90', 'GT': '>', 'gt': '>', 'GT;': '>', 'Gt;': '\u226b', 'gt;': '>', 'gtcc;': '\u2aa7', 'gtcir;': '\u2a7a', 'gtdot;': '\u22d7', 'gtlPar;': '\u2995', 'gtquest;': '\u2a7c', 'gtrapprox;': '\u2a86', 'gtrarr;': '\u2978', 'gtrdot;': '\u22d7', 'gtreqless;': '\u22db', 'gtreqqless;': '\u2a8c', 'gtrless;': '\u2277', 'gtrsim;': '\u2273', 'gvertneqq;': '\u2269\ufe00', 'gvnE;': '\u2269\ufe00', 'Hacek;': '\u02c7', 'hairsp;': '\u200a', 'half;': '\xbd', 'hamilt;': '\u210b', 'HARDcy;': '\u042a', 'hardcy;': '\u044a', 'hArr;': '\u21d4', 'harr;': '\u2194', 'harrcir;': '\u2948', 'harrw;': '\u21ad', 'Hat;': '^', 'hbar;': '\u210f', 'Hcirc;': '\u0124', 'hcirc;': '\u0125', 'hearts;': '\u2665', 'heartsuit;': '\u2665', 'hellip;': '\u2026', 'hercon;': '\u22b9', 'Hfr;': '\u210c', 'hfr;': '\U0001d525', 'HilbertSpace;': '\u210b', 'hksearow;': '\u2925', 'hkswarow;': '\u2926', 'hoarr;': '\u21ff', 'homtht;': '\u223b', 'hookleftarrow;': '\u21a9', 'hookrightarrow;': '\u21aa', 'Hopf;': '\u210d', 'hopf;': '\U0001d559', 'horbar;': '\u2015', 'HorizontalLine;': '\u2500', 'Hscr;': '\u210b', 'hscr;': '\U0001d4bd', 'hslash;': '\u210f', 'Hstrok;': '\u0126', 'hstrok;': '\u0127', 'HumpDownHump;': '\u224e', 'HumpEqual;': '\u224f', 'hybull;': '\u2043', 'hyphen;': '\u2010', 'Iacute': '\xcd', 'iacute': '\xed', 'Iacute;': '\xcd', 'iacute;': '\xed', 'ic;': '\u2063', 'Icirc': '\xce', 'icirc': '\xee', 'Icirc;': '\xce', 'icirc;': '\xee', 'Icy;': '\u0418', 'icy;': '\u0438', 'Idot;': '\u0130', 'IEcy;': '\u0415', 'iecy;': '\u0435', 'iexcl': '\xa1', 'iexcl;': '\xa1', 'iff;': '\u21d4', 'Ifr;': '\u2111', 'ifr;': '\U0001d526', 'Igrave': '\xcc', 'igrave': '\xec', 'Igrave;': '\xcc', 'igrave;': '\xec', 'ii;': '\u2148', 'iiiint;': '\u2a0c', 'iiint;': '\u222d', 'iinfin;': '\u29dc', 'iiota;': '\u2129', 'IJlig;': '\u0132', 'ijlig;': '\u0133', 'Im;': '\u2111', 'Imacr;': '\u012a', 'imacr;': '\u012b', 'image;': '\u2111', 'ImaginaryI;': '\u2148', 'imagline;': '\u2110', 'imagpart;': '\u2111', 'imath;': '\u0131', 'imof;': '\u22b7', 'imped;': '\u01b5', 'Implies;': '\u21d2', 'in;': '\u2208', 'incare;': '\u2105', 'infin;': '\u221e', 'infintie;': '\u29dd', 'inodot;': '\u0131', 'Int;': '\u222c', 'int;': '\u222b', 'intcal;': '\u22ba', 'integers;': '\u2124', 'Integral;': '\u222b', 'intercal;': '\u22ba', 'Intersection;': '\u22c2', 'intlarhk;': '\u2a17', 'intprod;': '\u2a3c', 'InvisibleComma;': '\u2063', 'InvisibleTimes;': '\u2062', 'IOcy;': '\u0401', 'iocy;': '\u0451', 'Iogon;': '\u012e', 'iogon;': '\u012f', 'Iopf;': '\U0001d540', 'iopf;': '\U0001d55a', 'Iota;': '\u0399', 'iota;': '\u03b9', 'iprod;': '\u2a3c', 'iquest': '\xbf', 'iquest;': '\xbf', 'Iscr;': '\u2110', 'iscr;': '\U0001d4be', 'isin;': '\u2208', 'isindot;': '\u22f5', 'isinE;': '\u22f9', 'isins;': '\u22f4', 'isinsv;': '\u22f3', 'isinv;': '\u2208', 'it;': '\u2062', 'Itilde;': '\u0128', 'itilde;': '\u0129', 'Iukcy;': '\u0406', 'iukcy;': '\u0456', 'Iuml': '\xcf', 'iuml': '\xef', 'Iuml;': '\xcf', 'iuml;': '\xef', 'Jcirc;': '\u0134', 'jcirc;': '\u0135', 'Jcy;': '\u0419', 'jcy;': '\u0439', 'Jfr;': '\U0001d50d', 'jfr;': '\U0001d527', 'jmath;': '\u0237', 'Jopf;': '\U0001d541', 'jopf;': '\U0001d55b', 'Jscr;': '\U0001d4a5', 'jscr;': '\U0001d4bf', 'Jsercy;': '\u0408', 'jsercy;': '\u0458', 'Jukcy;': '\u0404', 'jukcy;': '\u0454', 'Kappa;': '\u039a', 'kappa;': '\u03ba', 'kappav;': '\u03f0', 'Kcedil;': '\u0136', 'kcedil;': '\u0137', 'Kcy;': '\u041a', 'kcy;': '\u043a', 'Kfr;': '\U0001d50e', 'kfr;': '\U0001d528', 'kgreen;': '\u0138', 'KHcy;': '\u0425', 'khcy;': '\u0445', 'KJcy;': '\u040c', 'kjcy;': '\u045c', 'Kopf;': '\U0001d542', 'kopf;': '\U0001d55c', 'Kscr;': '\U0001d4a6', 'kscr;': '\U0001d4c0', 'lAarr;': '\u21da', 'Lacute;': '\u0139', 'lacute;': '\u013a', 'laemptyv;': '\u29b4', 'lagran;': '\u2112', 'Lambda;': '\u039b', 'lambda;': '\u03bb', 'Lang;': '\u27ea', 'lang;': '\u27e8', 'langd;': '\u2991', 'langle;': '\u27e8', 'lap;': '\u2a85', 'Laplacetrf;': '\u2112', 'laquo': '\xab', 'laquo;': '\xab', 'Larr;': '\u219e', 'lArr;': '\u21d0', 'larr;': '\u2190', 'larrb;': '\u21e4', 'larrbfs;': '\u291f', 'larrfs;': '\u291d', 'larrhk;': '\u21a9', 'larrlp;': '\u21ab', 'larrpl;': '\u2939', 'larrsim;': '\u2973', 'larrtl;': '\u21a2', 'lat;': '\u2aab', 'lAtail;': '\u291b', 'latail;': '\u2919', 'late;': '\u2aad', 'lates;': '\u2aad\ufe00', 'lBarr;': '\u290e', 'lbarr;': '\u290c', 'lbbrk;': '\u2772', 'lbrace;': '{', 'lbrack;': '[', 'lbrke;': '\u298b', 'lbrksld;': '\u298f', 'lbrkslu;': '\u298d', 'Lcaron;': '\u013d', 'lcaron;': '\u013e', 'Lcedil;': '\u013b', 'lcedil;': '\u013c', 'lceil;': '\u2308', 'lcub;': '{', 'Lcy;': '\u041b', 'lcy;': '\u043b', 'ldca;': '\u2936', 'ldquo;': '\u201c', 'ldquor;': '\u201e', 'ldrdhar;': '\u2967', 'ldrushar;': '\u294b', 'ldsh;': '\u21b2', 'lE;': '\u2266', 'le;': '\u2264', 'LeftAngleBracket;': '\u27e8', 'LeftArrow;': '\u2190', 'Leftarrow;': '\u21d0', 'leftarrow;': '\u2190', 'LeftArrowBar;': '\u21e4', 'LeftArrowRightArrow;': '\u21c6', 'leftarrowtail;': '\u21a2', 'LeftCeiling;': '\u2308', 'LeftDoubleBracket;': '\u27e6', 'LeftDownTeeVector;': '\u2961', 'LeftDownVector;': '\u21c3', 'LeftDownVectorBar;': '\u2959', 'LeftFloor;': '\u230a', 'leftharpoondown;': '\u21bd', 'leftharpoonup;': '\u21bc', 'leftleftarrows;': '\u21c7', 'LeftRightArrow;': '\u2194', 'Leftrightarrow;': '\u21d4', 'leftrightarrow;': '\u2194', 'leftrightarrows;': '\u21c6', 'leftrightharpoons;': '\u21cb', 'leftrightsquigarrow;': '\u21ad', 'LeftRightVector;': '\u294e', 'LeftTee;': '\u22a3', 'LeftTeeArrow;': '\u21a4', 'LeftTeeVector;': '\u295a', 'leftthreetimes;': '\u22cb', 'LeftTriangle;': '\u22b2', 'LeftTriangleBar;': '\u29cf', 'LeftTriangleEqual;': '\u22b4', 'LeftUpDownVector;': '\u2951', 'LeftUpTeeVector;': '\u2960', 'LeftUpVector;': '\u21bf', 'LeftUpVectorBar;': '\u2958', 'LeftVector;': '\u21bc', 'LeftVectorBar;': '\u2952', 'lEg;': '\u2a8b', 'leg;': '\u22da', 'leq;': '\u2264', 'leqq;': '\u2266', 'leqslant;': '\u2a7d', 'les;': '\u2a7d', 'lescc;': '\u2aa8', 'lesdot;': '\u2a7f', 'lesdoto;': '\u2a81', 'lesdotor;': '\u2a83', 'lesg;': '\u22da\ufe00', 'lesges;': '\u2a93', 'lessapprox;': '\u2a85', 'lessdot;': '\u22d6', 'lesseqgtr;': '\u22da', 'lesseqqgtr;': '\u2a8b', 'LessEqualGreater;': '\u22da', 'LessFullEqual;': '\u2266', 'LessGreater;': '\u2276', 'lessgtr;': '\u2276', 'LessLess;': '\u2aa1', 'lesssim;': '\u2272', 'LessSlantEqual;': '\u2a7d', 'LessTilde;': '\u2272', 'lfisht;': '\u297c', 'lfloor;': '\u230a', 'Lfr;': '\U0001d50f', 'lfr;': '\U0001d529', 'lg;': '\u2276', 'lgE;': '\u2a91', 'lHar;': '\u2962', 'lhard;': '\u21bd', 'lharu;': '\u21bc', 'lharul;': '\u296a', 'lhblk;': '\u2584', 'LJcy;': '\u0409', 'ljcy;': '\u0459', 'Ll;': '\u22d8', 'll;': '\u226a', 'llarr;': '\u21c7', 'llcorner;': '\u231e', 'Lleftarrow;': '\u21da', 'llhard;': '\u296b', 'lltri;': '\u25fa', 'Lmidot;': '\u013f', 'lmidot;': '\u0140', 'lmoust;': '\u23b0', 'lmoustache;': '\u23b0', 'lnap;': '\u2a89', 'lnapprox;': '\u2a89', 'lnE;': '\u2268', 'lne;': '\u2a87', 'lneq;': '\u2a87', 'lneqq;': '\u2268', 'lnsim;': '\u22e6', 'loang;': '\u27ec', 'loarr;': '\u21fd', 'lobrk;': '\u27e6', 'LongLeftArrow;': '\u27f5', 'Longleftarrow;': '\u27f8', 'longleftarrow;': '\u27f5', 'LongLeftRightArrow;': '\u27f7', 'Longleftrightarrow;': '\u27fa', 'longleftrightarrow;': '\u27f7', 'longmapsto;': '\u27fc', 'LongRightArrow;': '\u27f6', 'Longrightarrow;': '\u27f9', 'longrightarrow;': '\u27f6', 'looparrowleft;': '\u21ab', 'looparrowright;': '\u21ac', 'lopar;': '\u2985', 'Lopf;': '\U0001d543', 'lopf;': '\U0001d55d', 'loplus;': '\u2a2d', 'lotimes;': '\u2a34', 'lowast;': '\u2217', 'lowbar;': '_', 'LowerLeftArrow;': '\u2199', 'LowerRightArrow;': '\u2198', 'loz;': '\u25ca', 'lozenge;': '\u25ca', 'lozf;': '\u29eb', 'lpar;': '(', 'lparlt;': '\u2993', 'lrarr;': '\u21c6', 'lrcorner;': '\u231f', 'lrhar;': '\u21cb', 'lrhard;': '\u296d', 'lrm;': '\u200e', 'lrtri;': '\u22bf', 'lsaquo;': '\u2039', 'Lscr;': '\u2112', 'lscr;': '\U0001d4c1', 'Lsh;': '\u21b0', 'lsh;': '\u21b0', 'lsim;': '\u2272', 'lsime;': '\u2a8d', 'lsimg;': '\u2a8f', 'lsqb;': '[', 'lsquo;': '\u2018', 'lsquor;': '\u201a', 'Lstrok;': '\u0141', 'lstrok;': '\u0142', 'LT': '<', 'lt': '<', 'LT;': '<', 'Lt;': '\u226a', 'lt;': '<', 'ltcc;': '\u2aa6', 'ltcir;': '\u2a79', 'ltdot;': '\u22d6', 'lthree;': '\u22cb', 'ltimes;': '\u22c9', 'ltlarr;': '\u2976', 'ltquest;': '\u2a7b', 'ltri;': '\u25c3', 'ltrie;': '\u22b4', 'ltrif;': '\u25c2', 'ltrPar;': '\u2996', 'lurdshar;': '\u294a', 'luruhar;': '\u2966', 'lvertneqq;': '\u2268\ufe00', 'lvnE;': '\u2268\ufe00', 'macr': '\xaf', 'macr;': '\xaf', 'male;': '\u2642', 'malt;': '\u2720', 'maltese;': '\u2720', 'Map;': '\u2905', 'map;': '\u21a6', 'mapsto;': '\u21a6', 'mapstodown;': '\u21a7', 'mapstoleft;': '\u21a4', 'mapstoup;': '\u21a5', 'marker;': '\u25ae', 'mcomma;': '\u2a29', 'Mcy;': '\u041c', 'mcy;': '\u043c', 'mdash;': '\u2014', 'mDDot;': '\u223a', 'measuredangle;': '\u2221', 'MediumSpace;': '\u205f', 'Mellintrf;': '\u2133', 'Mfr;': '\U0001d510', 'mfr;': '\U0001d52a', 'mho;': '\u2127', 'micro': '\xb5', 'micro;': '\xb5', 'mid;': '\u2223', 'midast;': '*', 'midcir;': '\u2af0', 'middot': '\xb7', 'middot;': '\xb7', 'minus;': '\u2212', 'minusb;': '\u229f', 'minusd;': '\u2238', 'minusdu;': '\u2a2a', 'MinusPlus;': '\u2213', 'mlcp;': '\u2adb', 'mldr;': '\u2026', 'mnplus;': '\u2213', 'models;': '\u22a7', 'Mopf;': '\U0001d544', 'mopf;': '\U0001d55e', 'mp;': '\u2213', 'Mscr;': '\u2133', 'mscr;': '\U0001d4c2', 'mstpos;': '\u223e', 'Mu;': '\u039c', 'mu;': '\u03bc', 'multimap;': '\u22b8', 'mumap;': '\u22b8', 'nabla;': '\u2207', 'Nacute;': '\u0143', 'nacute;': '\u0144', 'nang;': '\u2220\u20d2', 'nap;': '\u2249', 'napE;': '\u2a70\u0338', 'napid;': '\u224b\u0338', 'napos;': '\u0149', 'napprox;': '\u2249', 'natur;': '\u266e', 'natural;': '\u266e', 'naturals;': '\u2115', 'nbsp': '\xa0', 'nbsp;': '\xa0', 'nbump;': '\u224e\u0338', 'nbumpe;': '\u224f\u0338', 'ncap;': '\u2a43', 'Ncaron;': '\u0147', 'ncaron;': '\u0148', 'Ncedil;': '\u0145', 'ncedil;': '\u0146', 'ncong;': '\u2247', 'ncongdot;': '\u2a6d\u0338', 'ncup;': '\u2a42', 'Ncy;': '\u041d', 'ncy;': '\u043d', 'ndash;': '\u2013', 'ne;': '\u2260', 'nearhk;': '\u2924', 'neArr;': '\u21d7', 'nearr;': '\u2197', 'nearrow;': '\u2197', 'nedot;': '\u2250\u0338', 'NegativeMediumSpace;': '\u200b', 'NegativeThickSpace;': '\u200b', 'NegativeThinSpace;': '\u200b', 'NegativeVeryThinSpace;': '\u200b', 'nequiv;': '\u2262', 'nesear;': '\u2928', 'nesim;': '\u2242\u0338', 'NestedGreaterGreater;': '\u226b', 'NestedLessLess;': '\u226a', 'NewLine;': '\n', 'nexist;': '\u2204', 'nexists;': '\u2204', 'Nfr;': '\U0001d511', 'nfr;': '\U0001d52b', 'ngE;': '\u2267\u0338', 'nge;': '\u2271', 'ngeq;': '\u2271', 'ngeqq;': '\u2267\u0338', 'ngeqslant;': '\u2a7e\u0338', 'nges;': '\u2a7e\u0338', 'nGg;': '\u22d9\u0338', 'ngsim;': '\u2275', 'nGt;': '\u226b\u20d2', 'ngt;': '\u226f', 'ngtr;': '\u226f', 'nGtv;': '\u226b\u0338', 'nhArr;': '\u21ce', 'nharr;': '\u21ae', 'nhpar;': '\u2af2', 'ni;': '\u220b', 'nis;': '\u22fc', 'nisd;': '\u22fa', 'niv;': '\u220b', 'NJcy;': '\u040a', 'njcy;': '\u045a', 'nlArr;': '\u21cd', 'nlarr;': '\u219a', 'nldr;': '\u2025', 'nlE;': '\u2266\u0338', 'nle;': '\u2270', 'nLeftarrow;': '\u21cd', 'nleftarrow;': '\u219a', 'nLeftrightarrow;': '\u21ce', 'nleftrightarrow;': '\u21ae', 'nleq;': '\u2270', 'nleqq;': '\u2266\u0338', 'nleqslant;': '\u2a7d\u0338', 'nles;': '\u2a7d\u0338', 'nless;': '\u226e', 'nLl;': '\u22d8\u0338', 'nlsim;': '\u2274', 'nLt;': '\u226a\u20d2', 'nlt;': '\u226e', 'nltri;': '\u22ea', 'nltrie;': '\u22ec', 'nLtv;': '\u226a\u0338', 'nmid;': '\u2224', 'NoBreak;': '\u2060', 'NonBreakingSpace;': '\xa0', 'Nopf;': '\u2115', 'nopf;': '\U0001d55f', 'not': '\xac', 'Not;': '\u2aec', 'not;': '\xac', 'NotCongruent;': '\u2262', 'NotCupCap;': '\u226d', 'NotDoubleVerticalBar;': '\u2226', 'NotElement;': '\u2209', 'NotEqual;': '\u2260', 'NotEqualTilde;': '\u2242\u0338', 'NotExists;': '\u2204', 'NotGreater;': '\u226f', 'NotGreaterEqual;': '\u2271', 'NotGreaterFullEqual;': '\u2267\u0338', 'NotGreaterGreater;': '\u226b\u0338', 'NotGreaterLess;': '\u2279', 'NotGreaterSlantEqual;': '\u2a7e\u0338', 'NotGreaterTilde;': '\u2275', 'NotHumpDownHump;': '\u224e\u0338', 'NotHumpEqual;': '\u224f\u0338', 'notin;': '\u2209', 'notindot;': '\u22f5\u0338', 'notinE;': '\u22f9\u0338', 'notinva;': '\u2209', 'notinvb;': '\u22f7', 'notinvc;': '\u22f6', 'NotLeftTriangle;': '\u22ea', 'NotLeftTriangleBar;': '\u29cf\u0338', 'NotLeftTriangleEqual;': '\u22ec', 'NotLess;': '\u226e', 'NotLessEqual;': '\u2270', 'NotLessGreater;': '\u2278', 'NotLessLess;': '\u226a\u0338', 'NotLessSlantEqual;': '\u2a7d\u0338', 'NotLessTilde;': '\u2274', 'NotNestedGreaterGreater;': '\u2aa2\u0338', 'NotNestedLessLess;': '\u2aa1\u0338', 'notni;': '\u220c', 'notniva;': '\u220c', 'notnivb;': '\u22fe', 'notnivc;': '\u22fd', 'NotPrecedes;': '\u2280', 'NotPrecedesEqual;': '\u2aaf\u0338', 'NotPrecedesSlantEqual;': '\u22e0', 'NotReverseElement;': '\u220c', 'NotRightTriangle;': '\u22eb', 'NotRightTriangleBar;': '\u29d0\u0338', 'NotRightTriangleEqual;': '\u22ed', 'NotSquareSubset;': '\u228f\u0338', 'NotSquareSubsetEqual;': '\u22e2', 'NotSquareSuperset;': '\u2290\u0338', 'NotSquareSupersetEqual;': '\u22e3', 'NotSubset;': '\u2282\u20d2', 'NotSubsetEqual;': '\u2288', 'NotSucceeds;': '\u2281', 'NotSucceedsEqual;': '\u2ab0\u0338', 'NotSucceedsSlantEqual;': '\u22e1', 'NotSucceedsTilde;': '\u227f\u0338', 'NotSuperset;': '\u2283\u20d2', 'NotSupersetEqual;': '\u2289', 'NotTilde;': '\u2241', 'NotTildeEqual;': '\u2244', 'NotTildeFullEqual;': '\u2247', 'NotTildeTilde;': '\u2249', 'NotVerticalBar;': '\u2224', 'npar;': '\u2226', 'nparallel;': '\u2226', 'nparsl;': '\u2afd\u20e5', 'npart;': '\u2202\u0338', 'npolint;': '\u2a14', 'npr;': '\u2280', 'nprcue;': '\u22e0', 'npre;': '\u2aaf\u0338', 'nprec;': '\u2280', 'npreceq;': '\u2aaf\u0338', 'nrArr;': '\u21cf', 'nrarr;': '\u219b', 'nrarrc;': '\u2933\u0338', 'nrarrw;': '\u219d\u0338', 'nRightarrow;': '\u21cf', 'nrightarrow;': '\u219b', 'nrtri;': '\u22eb', 'nrtrie;': '\u22ed', 'nsc;': '\u2281', 'nsccue;': '\u22e1', 'nsce;': '\u2ab0\u0338', 'Nscr;': '\U0001d4a9', 'nscr;': '\U0001d4c3', 'nshortmid;': '\u2224', 'nshortparallel;': '\u2226', 'nsim;': '\u2241', 'nsime;': '\u2244', 'nsimeq;': '\u2244', 'nsmid;': '\u2224', 'nspar;': '\u2226', 'nsqsube;': '\u22e2', 'nsqsupe;': '\u22e3', 'nsub;': '\u2284', 'nsubE;': '\u2ac5\u0338', 'nsube;': '\u2288', 'nsubset;': '\u2282\u20d2', 'nsubseteq;': '\u2288', 'nsubseteqq;': '\u2ac5\u0338', 'nsucc;': '\u2281', 'nsucceq;': '\u2ab0\u0338', 'nsup;': '\u2285', 'nsupE;': '\u2ac6\u0338', 'nsupe;': '\u2289', 'nsupset;': '\u2283\u20d2', 'nsupseteq;': '\u2289', 'nsupseteqq;': '\u2ac6\u0338', 'ntgl;': '\u2279', 'Ntilde': '\xd1', 'ntilde': '\xf1', 'Ntilde;': '\xd1', 'ntilde;': '\xf1', 'ntlg;': '\u2278', 'ntriangleleft;': '\u22ea', 'ntrianglelefteq;': '\u22ec', 'ntriangleright;': '\u22eb', 'ntrianglerighteq;': '\u22ed', 'Nu;': '\u039d', 'nu;': '\u03bd', 'num;': '#', 'numero;': '\u2116', 'numsp;': '\u2007', 'nvap;': '\u224d\u20d2', 'nVDash;': '\u22af', 'nVdash;': '\u22ae', 'nvDash;': '\u22ad', 'nvdash;': '\u22ac', 'nvge;': '\u2265\u20d2', 'nvgt;': '>\u20d2', 'nvHarr;': '\u2904', 'nvinfin;': '\u29de', 'nvlArr;': '\u2902', 'nvle;': '\u2264\u20d2', 'nvlt;': '<\u20d2', 'nvltrie;': '\u22b4\u20d2', 'nvrArr;': '\u2903', 'nvrtrie;': '\u22b5\u20d2', 'nvsim;': '\u223c\u20d2', 'nwarhk;': '\u2923', 'nwArr;': '\u21d6', 'nwarr;': '\u2196', 'nwarrow;': '\u2196', 'nwnear;': '\u2927', 'Oacute': '\xd3', 'oacute': '\xf3', 'Oacute;': '\xd3', 'oacute;': '\xf3', 'oast;': '\u229b', 'ocir;': '\u229a', 'Ocirc': '\xd4', 'ocirc': '\xf4', 'Ocirc;': '\xd4', 'ocirc;': '\xf4', 'Ocy;': '\u041e', 'ocy;': '\u043e', 'odash;': '\u229d', 'Odblac;': '\u0150', 'odblac;': '\u0151', 'odiv;': '\u2a38', 'odot;': '\u2299', 'odsold;': '\u29bc', 'OElig;': '\u0152', 'oelig;': '\u0153', 'ofcir;': '\u29bf', 'Ofr;': '\U0001d512', 'ofr;': '\U0001d52c', 'ogon;': '\u02db', 'Ograve': '\xd2', 'ograve': '\xf2', 'Ograve;': '\xd2', 'ograve;': '\xf2', 'ogt;': '\u29c1', 'ohbar;': '\u29b5', 'ohm;': '\u03a9', 'oint;': '\u222e', 'olarr;': '\u21ba', 'olcir;': '\u29be', 'olcross;': '\u29bb', 'oline;': '\u203e', 'olt;': '\u29c0', 'Omacr;': '\u014c', 'omacr;': '\u014d', 'Omega;': '\u03a9', 'omega;': '\u03c9', 'Omicron;': '\u039f', 'omicron;': '\u03bf', 'omid;': '\u29b6', 'ominus;': '\u2296', 'Oopf;': '\U0001d546', 'oopf;': '\U0001d560', 'opar;': '\u29b7', 'OpenCurlyDoubleQuote;': '\u201c', 'OpenCurlyQuote;': '\u2018', 'operp;': '\u29b9', 'oplus;': '\u2295', 'Or;': '\u2a54', 'or;': '\u2228', 'orarr;': '\u21bb', 'ord;': '\u2a5d', 'order;': '\u2134', 'orderof;': '\u2134', 'ordf': '\xaa', 'ordf;': '\xaa', 'ordm': '\xba', 'ordm;': '\xba', 'origof;': '\u22b6', 'oror;': '\u2a56', 'orslope;': '\u2a57', 'orv;': '\u2a5b', 'oS;': '\u24c8', 'Oscr;': '\U0001d4aa', 'oscr;': '\u2134', 'Oslash': '\xd8', 'oslash': '\xf8', 'Oslash;': '\xd8', 'oslash;': '\xf8', 'osol;': '\u2298', 'Otilde': '\xd5', 'otilde': '\xf5', 'Otilde;': '\xd5', 'otilde;': '\xf5', 'Otimes;': '\u2a37', 'otimes;': '\u2297', 'otimesas;': '\u2a36', 'Ouml': '\xd6', 'ouml': '\xf6', 'Ouml;': '\xd6', 'ouml;': '\xf6', 'ovbar;': '\u233d', 'OverBar;': '\u203e', 'OverBrace;': '\u23de', 'OverBracket;': '\u23b4', 'OverParenthesis;': '\u23dc', 'par;': '\u2225', 'para': '\xb6', 'para;': '\xb6', 'parallel;': '\u2225', 'parsim;': '\u2af3', 'parsl;': '\u2afd', 'part;': '\u2202', 'PartialD;': '\u2202', 'Pcy;': '\u041f', 'pcy;': '\u043f', 'percnt;': '%', 'period;': '.', 'permil;': '\u2030', 'perp;': '\u22a5', 'pertenk;': '\u2031', 'Pfr;': '\U0001d513', 'pfr;': '\U0001d52d', 'Phi;': '\u03a6', 'phi;': '\u03c6', 'phiv;': '\u03d5', 'phmmat;': '\u2133', 'phone;': '\u260e', 'Pi;': '\u03a0', 'pi;': '\u03c0', 'pitchfork;': '\u22d4', 'piv;': '\u03d6', 'planck;': '\u210f', 'planckh;': '\u210e', 'plankv;': '\u210f', 'plus;': '+', 'plusacir;': '\u2a23', 'plusb;': '\u229e', 'pluscir;': '\u2a22', 'plusdo;': '\u2214', 'plusdu;': '\u2a25', 'pluse;': '\u2a72', 'PlusMinus;': '\xb1', 'plusmn': '\xb1', 'plusmn;': '\xb1', 'plussim;': '\u2a26', 'plustwo;': '\u2a27', 'pm;': '\xb1', 'Poincareplane;': '\u210c', 'pointint;': '\u2a15', 'Popf;': '\u2119', 'popf;': '\U0001d561', 'pound': '\xa3', 'pound;': '\xa3', 'Pr;': '\u2abb', 'pr;': '\u227a', 'prap;': '\u2ab7', 'prcue;': '\u227c', 'prE;': '\u2ab3', 'pre;': '\u2aaf', 'prec;': '\u227a', 'precapprox;': '\u2ab7', 'preccurlyeq;': '\u227c', 'Precedes;': '\u227a', 'PrecedesEqual;': '\u2aaf', 'PrecedesSlantEqual;': '\u227c', 'PrecedesTilde;': '\u227e', 'preceq;': '\u2aaf', 'precnapprox;': '\u2ab9', 'precneqq;': '\u2ab5', 'precnsim;': '\u22e8', 'precsim;': '\u227e', 'Prime;': '\u2033', 'prime;': '\u2032', 'primes;': '\u2119', 'prnap;': '\u2ab9', 'prnE;': '\u2ab5', 'prnsim;': '\u22e8', 'prod;': '\u220f', 'Product;': '\u220f', 'profalar;': '\u232e', 'profline;': '\u2312', 'profsurf;': '\u2313', 'prop;': '\u221d', 'Proportion;': '\u2237', 'Proportional;': '\u221d', 'propto;': '\u221d', 'prsim;': '\u227e', 'prurel;': '\u22b0', 'Pscr;': '\U0001d4ab', 'pscr;': '\U0001d4c5', 'Psi;': '\u03a8', 'psi;': '\u03c8', 'puncsp;': '\u2008', 'Qfr;': '\U0001d514', 'qfr;': '\U0001d52e', 'qint;': '\u2a0c', 'Qopf;': '\u211a', 'qopf;': '\U0001d562', 'qprime;': '\u2057', 'Qscr;': '\U0001d4ac', 'qscr;': '\U0001d4c6', 'quaternions;': '\u210d', 'quatint;': '\u2a16', 'quest;': '?', 'questeq;': '\u225f', 'QUOT': '"', 'quot': '"', 'QUOT;': '"', 'quot;': '"', 'rAarr;': '\u21db', 'race;': '\u223d\u0331', 'Racute;': '\u0154', 'racute;': '\u0155', 'radic;': '\u221a', 'raemptyv;': '\u29b3', 'Rang;': '\u27eb', 'rang;': '\u27e9', 'rangd;': '\u2992', 'range;': '\u29a5', 'rangle;': '\u27e9', 'raquo': '\xbb', 'raquo;': '\xbb', 'Rarr;': '\u21a0', 'rArr;': '\u21d2', 'rarr;': '\u2192', 'rarrap;': '\u2975', 'rarrb;': '\u21e5', 'rarrbfs;': '\u2920', 'rarrc;': '\u2933', 'rarrfs;': '\u291e', 'rarrhk;': '\u21aa', 'rarrlp;': '\u21ac', 'rarrpl;': '\u2945', 'rarrsim;': '\u2974', 'Rarrtl;': '\u2916', 'rarrtl;': '\u21a3', 'rarrw;': '\u219d', 'rAtail;': '\u291c', 'ratail;': '\u291a', 'ratio;': '\u2236', 'rationals;': '\u211a', 'RBarr;': '\u2910', 'rBarr;': '\u290f', 'rbarr;': '\u290d', 'rbbrk;': '\u2773', 'rbrace;': '}', 'rbrack;': ']', 'rbrke;': '\u298c', 'rbrksld;': '\u298e', 'rbrkslu;': '\u2990', 'Rcaron;': '\u0158', 'rcaron;': '\u0159', 'Rcedil;': '\u0156', 'rcedil;': '\u0157', 'rceil;': '\u2309', 'rcub;': '}', 'Rcy;': '\u0420', 'rcy;': '\u0440', 'rdca;': '\u2937', 'rdldhar;': '\u2969', 'rdquo;': '\u201d', 'rdquor;': '\u201d', 'rdsh;': '\u21b3', 'Re;': '\u211c', 'real;': '\u211c', 'realine;': '\u211b', 'realpart;': '\u211c', 'reals;': '\u211d', 'rect;': '\u25ad', 'REG': '\xae', 'reg': '\xae', 'REG;': '\xae', 'reg;': '\xae', 'ReverseElement;': '\u220b', 'ReverseEquilibrium;': '\u21cb', 'ReverseUpEquilibrium;': '\u296f', 'rfisht;': '\u297d', 'rfloor;': '\u230b', 'Rfr;': '\u211c', 'rfr;': '\U0001d52f', 'rHar;': '\u2964', 'rhard;': '\u21c1', 'rharu;': '\u21c0', 'rharul;': '\u296c', 'Rho;': '\u03a1', 'rho;': '\u03c1', 'rhov;': '\u03f1', 'RightAngleBracket;': '\u27e9', 'RightArrow;': '\u2192', 'Rightarrow;': '\u21d2', 'rightarrow;': '\u2192', 'RightArrowBar;': '\u21e5', 'RightArrowLeftArrow;': '\u21c4', 'rightarrowtail;': '\u21a3', 'RightCeiling;': '\u2309', 'RightDoubleBracket;': '\u27e7', 'RightDownTeeVector;': '\u295d', 'RightDownVector;': '\u21c2', 'RightDownVectorBar;': '\u2955', 'RightFloor;': '\u230b', 'rightharpoondown;': '\u21c1', 'rightharpoonup;': '\u21c0', 'rightleftarrows;': '\u21c4', 'rightleftharpoons;': '\u21cc', 'rightrightarrows;': '\u21c9', 'rightsquigarrow;': '\u219d', 'RightTee;': '\u22a2', 'RightTeeArrow;': '\u21a6', 'RightTeeVector;': '\u295b', 'rightthreetimes;': '\u22cc', 'RightTriangle;': '\u22b3', 'RightTriangleBar;': '\u29d0', 'RightTriangleEqual;': '\u22b5', 'RightUpDownVector;': '\u294f', 'RightUpTeeVector;': '\u295c', 'RightUpVector;': '\u21be', 'RightUpVectorBar;': '\u2954', 'RightVector;': '\u21c0', 'RightVectorBar;': '\u2953', 'ring;': '\u02da', 'risingdotseq;': '\u2253', 'rlarr;': '\u21c4', 'rlhar;': '\u21cc', 'rlm;': '\u200f', 'rmoust;': '\u23b1', 'rmoustache;': '\u23b1', 'rnmid;': '\u2aee', 'roang;': '\u27ed', 'roarr;': '\u21fe', 'robrk;': '\u27e7', 'ropar;': '\u2986', 'Ropf;': '\u211d', 'ropf;': '\U0001d563', 'roplus;': '\u2a2e', 'rotimes;': '\u2a35', 'RoundImplies;': '\u2970', 'rpar;': ')', 'rpargt;': '\u2994', 'rppolint;': '\u2a12', 'rrarr;': '\u21c9', 'Rrightarrow;': '\u21db', 'rsaquo;': '\u203a', 'Rscr;': '\u211b', 'rscr;': '\U0001d4c7', 'Rsh;': '\u21b1', 'rsh;': '\u21b1', 'rsqb;': ']', 'rsquo;': '\u2019', 'rsquor;': '\u2019', 'rthree;': '\u22cc', 'rtimes;': '\u22ca', 'rtri;': '\u25b9', 'rtrie;': '\u22b5', 'rtrif;': '\u25b8', 'rtriltri;': '\u29ce', 'RuleDelayed;': '\u29f4', 'ruluhar;': '\u2968', 'rx;': '\u211e', 'Sacute;': '\u015a', 'sacute;': '\u015b', 'sbquo;': '\u201a', 'Sc;': '\u2abc', 'sc;': '\u227b', 'scap;': '\u2ab8', 'Scaron;': '\u0160', 'scaron;': '\u0161', 'sccue;': '\u227d', 'scE;': '\u2ab4', 'sce;': '\u2ab0', 'Scedil;': '\u015e', 'scedil;': '\u015f', 'Scirc;': '\u015c', 'scirc;': '\u015d', 'scnap;': '\u2aba', 'scnE;': '\u2ab6', 'scnsim;': '\u22e9', 'scpolint;': '\u2a13', 'scsim;': '\u227f', 'Scy;': '\u0421', 'scy;': '\u0441', 'sdot;': '\u22c5', 'sdotb;': '\u22a1', 'sdote;': '\u2a66', 'searhk;': '\u2925', 'seArr;': '\u21d8', 'searr;': '\u2198', 'searrow;': '\u2198', 'sect': '\xa7', 'sect;': '\xa7', 'semi;': ';', 'seswar;': '\u2929', 'setminus;': '\u2216', 'setmn;': '\u2216', 'sext;': '\u2736', 'Sfr;': '\U0001d516', 'sfr;': '\U0001d530', 'sfrown;': '\u2322', 'sharp;': '\u266f', 'SHCHcy;': '\u0429', 'shchcy;': '\u0449', 'SHcy;': '\u0428', 'shcy;': '\u0448', 'ShortDownArrow;': '\u2193', 'ShortLeftArrow;': '\u2190', 'shortmid;': '\u2223', 'shortparallel;': '\u2225', 'ShortRightArrow;': '\u2192', 'ShortUpArrow;': '\u2191', 'shy': '\xad', 'shy;': '\xad', 'Sigma;': '\u03a3', 'sigma;': '\u03c3', 'sigmaf;': '\u03c2', 'sigmav;': '\u03c2', 'sim;': '\u223c', 'simdot;': '\u2a6a', 'sime;': '\u2243', 'simeq;': '\u2243', 'simg;': '\u2a9e', 'simgE;': '\u2aa0', 'siml;': '\u2a9d', 'simlE;': '\u2a9f', 'simne;': '\u2246', 'simplus;': '\u2a24', 'simrarr;': '\u2972', 'slarr;': '\u2190', 'SmallCircle;': '\u2218', 'smallsetminus;': '\u2216', 'smashp;': '\u2a33', 'smeparsl;': '\u29e4', 'smid;': '\u2223', 'smile;': '\u2323', 'smt;': '\u2aaa', 'smte;': '\u2aac', 'smtes;': '\u2aac\ufe00', 'SOFTcy;': '\u042c', 'softcy;': '\u044c', 'sol;': '/', 'solb;': '\u29c4', 'solbar;': '\u233f', 'Sopf;': '\U0001d54a', 'sopf;': '\U0001d564', 'spades;': '\u2660', 'spadesuit;': '\u2660', 'spar;': '\u2225', 'sqcap;': '\u2293', 'sqcaps;': '\u2293\ufe00', 'sqcup;': '\u2294', 'sqcups;': '\u2294\ufe00', 'Sqrt;': '\u221a', 'sqsub;': '\u228f', 'sqsube;': '\u2291', 'sqsubset;': '\u228f', 'sqsubseteq;': '\u2291', 'sqsup;': '\u2290', 'sqsupe;': '\u2292', 'sqsupset;': '\u2290', 'sqsupseteq;': '\u2292', 'squ;': '\u25a1', 'Square;': '\u25a1', 'square;': '\u25a1', 'SquareIntersection;': '\u2293', 'SquareSubset;': '\u228f', 'SquareSubsetEqual;': '\u2291', 'SquareSuperset;': '\u2290', 'SquareSupersetEqual;': '\u2292', 'SquareUnion;': '\u2294', 'squarf;': '\u25aa', 'squf;': '\u25aa', 'srarr;': '\u2192', 'Sscr;': '\U0001d4ae', 'sscr;': '\U0001d4c8', 'ssetmn;': '\u2216', 'ssmile;': '\u2323', 'sstarf;': '\u22c6', 'Star;': '\u22c6', 'star;': '\u2606', 'starf;': '\u2605', 'straightepsilon;': '\u03f5', 'straightphi;': '\u03d5', 'strns;': '\xaf', 'Sub;': '\u22d0', 'sub;': '\u2282', 'subdot;': '\u2abd', 'subE;': '\u2ac5', 'sube;': '\u2286', 'subedot;': '\u2ac3', 'submult;': '\u2ac1', 'subnE;': '\u2acb', 'subne;': '\u228a', 'subplus;': '\u2abf', 'subrarr;': '\u2979', 'Subset;': '\u22d0', 'subset;': '\u2282', 'subseteq;': '\u2286', 'subseteqq;': '\u2ac5', 'SubsetEqual;': '\u2286', 'subsetneq;': '\u228a', 'subsetneqq;': '\u2acb', 'subsim;': '\u2ac7', 'subsub;': '\u2ad5', 'subsup;': '\u2ad3', 'succ;': '\u227b', 'succapprox;': '\u2ab8', 'succcurlyeq;': '\u227d', 'Succeeds;': '\u227b', 'SucceedsEqual;': '\u2ab0', 'SucceedsSlantEqual;': '\u227d', 'SucceedsTilde;': '\u227f', 'succeq;': '\u2ab0', 'succnapprox;': '\u2aba', 'succneqq;': '\u2ab6', 'succnsim;': '\u22e9', 'succsim;': '\u227f', 'SuchThat;': '\u220b', 'Sum;': '\u2211', 'sum;': '\u2211', 'sung;': '\u266a', 'sup1': '\xb9', 'sup1;': '\xb9', 'sup2': '\xb2', 'sup2;': '\xb2', 'sup3': '\xb3', 'sup3;': '\xb3', 'Sup;': '\u22d1', 'sup;': '\u2283', 'supdot;': '\u2abe', 'supdsub;': '\u2ad8', 'supE;': '\u2ac6', 'supe;': '\u2287', 'supedot;': '\u2ac4', 'Superset;': '\u2283', 'SupersetEqual;': '\u2287', 'suphsol;': '\u27c9', 'suphsub;': '\u2ad7', 'suplarr;': '\u297b', 'supmult;': '\u2ac2', 'supnE;': '\u2acc', 'supne;': '\u228b', 'supplus;': '\u2ac0', 'Supset;': '\u22d1', 'supset;': '\u2283', 'supseteq;': '\u2287', 'supseteqq;': '\u2ac6', 'supsetneq;': '\u228b', 'supsetneqq;': '\u2acc', 'supsim;': '\u2ac8', 'supsub;': '\u2ad4', 'supsup;': '\u2ad6', 'swarhk;': '\u2926', 'swArr;': '\u21d9', 'swarr;': '\u2199', 'swarrow;': '\u2199', 'swnwar;': '\u292a', 'szlig': '\xdf', 'szlig;': '\xdf', 'Tab;': '\t', 'target;': '\u2316', 'Tau;': '\u03a4', 'tau;': '\u03c4', 'tbrk;': '\u23b4', 'Tcaron;': '\u0164', 'tcaron;': '\u0165', 'Tcedil;': '\u0162', 'tcedil;': '\u0163', 'Tcy;': '\u0422', 'tcy;': '\u0442', 'tdot;': '\u20db', 'telrec;': '\u2315', 'Tfr;': '\U0001d517', 'tfr;': '\U0001d531', 'there4;': '\u2234', 'Therefore;': '\u2234', 'therefore;': '\u2234', 'Theta;': '\u0398', 'theta;': '\u03b8', 'thetasym;': '\u03d1', 'thetav;': '\u03d1', 'thickapprox;': '\u2248', 'thicksim;': '\u223c', 'ThickSpace;': '\u205f\u200a', 'thinsp;': '\u2009', 'ThinSpace;': '\u2009', 'thkap;': '\u2248', 'thksim;': '\u223c', 'THORN': '\xde', 'thorn': '\xfe', 'THORN;': '\xde', 'thorn;': '\xfe', 'Tilde;': '\u223c', 'tilde;': '\u02dc', 'TildeEqual;': '\u2243', 'TildeFullEqual;': '\u2245', 'TildeTilde;': '\u2248', 'times': '\xd7', 'times;': '\xd7', 'timesb;': '\u22a0', 'timesbar;': '\u2a31', 'timesd;': '\u2a30', 'tint;': '\u222d', 'toea;': '\u2928', 'top;': '\u22a4', 'topbot;': '\u2336', 'topcir;': '\u2af1', 'Topf;': '\U0001d54b', 'topf;': '\U0001d565', 'topfork;': '\u2ada', 'tosa;': '\u2929', 'tprime;': '\u2034', 'TRADE;': '\u2122', 'trade;': '\u2122', 'triangle;': '\u25b5', 'triangledown;': '\u25bf', 'triangleleft;': '\u25c3', 'trianglelefteq;': '\u22b4', 'triangleq;': '\u225c', 'triangleright;': '\u25b9', 'trianglerighteq;': '\u22b5', 'tridot;': '\u25ec', 'trie;': '\u225c', 'triminus;': '\u2a3a', 'TripleDot;': '\u20db', 'triplus;': '\u2a39', 'trisb;': '\u29cd', 'tritime;': '\u2a3b', 'trpezium;': '\u23e2', 'Tscr;': '\U0001d4af', 'tscr;': '\U0001d4c9', 'TScy;': '\u0426', 'tscy;': '\u0446', 'TSHcy;': '\u040b', 'tshcy;': '\u045b', 'Tstrok;': '\u0166', 'tstrok;': '\u0167', 'twixt;': '\u226c', 'twoheadleftarrow;': '\u219e', 'twoheadrightarrow;': '\u21a0', 'Uacute': '\xda', 'uacute': '\xfa', 'Uacute;': '\xda', 'uacute;': '\xfa', 'Uarr;': '\u219f', 'uArr;': '\u21d1', 'uarr;': '\u2191', 'Uarrocir;': '\u2949', 'Ubrcy;': '\u040e', 'ubrcy;': '\u045e', 'Ubreve;': '\u016c', 'ubreve;': '\u016d', 'Ucirc': '\xdb', 'ucirc': '\xfb', 'Ucirc;': '\xdb', 'ucirc;': '\xfb', 'Ucy;': '\u0423', 'ucy;': '\u0443', 'udarr;': '\u21c5', 'Udblac;': '\u0170', 'udblac;': '\u0171', 'udhar;': '\u296e', 'ufisht;': '\u297e', 'Ufr;': '\U0001d518', 'ufr;': '\U0001d532', 'Ugrave': '\xd9', 'ugrave': '\xf9', 'Ugrave;': '\xd9', 'ugrave;': '\xf9', 'uHar;': '\u2963', 'uharl;': '\u21bf', 'uharr;': '\u21be', 'uhblk;': '\u2580', 'ulcorn;': '\u231c', 'ulcorner;': '\u231c', 'ulcrop;': '\u230f', 'ultri;': '\u25f8', 'Umacr;': '\u016a', 'umacr;': '\u016b', 'uml': '\xa8', 'uml;': '\xa8', 'UnderBar;': '_', 'UnderBrace;': '\u23df', 'UnderBracket;': '\u23b5', 'UnderParenthesis;': '\u23dd', 'Union;': '\u22c3', 'UnionPlus;': '\u228e', 'Uogon;': '\u0172', 'uogon;': '\u0173', 'Uopf;': '\U0001d54c', 'uopf;': '\U0001d566', 'UpArrow;': '\u2191', 'Uparrow;': '\u21d1', 'uparrow;': '\u2191', 'UpArrowBar;': '\u2912', 'UpArrowDownArrow;': '\u21c5', 'UpDownArrow;': '\u2195', 'Updownarrow;': '\u21d5', 'updownarrow;': '\u2195', 'UpEquilibrium;': '\u296e', 'upharpoonleft;': '\u21bf', 'upharpoonright;': '\u21be', 'uplus;': '\u228e', 'UpperLeftArrow;': '\u2196', 'UpperRightArrow;': '\u2197', 'Upsi;': '\u03d2', 'upsi;': '\u03c5', 'upsih;': '\u03d2', 'Upsilon;': '\u03a5', 'upsilon;': '\u03c5', 'UpTee;': '\u22a5', 'UpTeeArrow;': '\u21a5', 'upuparrows;': '\u21c8', 'urcorn;': '\u231d', 'urcorner;': '\u231d', 'urcrop;': '\u230e', 'Uring;': '\u016e', 'uring;': '\u016f', 'urtri;': '\u25f9', 'Uscr;': '\U0001d4b0', 'uscr;': '\U0001d4ca', 'utdot;': '\u22f0', 'Utilde;': '\u0168', 'utilde;': '\u0169', 'utri;': '\u25b5', 'utrif;': '\u25b4', 'uuarr;': '\u21c8', 'Uuml': '\xdc', 'uuml': '\xfc', 'Uuml;': '\xdc', 'uuml;': '\xfc', 'uwangle;': '\u29a7', 'vangrt;': '\u299c', 'varepsilon;': '\u03f5', 'varkappa;': '\u03f0', 'varnothing;': '\u2205', 'varphi;': '\u03d5', 'varpi;': '\u03d6', 'varpropto;': '\u221d', 'vArr;': '\u21d5', 'varr;': '\u2195', 'varrho;': '\u03f1', 'varsigma;': '\u03c2', 'varsubsetneq;': '\u228a\ufe00', 'varsubsetneqq;': '\u2acb\ufe00', 'varsupsetneq;': '\u228b\ufe00', 'varsupsetneqq;': '\u2acc\ufe00', 'vartheta;': '\u03d1', 'vartriangleleft;': '\u22b2', 'vartriangleright;': '\u22b3', 'Vbar;': '\u2aeb', 'vBar;': '\u2ae8', 'vBarv;': '\u2ae9', 'Vcy;': '\u0412', 'vcy;': '\u0432', 'VDash;': '\u22ab', 'Vdash;': '\u22a9', 'vDash;': '\u22a8', 'vdash;': '\u22a2', 'Vdashl;': '\u2ae6', 'Vee;': '\u22c1', 'vee;': '\u2228', 'veebar;': '\u22bb', 'veeeq;': '\u225a', 'vellip;': '\u22ee', 'Verbar;': '\u2016', 'verbar;': '|', 'Vert;': '\u2016', 'vert;': '|', 'VerticalBar;': '\u2223', 'VerticalLine;': '|', 'VerticalSeparator;': '\u2758', 'VerticalTilde;': '\u2240', 'VeryThinSpace;': '\u200a', 'Vfr;': '\U0001d519', 'vfr;': '\U0001d533', 'vltri;': '\u22b2', 'vnsub;': '\u2282\u20d2', 'vnsup;': '\u2283\u20d2', 'Vopf;': '\U0001d54d', 'vopf;': '\U0001d567', 'vprop;': '\u221d', 'vrtri;': '\u22b3', 'Vscr;': '\U0001d4b1', 'vscr;': '\U0001d4cb', 'vsubnE;': '\u2acb\ufe00', 'vsubne;': '\u228a\ufe00', 'vsupnE;': '\u2acc\ufe00', 'vsupne;': '\u228b\ufe00', 'Vvdash;': '\u22aa', 'vzigzag;': '\u299a', 'Wcirc;': '\u0174', 'wcirc;': '\u0175', 'wedbar;': '\u2a5f', 'Wedge;': '\u22c0', 'wedge;': '\u2227', 'wedgeq;': '\u2259', 'weierp;': '\u2118', 'Wfr;': '\U0001d51a', 'wfr;': '\U0001d534', 'Wopf;': '\U0001d54e', 'wopf;': '\U0001d568', 'wp;': '\u2118', 'wr;': '\u2240', 'wreath;': '\u2240', 'Wscr;': '\U0001d4b2', 'wscr;': '\U0001d4cc', 'xcap;': '\u22c2', 'xcirc;': '\u25ef', 'xcup;': '\u22c3', 'xdtri;': '\u25bd', 'Xfr;': '\U0001d51b', 'xfr;': '\U0001d535', 'xhArr;': '\u27fa', 'xharr;': '\u27f7', 'Xi;': '\u039e', 'xi;': '\u03be', 'xlArr;': '\u27f8', 'xlarr;': '\u27f5', 'xmap;': '\u27fc', 'xnis;': '\u22fb', 'xodot;': '\u2a00', 'Xopf;': '\U0001d54f', 'xopf;': '\U0001d569', 'xoplus;': '\u2a01', 'xotime;': '\u2a02', 'xrArr;': '\u27f9', 'xrarr;': '\u27f6', 'Xscr;': '\U0001d4b3', 'xscr;': '\U0001d4cd', 'xsqcup;': '\u2a06', 'xuplus;': '\u2a04', 'xutri;': '\u25b3', 'xvee;': '\u22c1', 'xwedge;': '\u22c0', 'Yacute': '\xdd', 'yacute': '\xfd', 'Yacute;': '\xdd', 'yacute;': '\xfd', 'YAcy;': '\u042f', 'yacy;': '\u044f', 'Ycirc;': '\u0176', 'ycirc;': '\u0177', 'Ycy;': '\u042b', 'ycy;': '\u044b', 'yen': '\xa5', 'yen;': '\xa5', 'Yfr;': '\U0001d51c', 'yfr;': '\U0001d536', 'YIcy;': '\u0407', 'yicy;': '\u0457', 'Yopf;': '\U0001d550', 'yopf;': '\U0001d56a', 'Yscr;': '\U0001d4b4', 'yscr;': '\U0001d4ce', 'YUcy;': '\u042e', 'yucy;': '\u044e', 'yuml': '\xff', 'Yuml;': '\u0178', 'yuml;': '\xff', 'Zacute;': '\u0179', 'zacute;': '\u017a', 'Zcaron;': '\u017d', 'zcaron;': '\u017e', 'Zcy;': '\u0417', 'zcy;': '\u0437', 'Zdot;': '\u017b', 'zdot;': '\u017c', 'zeetrf;': '\u2128', 'ZeroWidthSpace;': '\u200b', 'Zeta;': '\u0396', 'zeta;': '\u03b6', 'Zfr;': '\u2128', 'zfr;': '\U0001d537', 'ZHcy;': '\u0416', 'zhcy;': '\u0436', 'zigrarr;': '\u21dd', 'Zopf;': '\u2124', 'zopf;': '\U0001d56b', 'Zscr;': '\U0001d4b5', 'zscr;': '\U0001d4cf', 'zwj;': '\u200d', 'zwnj;': '\u200c', } Kajiki-0.8.2/kajiki/lnotab.py0000644000076500000240000000713712554436352016112 0ustar amolstaff00000000000000# -*- coding: utf-8 -*- '''Comment copied from Python/compile.c: All about a_lnotab. c_lnotab is an array of unsigned bytes disguised as a Python string. It is used to map bytecode offsets to source code line #s (when needed for tracebacks). The array is conceptually a list of (bytecode offset increment, line number increment) pairs. The details are important and delicate, best illustrated by example: byte code offset source code line number 0 1 6 2 50 7 350 307 361 308 The first trick is that these numbers aren't stored, only the increments from one row to the next (this doesn't really work, but it's a start): 0, 1, 6, 1, 44, 5, 300, 300, 11, 1 The second trick is that an unsigned byte can't hold negative values, or values larger than 255, so (a) there's a deep assumption that byte code offsets and their corresponding line #s both increase monotonically, and (b) if at least one column jumps by more than 255 from one row to the next, more than one pair is written to the table. In case #b, there's no way to know from looking at the table later how many were written. That's the delicate part. A user of c_lnotab desiring to find the source line number corresponding to a bytecode address A should do something like this lineno = addr = 0 for addr_incr, line_incr in c_lnotab: addr += addr_incr if addr > A: return lineno lineno += line_incr In order for this to work, when the addr field increments by more than 255, the line # increment in each pair generated must be 0 until the remaining addr increment is < 256. So, in the example above, assemble_lnotab (it used to be called com_set_lineno) should not (as was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to 255, 0, 45, 255, 0, 45. ''' from __future__ import (absolute_import, division, print_function) from nine import IS_PYTHON2 if IS_PYTHON2: int2byte = chr byte2int = ord else: def int2byte(i): return bytes([i]) def byte2int(b): return b def lnotab(pairs, first_lineno=0): """Yields byte integers representing the pairs of integers passed in.""" assert first_lineno <= pairs[0][1] cur_byte, cur_line = 0, first_lineno for byte_off, line_off in pairs: byte_delta = byte_off - cur_byte line_delta = line_off - cur_line assert byte_delta >= 0 assert line_delta >= 0 while byte_delta > 255: yield 255 # byte yield 0 # line byte_delta -= 255 yield byte_delta while line_delta > 255: yield 255 # line yield 0 # byte line_delta -= 255 yield line_delta cur_byte, cur_line = byte_off, line_off def lnotab_string(pairs, first_lineno=0): return b"".join(int2byte(b) for b in lnotab(pairs, first_lineno)) def byte_pairs(lnotab): """Yield pairs of integers from a string.""" for i in range(0, len(lnotab), 2): yield byte2int(lnotab[i]), byte2int(lnotab[i + 1]) def lnotab_numbers(lnotab, first_lineno=0): """Yields the byte, line offset pairs from a packed lnotab string.""" last_line = None cur_byte, cur_line = 0, first_lineno for byte_delta, line_delta in byte_pairs(lnotab): if byte_delta: if cur_line != last_line: yield cur_byte, cur_line last_line = cur_line cur_byte += byte_delta cur_line += line_delta if cur_line != last_line: yield cur_byte, cur_line Kajiki-0.8.2/kajiki/ddict.py0000644000076500000240000000314512554436352015715 0ustar amolstaff00000000000000# -*- coding: utf-8 -*- from __future__ import (absolute_import, division, print_function, unicode_literals) try: from collections import defaultdict except: class defaultdict(dict): def __init__(self, default_factory=None, *a, **kw): if (default_factory is not None and not hasattr(default_factory, '__call__')): raise TypeError('first argument must be callable') dict.__init__(self, *a, **kw) self.default_factory = default_factory def __getitem__(self, key): try: return dict.__getitem__(self, key) except KeyError: return self.__missing__(key) def __missing__(self, key): if self.default_factory is None: raise KeyError(key) self[key] = value = self.default_factory() return value def __reduce__(self): if self.default_factory is None: args = tuple() else: args = self.default_factory, return type(self), args, None, None, self.items() def copy(self): return self.__copy__() def __copy__(self): return type(self)(self.default_factory, self) def __deepcopy__(self, memo): import copy return type(self)(self.default_factory, copy.deepcopy(self.items())) def __repr__(self): return 'defaultdict(%s, %s)' % (self.default_factory, dict.__repr__(self)) Kajiki-0.8.2/docs/0000755000076500000240000000000013567202501013727 5ustar amolstaff00000000000000Kajiki-0.8.2/docs/index.rst0000644000076500000240000000117412554436352015603 0ustar amolstaff00000000000000.. Kajiki documentation master file, created by sphinx-quickstart on Wed Jul 7 22:31:03 2010. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. .. image:: media/Logo.png Welcome to Kajiki's documentation! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. include:: ../README.rst Documentation contents ~~~~~~~~~~~~~~~~~~~~~~ .. toctree:: :maxdepth: 2 templating-basics.rst xml-templates.rst text-templates.rst migrating_from_genshi.rst i18n.rst runtime.rst Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` Kajiki-0.8.2/docs/templating-basics.rst0000644000076500000240000001703412554436352020104 0ustar amolstaff00000000000000.. testsetup:: * import kajiki Kajiki Templating Basics ================================= Kajiki provides two templating engines, one which is useful for generating markup (HTML or XML most likely), and one of which is useful for generating plain text. This document describes the aspects of the two engines that are similar and the basic API for using them. Synopsis -------------- A Kajiki *xml template* is a well-formed XML document that may include one or more custom tags and attributes prefixed by the namespace 'py:'. XML templates also may contain python expressions that will be evaluated at template expansion time as well as processing instructions that may contain Python code. XML templates should be used when generating XML or HTML, as they provide awareness of well-formedness rules and proper escaping. The following is an example of a simple Kajki markup template: .. code-block:: xml This is replaced.

These are some of my favorite fruits:

  • I like ${fruit}s
This template would generate output similar to this (in X(H)ML mode): .. code-block:: xml A Kajiki Template

These are some of my favorite fruits:

  • I like apples
  • I like oranges
  • I like kiwis
or this (in HTML mode): .. code-block:: html A Kajiki Template

These are some of my favorite fruits:

  • I like apples
  • I like oranges
  • I like kiwis
*Text templates*, on the other hand, are plain text documents that can contain embedded Python directives and expressions. Text templates should be used when generating non-markup text format such as email. Here is a simple text template: .. code-block:: none Dear $name, These are some of my favorite fruits: %for fruit in fruts * $fruit %end This would generate something similar to the following: .. code-block:: none Dear Rick, These are some of my favorite fruits: * Apples * Bananas * Pears Python API ------------------------- In order to actually use Kajiki in generating text (either via the XML or the text-based languages), the pattern is as follows: #. Obtain an XMLTemplate or TextTemplate subclass containing the template source. This can either be done directly or via a template loader. #. Instantiate the template with one constructor argument, a dict containing all the values that should be made available as global variables to the template. #. Render the template instance using its render() method (for rendering to a single string) or iterating through it (for "stream") rendering. For instance: >>> Template = kajiki.XMLTemplate('

Hello, $name!

') >>> t = Template(dict(name='world')) >>> t.render() '

Hello, world!

' Using text templates is similar: >>> Template = kajiki.TextTemplate('Hello, $name!') >>> t = Template(dict(name='world')) >>> t.render() 'Hello, world!' You can also use a template loader to indirectly generate the template classes. Using a template loader gives two main advantages over directly instantiating templates: * Compiled templates are cached and only re-parsed when the template changes. * Several template tags such as `extends`, `import`, and `include` that require knowlege of other templates become enabled. Using a template loader would look similar to the following:: loader = PackageLoader() Template = loader.import_('my.package.text.template') t = Template(dict(title='Hello, world!') print t.render() Template Expressions and Code Blocks ------------------------------------------------------- Python expressions can be used in "plain text" areas of templates, including, in XML templates, tag attributes. They are also used in some directive arguments. Whenever a Python expression is used in a "plain text" area, it must be prefixed by a dollar sign ($) and possibly enclosed in curly braces. If the expression starts with a letter and contains only letters, digits, dots, and underscores, then the curly braces may be omitted. In all other cases, they are required. For example: >>> Template = kajiki.XMLTemplate('${items[0].capitalize()}') >>> Template(dict(items=['first', 'second'])).render() 'First' >>> import sys >>> Template = kajiki.TextTemplate('Maxint is $sys.maxsize') >>> Template(dict(sys=sys)).render() 'Maxint is 9223372036854775807' Escaping ^^^^^^^^^^^^^^ If you need a literal dollar sign where Kajiki would normally detect an expression, you can simply double the dollar sign: >>> Template = kajiki.XMLTemplate('$foo') >>> Template().render() Traceback (most recent call last): ... NameError: global name 'foo' is not defined >>> Template = kajiki.XMLTemplate('$$foo') >>> Template().render() '$foo' Code Blocks ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Templates also support full Python syntax, using the processing instruction: .. code-block:: xml
Maxint is $sys.maxint
This will produce the following output: .. code-block:: xml
Maxint is 9223372036854775807
In text blocks, the %py (or {%py%} directive accomplishes the same goal: .. code-block:: none %py import sys Maxint is $sys.maxint This will produce: .. code-block:: none Maxint is 9223372036854775807 In both of the above cases, the Python code runs in the 'local scope' of the template's main rendering function, so any variables defined there will not be accessible in functions or blocks defined elsewhere in the template. To force the python block to run at 'module-level' in XML templates, simply prefix the first line of the Python with a percent (%) sign: >>> Template = kajiki.XMLTemplate('''
${os.path.join('a', 'b', 'c')}${test()}
''') >>> Template().render() '
a/b/c
' In text templates, replace the %py directive with %py%: >>> Template = kajiki.TextTemplate('''%py% import os ... %def test() ... ${os.path.join('a','b','c')}\\ ... %end ... ${test()}''') >>> Template().render() 'a/b/c' Built-in Functions and Variables ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ All templates have access to the following functions and variables: .. function:: literal(x) Wrap some user-generated text so that it doesn't get escaped along with everything else. .. data:: local The current template being defined .. data:: self The current template being defined, or, if used in the context of a parent template that is being extended, the final ("child-most") template in the inheritance hierarchy. .. data:: parent The parent template (via py:extends) of the template being defined .. data:: child The child template (via py:extends) of the template being defined Template Directives -------------------------------------------- Template directives provide control flow and inheritance functionality for templates. As their syntax depends on whether you're using XML or text templates, please refer to :doc:`xml-templates` or :doc:`text-templates` for more information. Kajiki-0.8.2/docs/runtime.rst0000644000076500000240000002634313004733736016161 0ustar amolstaff00000000000000============== Kajiki Runtime ============== .. module:: kajiki :synopsis: Kajiki Runtime APIs It's sometimes good to have a mental model of the Python code that Kajiki creates in order to generate your templates. This document uses several examples taken from the text templating language to illustrate the semantics of Kajiki templates. If in doubt, you can always view the Python text generated for a template by examining the py_text attribute of the generated Template class. .. automethod:: kajiki.xml_template.XMLTemplate .. autoclass:: kajiki.ir.TemplateNode :members: .. automethod:: kajiki.template.Template .. autoclass:: kajiki.template._Template :members: .. autoclass:: kajiki.xml_template._Compiler :members: .. autoclass:: kajiki.xml_template._Parser :members: .. autoclass:: kajiki.xml_template._DomTransformer :members: Basic Expressions ========================= Let's start with a hello world template: .. code-block:: none Hello, World! This converts to the equivalent Python:: @kajiki.expose def __call__(): yield 'Hello, World!\n' Slightly more verbose "hello_name.txt": .. code-block:: none Hello, $name! This converts to the equivalent Python:: @kajiki.expose def __call__(): yield 'Hello, ' yield name yield '!\n' By default, the $-syntax picks up any identifiers following it, as well as any periods. If you want something more explicit, use the extended expression form as in "hello_arithmetic.txt": .. code-block:: none Hello, 2 + 2 is ${2+2}! This converts to:: @kajiki.expose def __call__(): yield 'Hello, 2 + 2 is ' yield 2+2 yield '!' If you wish to include a literal $, simply prefix it with a backslash. Control Flow ============ Kajiki provides several tags that affect the rendering of a template. The following template "control_flow.txt" illustrates: .. code-block:: none A{%for i in range(5)%} {%if i < 2%}Low{%elif i < 4%}Mid{%else%}High{%end%}$i {%switch i % 2%} {%case 0%} even {%default%} odd {%end%}{%end%}{%end%} This yields the following Python:: @kajiki.expose def __call__(): yield 'A\n' # from the {%for... line for i in range(10): yield '\n ' # from the newline and initial indent of next line if i < 2: yield 'Low' elif i < 4: yield 'Mid' else: yield 'High' yield i yield '\n ' # from the {%if... newline and next indent local.__kj__.push_switch(i%2) # whitespace after {%switch is always stripped if local.__kj__.case(0): yield '\n even\n ' else: yield '\n odd\n ' local.__kj__.pop_switch() Which would in turn generate the following text: .. code-block:: none A Low0 even Low1 odd Mid2 even Mid3 odd High4 even If you want to strip whitespace before or after a tag, just replace ``{%`` with ``{%-`` (for stripping leading whitespace) or ``%}`` with ``-%}`` (for stripping trailing whitespace). If you would like to remove newlines, just end a line with a backslash. Here is the equivalent template with whitespace removed, "control_flow_ws.txt": .. code-block:: none A{%-for i in range(5) -%}\ {%-if i < 2%}Low{%elif i < 4%}Mid{%else%}High{%end%}$i {%-switch i % 2%}\ {%-case 0%}\ even {%-default%}\ odd {%-end%}\ {%-end%}\ {%-end%}\ This would generate the following Python:: @kajiki.expose def __call__(): yield 'A' for i in range(10): if i < 2: yield 'Low' elif i < 4: yield 'Mid' else: yield 'High' yield i yield '\n' local.__kj__.push_switch(i % 2) if local.__kj__.case(0): yield 'even\n' else: yield 'odd\n' local.__kj__.pop_switch() Which would generate the following text: .. code-block:: none ALow0 even Low1 odd Mid2 even Mid3 odd High4 even which is probably closer to what you wanted. There is also a shorthand syntax that allows for line-oriented control flow as seen in "control_flow_ws_short.txt": .. code-block:: none A\ %for i in range(5) %if i < 2 Low\ %elif i < 4 Mid\ %else High\ {%-end%}$i %switch i % 2 %case 0 even %default odd %end %end %end This syntax yields exactly the same results as "control_flow_ws.txt" above. Python Blocks ============== You can insert literal Python code into your template using the following syntax in "simple_py_block.txt": .. code-block:: none {%py%}\ yield 'Prefix' {%end%}\ Body or alternatively: .. code-block:: none %py yield 'Prefix' %end Body or even more succinctly: .. code-block:: none %py yield 'Prefix' Body all of which will generate the following Python:: def __call__(): yield 'Prefix' yield 'Body' Note in particular that the Python block can have any indentation, as long as it is consistent (the amount of leading whitespace in the first non-empty line of the block is stripped from all lines within the block). You can insert module-level Python (imports, etc.) by using the %py% directive (or {%py%%} as in "module_py_block.txt": .. code-block:: none %py% import sys import re %end Hello %py% import os %end This yields the following Python:: import sys import re import os @kajiki.expose def __call__(): yield 'Hello' Functions and Imports ==================================== Kajiki provides for code reuse via the %def and %import directives. First, let's see %def in action in "simple_function.txt": .. code-block:: none %def evenness(n) %if n % 2 == 0 even\ %else odd\ %end %end %for i in range(5) $i is ${evenness(i)} %end This compiles to the following Python:: @kajiki.expose def evenness(n): if n % 2: yield 'even' else: yield 'odd' @kajiki.expose def __call__(): for i in range(5): yield i yield ' is ' yield evenness(i) The %import directive allows you to package up your functions for reuse in another template file (or even in a Python package). For instance, consider the following file "import_test.txt": .. code-block:: none %import "simple_function.txt" as simple_function %for i in range(5) $i is ${simple_function.evenness(i)} %end This would then compile to the following Python:: @kajiki.expose def __call__(): simple_function = local.__kj__.import_("simple_function.txt") for i in range(5): yield i yield ' is ' yield simple_function.evenness(i) Note that when using the %import directive, any "body" in the imported template is ignored and only functions are imported. If you actually wanted to insert the body of the imported template, you would simply call the imported template as a function itself (e.g. ${simple_function()}). Sometimes it is convenient to pass the contents of a tag to a function. In this case, you can use the %call directive as shown in "call.txt": .. code-block:: none %def quote(caller, speaker) %for i in range(5) Quoth $speaker, "${caller(i)}." %end %end %call(n) quote('the raven') Nevermore $n\ %end This results in the following Python:: @kajiki.expose def quote(caller, speaker): for i in range(5): yield 'Quoth ' yield speaker yield ', "' yield caller(i) yield '."' @kajiki.expose def __call__(): @kajiki.expose def _fpt_lambda(n): yield 'Nevermore ' yield n yield quote(_fpt_lambda, 'the raven') del _fpt_lambda Which in turn yields the following output: .. code-block:: none Quoth the raven, "Nevermore 0." Quoth the raven, "Nevermore 1." Quoth the raven, "Nevermore 2." Quoth the raven, "Nevermore 3." Quoth the raven, "Nevermore 4." Includes =============== Sometimes you just want to pull the text of another template into your template verbatim. For this, you use the %include directive as in "include_example.txt": .. code-block:: none This is my story: %include "call.txt" Isn't it good? which yields the following Python:: @kajiki.expose def __call__(): yield 'This is my story:\n' yield _fpt.import("simple_function.txt")() yield 'Isn't it good?\n' Which of course yields: .. code-block:: none This is my story: Quoth the raven, "Nevermore 0." Quoth the raven, "Nevermore 1." Quoth the raven, "Nevermore 2." Quoth the raven, "Nevermore 3." Quoth the raven, "Nevermore 4." Isn't it good? Inheritance ============== Kajiki supports a concept of inheritance whereby child templates can extend parent templates, replacing their methods and "blocks" (to be defined below). For instance, consider the following template "parent.txt": .. code-block:: none %def greet(name) Hello, $name!\ %end %def sign(name) Sincerely, $name\ %end ${greet(to)} %block body It was good seeing you last Friday. Thanks for the gift! %end ${sign(from)} This would generate the following Python:: @kajiki.expose def greet(name): yield 'Hello, ' yield name yield '!' @kajiki.expose def sign(name): yield 'Sincerely,\n' yield name @kajiki.expose def _fpt_block_body(): yield 'It was good seeing you last Friday! Thanks for the gift!\n' @kajiki.expose def __call__(): yield greet(to) yield '\n\n' yield self._fpt_block_body() yield '\n\n' yield sign(from) Here is the corresponding "child.txt": .. code-block:: none %extends "parent.txt" %def greet(name) Dear $name:\ %end %block body ${parent_block()}\\ And don't forget you owe me money! %end This would then yield the following Python:: @kajiki.expose def greet(name): yield 'Dear ' yield name yield ':' @kajiki.expose def _fpt_block_body(): yield parent._fpt_block_body() yield '\n\n' yield 'And don\'t forget you owe me money!\n' @kajiki.expose def __call__(): yield local.__kj__.extend(local.__kj__.import_('parent.txt')).__call__() The final text would be (assuming context had to='Mark' and from='Rick': .. code-block:: none Dear Mark: It was good seeing you last Friday! Thanks for the gift! And don't forget you owe me money! Sincerely, Rick Kajiki-0.8.2/docs/Makefile0000644000076500000240000001110112554436352015371 0ustar amolstaff00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" upload: html rsync -cavz _build/html/* rick446,kajiki@web.sourceforge.net:htdocs clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Kajiki.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Kajiki.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/Kajiki" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Kajiki" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." make -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." Kajiki-0.8.2/docs/include/0000755000076500000240000000000013567202501015352 5ustar amolstaff00000000000000Kajiki-0.8.2/docs/include/index.html0000644000076500000240000000267412554436352017370 0ustar amolstaff00000000000000 Welcome to TurboGears 2.0, standing on the shoulders of giants, since 2007 ${sidebar_top()}

Presentation

TurboGears 2 is rapid web application development toolkit designed to make your life easier.

  1. Code your data model

    Design your data model, Create the database, and Add some bootstrap data.

  2. Design your URL architecture

    Decide your URLs, Program your controller methods, Design your templates, and place some static files (CSS and/or JavaScript).

  3. Distribute your app

    Test your source, Generate project documents, Build a distribution.

Thank you for choosing TurboGears.
Kajiki-0.8.2/docs/include/master.html0000644000076500000240000000451512554436352017550 0ustar amolstaff00000000000000 Your title goes here ${header()}
Now Viewing:
${footer()}
Kajiki-0.8.2/docs/include/layout.html0000644000076500000240000000341212554436352017565 0ustar amolstaff00000000000000 Your title goes here

My Header

Now Viewing:
Your body text goes here ${footer()}
Kajiki-0.8.2/docs/include/index_kajiki.html0000644000076500000240000000274612554436352020712 0ustar amolstaff00000000000000 Welcome to TurboGears 2.0, standing on the shoulders of giants, since 2007 ${parent_block()}

Some extra header data

${sidebar_top()}

Presentation

TurboGears 2 is rapid web application development toolkit designed to make your life easier.

  1. Code your data model

    Design your data model, Create the database, and Add some bootstrap data.

  2. Design your URL architecture

    Decide your URLs, Program your controller methods, Design your templates, and place some static files (CSS and/or JavaScript).

  3. Distribute your app

    Test your source, Generate project documents, Build a distribution.

Thank you for choosing TurboGears.
Kajiki-0.8.2/docs/conf.py0000644000076500000240000001602013475175545015244 0ustar amolstaff00000000000000# -*- coding: utf-8 -*- # # Kajiki documentation build configuration file, created by # sphinx-quickstart on Wed Jul 7 22:31:03 2010. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os from kajiki import version as _version # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.append(os.path.abspath('..')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo', 'sphinx.ext.viewcode'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Kajiki' copyright = u'2010-2019, Rick Copeland, Nando Florestan and Alessandro Molina' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = _version.__version__ # The full version, including alpha/beta/rc tags. release = _version.__release__ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. html_favicon = 'favicon.ico' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = '' # Output file base name for HTML help builder. htmlhelp_basename = 'Kajikidoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'Kajiki.tex', u'Kajiki Documentation', u'Rick Copeland', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'kajiki', u'Kajiki Documentation', [u'Rick Copeland'], 1) ] Kajiki-0.8.2/docs/_static/0000755000076500000240000000000013567202501015355 5ustar amolstaff00000000000000Kajiki-0.8.2/docs/_static/favicon.ico0000644000076500000240000001027612554436352017514 0ustar amolstaff00000000000000  ¨( @ 4úðW öïàcÿó®w%ÿ#ÿ3Ír ÿ^#Æ’Ôk ÿLâ‡Ègÿ+þÖØSÿfÿÒã+|Öül.ÿTÿFÿùð‡œá«±ä~nõk^OÿÿÿjÿtÿKÿî¢Û‰;™é¦°²›ÿÿÿóÿ(ÿûáÊÖð3ÿ€ ÿVÿ?!ýºßKK2½Ñã55*á³µ­ÿþüúÿ$ÿ ÿô*Ž×«Ê°ßÛ­®˜ÿ€oò’“xÿÿÿÿÿöíéÿÿÿÙ‰å))óûýçÿÿÿûÿÿÿÿÿëçàÿÿÿõº0ÝÕ¹º¬ÿþþþÿÿÿÿÿôñíÿÿÿ ß…æ¿Çô'("øÿÿÿÿþþþÿÿÿÿÿüü÷ÿ'ÿ ÿïè3×êÿ—›†ÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿ3 ÿ ÿÿë:â&ùÓÀÄÃÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿSÿÿÿÝ+–n ?8ÿp12ÿþþþÿýýýÿÿÿÿÿÿÿÿÿ^+"ÿÿÿæä€CÏ3ÿn03ÿÿÿÿÿÿÿÿÿÿÿÿÿX&ÿÿ ÿõÜ0õQ ÿ;ÿÞ³·ÿþÿÿÿÿÿÿÿV'ÿÿÿþì0Þ#$ìÿÿÿÿþýþÿÿÿÿÿÿÿÿÿC(ÿÿÿ ÿû)5êÄɧÿñùôÿÿÿÿÿÿÿýÿ?ÿÿÿÿÿ'†hg_ì»¶­ÿÿÿÿÿ³¢Œÿÿÿÿÿ²Š×šiÿpREÿ2ÿÿÿÿÿóØ• Š:!ÿÿþýÿÿ,ÿA3×y1Éþåæxxâ$Þ^ÿ[ÿÜ,éö¦éÖÀ‘ÖÜÿ‹áÔ+„‘ÿÿþÿÿþÿÿüÿÿüÿÿüÿÿü?ÿÿü?ÿÿü?ÿÿüÿÿøÿÿÀÿý€ÿøÀÿøÿÿðÿÿàÿþÿþÿü?ÿú?ÿøÿøÿÿðÿÿðÿÿàÿÿàÿÿÀÿÿÃÿÿ‡‡ÿÿÿÿÿ?ÿÿÿ?ÿÿÿKajiki-0.8.2/docs/i18n.rst0000644000076500000240000000353512554436352015256 0ustar amolstaff00000000000000==================== Internationalization ==================== Kajiki provides supporting infrastructure for internationalizing and localizing templates. This includes functionality for extracing localizable strings from templates, as well as translation of localizable strings. Basics ======= To internationalize and translate templates, other templating solutions require that you wrap all localizable strings in a `gettext()` function call (usually aliased to `_()` for brevity). In this case, you would write your templates similar to the following: .. code-block:: xml

${_('Hello, world!')}

This approach, however, adds lots of noise to your templates. Kajiki does not require that you wrap localizable strings since it automatically finds all "translatable text" in XML templates (any text outside of an XML tag). In order to actually use translation, you must replace the placeholder function in `kajiki.i18n.gettext` with the actual gettext function. For instance, you might place the following in your top-level script to enable the Python gettext module:: from gettext import gettext from kajiki import i18n i18n.gettext = gettext Extraction ===================== Kajiki also provides support for extracing all localizable strings found in a template. This functionality is integrated with the excellent message extraction framework provided by the Babel_ project. Typically, you would notify Babel of the location of your templates before running the extraction routine: .. code-block:: none # Python source [python:**.py] # Kajiki Templates [kajiki:**/templates/**.html] Please consult the Babel documentation for further details. If all goes well, the extraction process should create a POT file containing the strings from your Kajiki templates and your Python source files. .. _Babel: http://babel.pocoo.org/ Kajiki-0.8.2/docs/text-templates.rst0000644000076500000240000001743512554436352017463 0ustar amolstaff00000000000000.. testsetup:: * import kajiki ================================== Kajiki Text Templates ================================== Kajiki provides a full-featured text template engine in addition to the XML templating engine for cases where you don't want to necessarily generate markup. This document describes that language. Templates are text files that include template directives that control how the template is rendered and expressions that are substituted into the generated text at render time. Please see :doc:`templating-basics` for general information on embedding Python code in templates. Basic Expressions ========================= Let's start with a hello world template: >>> Template = kajiki.TextTemplate('Hello, $name!') >>> print(Template(dict(name='world')).render()) Hello, world! By default, the $-syntax picks up any identifiers following it, as well as any periods. If you want something more explicit, use the extended expression form as follows: >>> Template = kajiki.TextTemplate('Hello, 2+2 is ${2+2}') >>> print(Template().render()) Hello, 2+2 is 4 If you wish to include a literal $, simply double it: >>> Template = kajiki.TextTemplate('The price is $$${price}') >>> print(Template(dict(price='5.00')).render()) The price is $5.00 Control Flow ============ Kajiki provides several directives that affect the rendering of a template. This section describes the various directives. Directives in text templates can either be enclosed by `{% ... %}` characters or they can exist on a line by themselves prefixed by a `%`. Template directives must always be terminated by an 'end' directive (either `{%end%}` or `%end`. .. note:: Whitespace can sometimes be tricky in text templates. Kajiki provides a bit of help in managing it. First, if you wish to break a line without having the newline included in the generated text, simply end the line with a backslash (\). Kajiki will also remove any whitespace before a tag that begins with the delimiter `{%-`. Directives that appear on their own line via the `%` prefix never appear in the output, and neither they do not generate any whitespace. %if, %else ^^^^^^^^^^^^^^^ Only render the enclosed content if the expression evaluates to a truthy value: >>> Template = kajiki.TextTemplate('{%if foo %}bar{%else%}baz{%end%}') >>> print(Template(dict(foo=True)).render()) bar >>> print(Template(dict(foo=False)).render()) baz %switch, %case, %else ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Perform multiple tests to render one of several alternatives. The first matching `case` is rendered, and if no `case` matches, the `else` branch is rendered: >>> Template = kajiki.TextTemplate('''$i is \ ... {%switch i % 2 %}{%case 0%}even{%else%}odd{%end%}''') >>> print(Template(dict(i=4)).render()) 4 is even >>> print(Template(dict(i=3)).render()) 3 is odd %for ^^^^^^^^^^^^^ Repeatedly render the content for each item in an iterable: >>> Template = kajiki.TextTemplate('''%for i in range(3) ... $i ... %end''') >>> print(Template().render(), end='') 0 1 2 %def ^^^^^^^^^^^^^^ Defines a function that can be used elsewhere in the template: >>> Template = kajiki.TextTemplate('''%def evenness(n) ... {%-if n % 2 == 0 %}even{%else%}odd{%end%}\\ ... %end ... %for i in range(2) ... $i is ${evenness(i)} ... %end''') >>> print(Template().render(), end='') 0 is even 1 is odd %call ^^^^^^^^^^^^^^^^^^ Call a function, passing a block of template code as a 'lambda' parameter. Note that this is a special case of calling when you wish to insert some templated text in the expansion of a function call. In normal circumstances, you would just use `${my_function(args)}`. >>> Template = kajiki.TextTemplate('''%def quote(caller, speaker) ... %for i in range(2) ... Quoth $speaker, "${caller(i)}." ... %end ... %end ... %call(n) quote(%caller, 'the raven') ... Nevermore $n\\ ... %end''') >>> print(Template().render(), end='') Quoth the raven, "Nevermore 0." Quoth the raven, "Nevermore 1." %include ^^^^^^^^^^^^^^^^^^^^^^^^ Includes the text of another template verbatim. The precise semantics of this tag depend on the `TemplateLoader` being used, as the `TemplateLoader` is used to parse the name of the template being included and render its contents into the current template. For instance, with the `FileLoader`, you might use the following: .. code-block:: none %include "path/to/base.txt" whereas in the `PackageLoader` you would use .. code-block:: none %include package1.package2.base %import ^^^^^^^^^^^^^^^^^^^^^^ With `%import`, you can make the functions defined in another template available without expanding the full template in-place. Suppose that we saved the following template in a file `lib.txt`: .. code-block:: none %def evenness(n) %if n % 2 == 0 even\ %else odd\ %end %end Then (using the `FileLoader`) we could write a template using the `evenness` function as follows: .. code-block:: none %import "lib.txt" as lib %for i in range(5) %i is ${lib.evenness(i)} %end Inheritance (%extends, %block) ======================================== Kajiki supports a concept of inheritance whereby child templates can extend parent templates, replacing their "methods" (functions) and "blocks" (to be defined below). For instance, consider the following template "parent.txt": .. code-block:: none %def greet(name) Hello, $name!\ %end %def sign(name) Sincerely, $name\ %end ${greet(to)} %block body It was good seeing you last Friday. Thanks for the gift! %end ${sign(from_)} This would render to the following (assuming a context of `dict(to=Mark, from_=Rick)`: .. code-block::none Hello, Mark! It was good seeing you last friday. Thanks for the gift! Sincerely, Rick Now we can extend "parent.txt" with "child.txt": .. code-block:: none %extends "parent.txt" %def greet(name) Dear $name:\ %end %block body ${parent_block()}\ And don't forget you owe me money! %end Rendering this template would then give us: .. code-block:: none Dear Mark: It was good seeing you last Friday! Thanks for the gift! And don't forget you owe me money! Sincerely, Rick Notice how in the child block, we have overridden both the block "body" and the function "greet." When overriding a block, we always have access to the parent template's block of the same name via the `parent_block()` function. If you ever need to access the parent template itself (perhaps to call another function), kajiki provides access to a special variable in child templates `parent`. Likewise, if a template is being extended, the variable `child` is available. Kajiki also provides the special variables `local` (the template currently being defined) and `self` (the child-most template of an inheritance chain). The following example illustrates these variables in a 3-level inheritance hierarchy: >>> parent = kajiki.TextTemplate(''' ... %def header() ... # Header name=$name ... %end ... %def footer() ... # Footer ... %end ... %def body() ... ## Parent Body ... id() = ${id()} ... local.id() = ${local.id()} ... self.id() = ${self.id()} ... child.id() = ${child.id()} ... %end ... %def id() ... parent\\ ... %end ... ${header()}${body()}${footer()}''') >>> mid = kajiki.TextTemplate('''%extends "parent.txt" ... %def id() ... mid\\ ... %end ... ''') >>> child = kajiki.TextTemplate('''%extends "mid.txt" ... %def id() ... child\\ ... %end ... %def body() ... ## Child Body ... ${parent.body()}\\ ... %end ... ''') >>> loader = kajiki.MockLoader({ ... 'parent.txt':parent, ... 'mid.txt':mid, ... 'child.txt':child}) >>> Template = loader.import_('child.txt') >>> print(Template(dict(name='Rick')).render(), end='') # Header name=Rick ## Child Body ## Parent Body id() = child local.id() = parent self.id() = child child.id() = mid # Footer Kajiki-0.8.2/docs/migrating_from_genshi.rst0000644000076500000240000001122012554436352021026 0ustar amolstaff00000000000000Migrating from Genshi ====================================== Kajiki uses syntax derived from the syntax of Genshi_. In particular, the following directives are supported, with semantics intended to be nearly identical to those of Genshi_. * ``py:def`` * ``py:choose`` -- renamed ``py:with`` * ``py:when`` -- renamed ``py:case`` * ``py:otherwise`` -- renamed ``py:else`` * ``py:for`` * ``py:if`` * ``py:with`` * ``py:replace`` * ``py:content`` * ``py:attrs`` * ``py:strip`` * ``xi:include`` -- renamed ``py:include`` Note that, in particular, ``py:match`` is not supported. But Kajiki supports the following additional directives: * ``py:extends`` - indicates that this is an extension template. The parent template will be read in and used for layout, with any ``py:block`` directives in the child template overriding the ``py:block`` directives defined in the parent. * ``py:block`` - used to name a replaceable 'slot' in a parent template, or to specify a slot override in a child template. The ``py:block`` semantics are modeled after the ``{% block %}`` semantics of Jinja2_. Generally, migration consists of a few steps that can be simple or quite difficult based on your fondness of the ``py:match`` directive in Genshi. In simple cases where you have one ``master.html`` template with a few ``py:match`` directives that is ``xi:included`` into all your page templates, the following steps should suffice: * Rename tags and attributes as indicated above; e.g. ``xi:include`` becomes ``py:include``. * Rewrite your *include* directives to use Kajiki's module naming system and relative imports. * In a simple case where you have only a few ``py:match`` directives, all of which are in a ``master.html`` template that is being included from child templates, I recommend that you rewrite the ``master.html`` as ``layout.html``, defining named ``py:block`` regions that will be overridden in child templates. * In your child templates, remove the ```` that probably lurks near the top. Then add a ``py:extends`` directive to the top-level tag (usually ````). The tag the parts of the child template that are intended to override parts of the parent template with the ``py:block`` directive. Kajiki also provides some helper functions of Genshi: * ``defined('some_variable')`` (which returns True if 'some_variable' exists in the template context), * ``value_of('name', default_value)``, and * ``Markup(some_string)`` (which marks a string so it won't be escaped in the output), though Kajiki prefers to call this ``literal(some_string)``. Example Migration --------------------------------- Suppose you have a couple of Genshi templates, one of which called ``master.html`` and one of which is ``index.html``. (TurboGears developers may recognize these files as slightly modified versions of the default templates deposited in a TG quickstarted project.) The contents of ``master.html`` are: .. literalinclude:: include/master.html :linenos: :language: html Likewise, the contents of ``index.html`` are as follows: .. literalinclude:: include/index.html :linenos: :language: html In order to perform our kajiki migration, we begin by creating two empty templates. The first one will replace our ``master.html``, and we will call it ``layout.html``: .. literalinclude:: include/layout.html :linenos: :language: html Note the introduction of the ``py:block`` directive, and the disappearance of the ``py:match`` directives from ``master.html``. ``py:block`` mimics the behavior of Jinja2 "blocks", providing a name to a construct in a parent template which can be replaced by the contents of ``py:block`` -named constructs in child templates. For instance, the "title" slot in ``layout.html``: .. literalinclude:: include/layout.html :linenos: :language: html :lines: 8 can be replaced by a similarly-named slot in the child document ``index_kajiki.html``: .. literalinclude:: include/index_kajiki.html :linenos: :language: html :lines: 1-8 We also provide a way of including the contents of the parent template's slot in a child template's slot using ``${parent_block()}``. The following slot in ``layout.html``: .. literalinclude:: include/layout.html :linenos: :language: html :lines: 16 can be replaced in ``include/index_kajiki.html`` with: .. literalinclude:: include/index_kajiki.html :linenos: :language: html :lines: 9-12 Yielding the following html once rendered: .. code-block:: html :linenos:

My Header

Some extra header data

.. _Genshi: http://genshi.edgewall.org/ .. _Jinja2: http://jinja.pocoo.org/2/documentation/ Kajiki-0.8.2/docs/media/0000755000076500000240000000000013567202501015006 5ustar amolstaff00000000000000Kajiki-0.8.2/docs/media/Maind_u0.gif0000644000076500000240000003050612554436352017145 0ustar amolstaff00000000000000GIF87a€àçªUUªªUUªUUªÿªªªUUUUUÿUUUÿÿUªUªªÿÿª 0€¨@@¨  (@ ƒ‚(ƒP  €@u@§ƒƒ (P@§ƒ¢‚§ƒ¢}§ƒÌƒÍ̓Í €Ì Í€ÿÿÿ,€àþH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊ< ¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕœ¯jÝʵ«×¯`ÊK¶¬Y¯YϪ]˶­Û·pãÊ5-Ý»xóêÝË·¯_³vÿ L¸°áÈÅN̸±ãÇ#ë],¹²å˘3kJy³çÏ C‹ÆÛy´éÓ¨S«nZzµë×°cn-»¶íÛ¸ÓÎÍ»·ïßcwN¼¸ñ£Â+_μxòæÐ£Kwý|ºõëØ/WÏν»wÁÛ¿þ‹O¾møòèÓ«×z~½û÷ð‘ŒO¿¾ý¤íïëߟ>?ÿÿfç_€¸Ü€&¨`o.èàƒ¯5ᄆ&a…fXÙ…vèáa~(âˆ{…Hâ‰(¾ebŠ,¶Ü|.Æ(ãd0Îhãn­ˆãŽ<¥c@¹ÓB)$‘F&¹#’J6)#“NF™"”RV)"•Vf™!–Zv !—^†™ ˜b– ™f¦yšj¶ ›nÆÙ_rÖ9"œvæÉžzö9Ÿ~Ê ‚ê†&z&¢Š6º&£ŽFú&¤’V:§@–fꡚv*§ž†º¨¢–j©¦¦úªª¶Š«þ®Æª¥²ÖЬ¶æJ­ºöº®¾k¯Â °Æ&«±Ê6»!³ÎFë²ÒV;µÖfë¶Úv‹´Þ†›·â– ¹æ¦;$¸ê¶«ºîº o¼êÎK¯¹öÞ+n¾úzËo¿Úþ °µ,mÁ;‹pÂÊ.̰±?,lÄûJqź^Œ±­o,kÇ» rȪŽL²©&Ÿ,jÊ*{ÊrËš¾ ³¥2Ï,iÍ6;ŠsÎJ €€Ï@3µ3ÏA@ø¼-»D7ûóÏH'ÀSC7m£ÑQ? UÕV»ø´Qð³T\w"ÖaM6ÓfËúõÑi @UÙmwè3ÒwÇ]þÝuWø4Þpg-÷Þl÷í)Úy ~߆+ø6àa‹=¸UŒ7^à×Q'Ž´Ú‹ny£Fƒ ¹Þ[Uþù~¡gøæ“³çù邿-ºÔ‘s^úë°÷);ÜšKþ•鹿÷7í›Gž4XÀ¯Þð‰C¶Ò¿ã®|›Ìî¼êa%?ýxÕ nüÔÙK¿}˜ˆ¯>»âác:¾¡h‹ýüêx¿¨þˆA¯?Vû×»9ôéðáÛF³Xîf½óåosdÑcÆV€ÜÍààVdǺ¸}¯uÈŸ}÷uМ ï2·¿ –E†ÁZ9è»Vew£‹aæ£Aø° ”WèBªÀ°xþª3ÿäç? P‡Üa{(•æy/kÆÛYP(˜"у;"™Ò<Ñåï€-qï#zʘÅâðh\#¯7;Í/mqœŸ‚ˆÅ$ÚqljÔ#Q€DâÉ}4¤ÉB3ÞQ‡yTdQøh½÷EÑvb”äåêxI;‚p‰š4Êߨ?!f2r yÊR2•›l#Þ,èJ¶PQ/W´¤!s(L)â2(Ó\#wùÉDq–¬¤‹ Âc…‘Ìâ#Y7,Qþ‡–Á §)iÍž`Ó‘«¼à+CYDS˜hD#*˹“ò=—ûþ['; TLxúS‰¤'O’i>óE±~¾Œev*Ìi¡½ A èÉ|:sŸî4¥8K™E<^ô˜ÉL>[7}b@ï$¥-Ç͈Þäœ~)ë@Èvþ§ŸÍé!‘øÑTž“¤1"zúL1ôÝ©R#úÓtnÓg0éIùO¥rt¥ÓtéDG ?©E5.¿„KJm Oö“¨[ ©×ú½¨¢uYÞ¬NɪSbN¢¸Äœ ÿøGÉ U.auËQ¯ZHßq”¦Š„iA+ú¼¡J5’6½OU ;X¬òð˜ø«fóùUÀ*4:cµ«e KW²âle%í›Ð¸Â知þ­lWxWÖ†P­%¼çfß K׺§²¤ í­j[ûéÕ‘ÈíÔ´¨¢Ï6g£Ã½jÐ(ÎâN¯©›…"/[ÓýÀV¶Àn¨µë~1µÔ­u»{ŸY~÷oÑ- ‡ßÐÁ®}"ÕmzÉÛ©ÒºÁ¦p…KZ»~Írˆ*c“›Ï¬íÊ·é¡du‰ÉÓïÒ—–¦¯äÈÛ߇ýl¨iË.r[¹^öʵ®Ãto…WŒT«Æ6¾¶¯Ê–[@®Ö®ãr®r ;]øNÆáçYÍz×4XbÎ3¨~•¹dî®%°f‘°‹%,à*_ÒÊ/Î0†Ëa€y±‹uã2Klâø¼·Œ˜¤òþ•×|FXÃâ¥rèŽì- j÷Î#6 \ž ×UÅdMs•ýhS¸Ð„…³<É«­Nî—ÉÚ|´“Ÿ¬ãâHùТnD0ƺÑ0V4KÊèd%¹\Eoïe²œÑ )€@d-kÔš&?ÞpGYÌæÙæ:Ô[ž³ŒeõåeæWÌٌߞ#»÷þY¹µ­i=j#mÚ™2C?ÍéDÛÐ].•“æGNšÒ|HZ»ÛÖ³~w¼§mmx×ûÚ¸Þö®Aíí!S׬Â>·~HÒ‚Ãïà†,}Î\w_ûÞ`›­¡4DœÖ·÷¼áÝPÿúãq6´¨þžð09Ò(?/KTiàZÚw8lMYS¼æ§¹èf>qƒ ÄÖ:¶ëí~wºßH¹œ§S#ûØÉ£À˼žêVûê·úÅEqHœë¿8Å-µšÇæ÷¾7ÇÂé\ÃWËþβ¢ßV&TïµÜPç&ËÓía¶{èC·yÍ0sÚûá8Æ“öó®7^ñØÖx¼ÕNô…ôúí¢FñluÝæaG‰àqïŽÇ—Vƒ…ݳž7âŸß‰S;ñG<¾…Nˆ>›¢ üëiø×¤ÍûNºæÅ»aÏéäPW9ž×Ó…ð‡xئýõ´“ýðö>½aþ?ô­“}ì6?»ä‰.{ÅKû ?Váæl–VwÎ=²;ƒ›Üש£›ÙèÁúáEêóÖó>üf·s¹'k@W8xðtp{„'v´vÿ©Çq»w~Ñft 7|oV|tç" ·`Aµr¥×r¼Qmi§_ÕçnuÈz}4m·‡l-H{¹':yæç´Gyk÷{Á÷bß–hpg|âD’&z]Å\†âmôÆuþ׃×ösPhƒShx‡7Hq»ô„®Ù÷€7†P¸‚½çp©5‘§‚ |öoE¦˜!ØÄG©bßóÎç:ºG}¨†k·zÈ–xÛ·{O¨†þˆˆ;9~ÈLVx…Š'g·xû×{iXt&`îGdJGgb‡xÆW2µj{Ç„Ýñw‡÷ˆ³†ç³Šl({g8~Gˆ°Èƒ“ˆ}Yhw؈”øŠ˜†<ˆÝÆ~›7_Kç ÅJxWJ¸„ù‡ub–‚“÷pW‰ˆ¸}—H‰¸†´ŒWˆ¶˜u®—lÇÖŠ:h‹Rˆ}§yµ´~GDf6TcQGQÆÆ|zH‚²a‚‡€Xk\è…øÖn׸xWˆß8‹ã—(‹h8‹æ—‚\XŽù¥}æ‹jg‰ !_6wÍ0elª–„ðØ\|WÇŠµh†×ØØ¨zâØèþ{9)i‰å{½sÓè’‡¸uH„È“ä· Ajqhd‘`ö·Ýi!ˆr›ÓY~±‡kÓ“G“ã¨zsû{Ù‘G‰t¯Œ”׋܈–Ù•éˆky…Ügˆlhy@&7DQE@‘ŒG8fÌøW÷X’²†ðx‰‹úh‘gx–1ù‹9i8 ŒAé:y‹eه⧃7uê˜u⨕‡îW^p‘—{¹”xq\’èTy§LÉjø¨Ðx˜]è‹7)t´ˆ¸™¸9{¹i}Œx™dY“@Yœ6i‚› ŽñFqV¨ŠçxŸ)š AÖ)˜‚…šyþ©štÑ€cFõ˜d³B˜‡²x?–Y™Z9}éYäg–àˆƒÌœñÉŽ‰ƒéžë¹™;x†ÿ(RׇŸ‰™œ=Xl‘`{™šz)•‡U'çTœ$D3³yÙè}È©˜ŠùºÇž»‰–)–‡ŸQ4–ŠŽ)Ÿ œ(*¹9q5¸K1:Ž+: ºù{a¡ š  ZøD›²IžÀA“Œ7€‰† ù™Ó§¡‰h/ZœˆoIŸ)Ê’(ºˆíy¥q)œ¾8kÕçœIŽê)“4¡J¹ kÊ£JyË…‡!¨KcFT©ª×™L*oÝ{åÇž€ºŸ¥þ8™Ÿ‡˜ƒdy¨À( cY¢ø©ˆVŠ¥0ù¤o Žvç“Qú›’§#:Ú©J¹—=ú^ôDå& i§z,4y˜¹§¾·•`J–_Wˆ6o9«úšîù§ü©¨\ú¨Y‹Vz¢Ä™©Ç©Ž$—Ûg›ŽhŽÄ¹© Ò¦Û¹ ;Ê£y9G¤wŠxè`ãiŠÆ1Œg}—èªb ©¹¥_çzO~H¦«èœóY¬ê§3)oŒŠ¨ò‹;)—ùúž‰j¨YÚ}µ7œŠ£Bá©Ôº°° Uð¦~Á;Ž6§áÉW¨j¤·’x[‹ÐÈ›ÇzO¸ê}7x•º%yw2Jk(kk(þ‰Ó·²¹¯ÃEP:¢Žj<‘šœ9é•À*©”Jo˜ÚŸÐ ® ­ÒZ­Ôú© ›`|Ac¤:¤È•DZ¤D{¤ÝG²›*—‘ª‚+‘9x©eê€p‡²¢ó°Ø²æ˜•f{lli¬T:‰7k¢5šƒó¢8›¢ù·—‰·+˜MÊZ¥Zë¦˰ š`Ië°KËíBjªäHNᵑ§)ط˹¬ì ”˜jƒ#˪cû3dKº¬ú3¤‹d‹9m;¶\×¶"E¶вH³`Ó²¶ËWÖø¬ª™%ê«3K©š·j °¿Û«v[©H;ʦzÉ£ë°Kk þº¦«Ø;@#4:ºÄ­OUwÊ[H‘鈞^ˆjòç“싺Àº‡I¶ Ûºª¿õ+¿¨;¶«{ºqú“Aq²[¶PH»Î:»Æ»·ŽÚ• ¬“Ê¡{ ¼ˆ:yƒ:™‚«Ÿ¯Zó«—kº¸¬[½ ;­Ø;­aÁHFTшwöø­ƒ’}®ø‹;©À@Ûµ2œ¿ùû¾ïû°ó˺:̺8¼Ã »Ã:ÜÃA<Ä𫺧¿ú˪œ²I³Äl¶°Ë‚Q³»n´±8·âj³€Š¯;¯ü©¼Kú±Ьa­Š{½Ô‹ Ö‰ ï«Á›½]Q‡of1„ÂRcãû&Ȭú·ž.ÊLþ¼(5>S¿©kÆü¾ÿÈðóËÈó»ÈœÃìÈ<ü< É’|Ú,Ä<|ÃHœÄ§{Äú+ʵ Àc«»UØÄÿ[Ên‰«û±‘™’Æ‹‹=+¥|;ÆLÍ+l½¼Ãn|­bá ¸÷Ú䚀Sr$Yµ·Ñn‡I ³gËi›4ü4‡ŒÈ‰œÍÚÌÈŽŒÉ|É`É’ÉÝ<ÎàÌȌÑ Î=,ÄoÜΞLº¢ŒÄ¡œÄò<ʨ‹Ê’ˆÅ;»Åú¥],™Çù«´¼ÀÓÍ»lÁÌÆpìÄŒNÛZlóhQ ’ªáÌcW™jéŠÔÜÑîkÈ@³Í"]Î ÉÜÌÍ‹,þÒ)}Ò'½Ò&}É KÒâ̺èüÍ1ɘÄï Äê¼É?ìÃ@lÃø›Ïµ‹7² m»Ä·  €Œ¼ÉÛÀiI·Ú™”™˜»*ÁâW  Á½L&’ ˜ Æ9bÑÓÂÂ*Š‘nDvYÆŒÓÿÐۜғ<Òt]×v}׊<Òr}Ó4=É:Ý×?Øì<ĽÎLÄ?¶ö|ºM|»ùe¶À²,‹…M½µ‡ŽX}Ö-”œëÂ7¹¨åº ¹>8ÚZŽŠ FzâKÖ‰qu|,Ú”™ˆêËÖ7<×ÛŒpmÒ&×w-×qíÛÂýÛ¼Ò(ÍÛêìÖ|]ÎA\Ó:íÎ; Ê÷þ̬¯›Ê]ÅçØÏõéÅ~¨Æš–Á ™âEF“}©}ÌÛ:Ç¥ZѤý)¶Úª`y™^[ÍmÛ*½° ÎÁ×z àÙ¼Òÿ]Ü-ÍÒ®Ò >Ü¿=àÞÛ{Ü”\؄ΚìÉG<Ô¹ûœeLýáæiœ'سœË¡6»•»i“{Ú¤CÛA÷ ýÕ¡X@ðÍÌ´)¦®|‚´Z…wÈnM×ÀíÈýíÈ.à®Í.ýàÿ}àIáEîà åÃÝÛL~Ó,Ά½Ó@­ÃJüÉCÝØ?Y¦Ñ‰q«8¬rkæåíÝ—m_ê› y‘YkÞ6NW̸·ÞÖEbÝMþ6n¡©g›bËÖÐä,ÜÀ=¿CåŽäŒîèK¾àNà‰^äNäQ~ä™þäÈÝ×4Î=-ØïÌÉŸ,ϪlçzzÅäíÀhÎÀ‹ÙSºê'™âr–¼HÇÍÞ ›5ÞÌ^}³Ž¯4<È;\ îäÆ}CŽéy­é‘ÞèŒNéK.íRéÆ àTÓ îìÁÍì–ÞìÇíé‹ êÏñ\Ïö<Àú¶bÚ…Z̘zëæÃ‹™Í›:{¦îmê–LLb1Þš1Þëù8¬Š¦´,v¶=êomì nà, É‹îð˜žäÑî¾íìGNí•þðuÍí’ÞäŸàßnéÈ}þíÅý°Î­Îè|áZŽÏ^Ï‘-æ˜*°™“¾5/†7vÒH}aˆÖL=£8 Ð6ô¹8ìÑö“2ŽÚ¤ŠcxìÚË–¤¯J©í{˜m}ÉàÞ ßíŸìŠÌßÿõ!ßàïðÖ^ñvííÐ~íŽöÌŽìšäTÎäÛŽäŽò·ý×Ð-Ô<}¿¥Nm$;ƒ\§Ö2/ô©LÍaøGôDÿ}ðšÊßÇãlí¼ó+Ö½Þ%\çÔôñ½*°]"ú·¿º>=ɘŽõnàn/÷ºÝõOñŽö¯¯àÜîñÔ.é^ö¯ö®ßͲÿìp/÷àŽÉ§ò¼ÝÉ)ßÍžü^Þå‹-ÝÍþ¿°Ã>ÏÓmÏùÌü¢<ÏÒ?ì¢oÃAúÜpKbKÿh¬}±}þ,iøÌQ¯{úNðzOÎ7MäÚlèOžöÿÒ±?éÖòÙÎõßîúqàßÀeùoøÉšÊa2]<:JêÏuꤎqÈ®[”;öêø`Ë‹=¿5ïzöë嶇¿ý^ú|çråj¿¯`¾… 1L €§B£Í²Ì@»­µ‚h`¡»cЩË(<Âθ“í4ÕÜm5;ÌhÄÙ>,‘5Ç4ìÐ!K{­)–Sޏà.‰ ”lmFcôè7Ѹ i¹1´·!™ °¬ž k,óÊ’¯J+ß³2Køêã’KüìÓO?(ñãʦ PˆÀ©<‰¹É"TíÅ:þ2È sKqE×âä“7qœÄâÜ,IŽ”lMPÐ`‹mOíîÇÙ\LÑÎ -äðÏ?'-Ô7Ø6 í¤!\’1¹Ðs2,Æ@KWÝ£êÕ*»¤µVÁÈ#³«0­ú«×ÂŽ€4ÿ¡êKÐMŠ"ÔDܨ³©E53 ÐH•”vÔÊ„dSBlµíö[Ц¥TPPÍèÚÆ(ʱÙlÁU75â %MCu·ýŒEn7$TM ¯+±PÝŠJYÖ+Ö¼le¸a‡÷Â*€V'–¸â‰­Ú€1½z’¬£R Öˆ-öØ‘)Óm·àL6Æàl—M=é­\q'·fH7õ4ÓygþõÑ>y4Þ$ó QT +«t^;S“±7Ô€”óhF=šÈ·k’°‚Éza±ÛÂ’ì‡Ï¶50µÃ´ØbŒû˸ª05Þ8+¥†2•è3–€“}Æt Ì`®zÜ‘v<ñΠçiIÅñ%ÚhÙâ…<ÈÒ¾5ÚgÊ1MrJ+å6]xq{JY«¥-EÕUQtÃUùNS«Bu<ƒÇÆÝ¬²Ïârmß3þ=x¶ €xã‹GžxàùÞ0ÀêþϨ—Ó(ؽ÷2vÍ ½vALˆYBIGrq:h¬mf…ŠÊÐÜJJ%( šTö¤QmvshyŒòdª3~,푨¸WG®òD˜ ÜÕú•EmbUžìà ­yªmÒ¦Žz'VùWªÔ«èêñ„þ×ïù³QëKâ bÔ†&bL}ÕR‹»*ônL"Y²ÌS«ôƒšåHõB„²Ÿ±+AYÉtž“§SL[¥Ø'ôs¥°Ã©Y[yÚ|~Õ®ª\Úäh›JÜU§þ¼¤å´J2¿8iUUÏb³¤XåÎrLJ9ÎSžôµÉIÎOÃýdN¹I‘2}Ÿíg³V§Ö×òöi÷$š\aÔ+®÷u¿íë]{ËÞ¾w¨÷½WV£¢È‹R¥v(Yš{%… ØÀõ˜PºãÀq é$ÝíìeäY+â‹Félƒ«¨]ÕJ’¬#Ui‡};â ³v¬Vê‡ózßú²kö+&}sUþÉœŠUQpei`[N…Ç?N‹‘²ı½!¤ǹ¾” .¾ß]Ü“[wÍÓ÷Äö¢£œµŸš·ÊR6±—i ÞÝŽ9‹]t%µn8Xú´Ñ°]1O@äù˜Îw†tGhÝ”Ëäî”?%’жϾøÔë|ù*æöš¸Ñ,öëéÀüWHؼæ o‹}Y^H õáÕ§çWÀwÆ sQ}à<+X«dés½Üô‰Ì·¡pOU«VðéÆdî²™¥œèuÖ–µbfô¡+íâúŠXÓMîo“Î(TAõ+Z3«ºãUÓEÕÝÎ ‚Å =r;6ºÒ‚V¬g(\ôþ®Q…ö®¯­ìnFÃX»“v÷Y“ÍìAƒyßþ·°÷º½*F$2 ˆ£›o,0’ç¸9&‹Vr,P$Ü óñÅÛÕ‡:ônÒyM 7äoþl(C³<×zz†pô-‰o€#Zæ3—·¢—½â›ã¨¿þò‰g{ðA³%ÿÝØWe툋â¦~x+Îm«åÛU_˸È®/æŽ3Ù˜«²K:XAA×S¡UìïJ<è|6ÏožÛ¸ãwçm‡{¤©œée-T:¶*禟Çé„:Y*Žu¶\ñvAðKÙ³—”ÐÕ:€§‹n‘È Û9w2{µ\f`ßþ]Ð:·­Í×NóÕ›^î®_e|Ó»¢7à.±„ºà>0ÛéñÚ^üãÑâxá¯GëcÒVc*o7ëHåš®÷ÖMÎù¾w÷²³{®÷íÃߟ7¿ñºoz¼è¶¯î%Žã‡Ç¹ð‰Ï=,‹Ï;;Ï_VP:äò9–/ƒÈÑÜM)è¼Íû!ºS1Žª» ? s=ðk½ys@Ó»4ï{6JC1…¨½`:˜„“³Âz?m›¸7ƒ?ªc<⳿ø(€t -œ!Ç9ÇB2Wb Ž$P "ÁQ»×Ã; Ô5Õ?Bš‹@ü²˜! ¢£‚Ù=S¼%ô½Â›³ù3ÁŒ”þ!°kÁ ñ?° @â輨ˆ0Ó4ÇÈA÷zÀlÀ 6$·+±Ô2¿ƒC,%t?3,ÃS8=ìÀ‚‘Âú£B±É¿t;œ„’y¯ÃíX,”üɈ@rÃeB T”Ô›Ä7´;8´¾²2Àd:¿Aj.Åk¿lÃÃÂâC>|?¬º) Dø8¤‰µ6ÁÂÌs”©ð–Ñ‘LäÁJìD_\C¡ú7`侟»“ƒë:T.ôÀöÁSt¿R,>W|Åö8¤€ml䵋šä ˜ù¤²ë—Û¹ì+½šÆvT6v´DÑcÀA TFMaF¦âÀ¦+µó=Uþ5á³Ækd/TŽƒãFò¡¨ý®—×lê“YÄ2ÔÄ6tG54Æx\»”ˆ d&{ EôÓÇ;ÈŒºTœD‚<i —l B$ê)ǸG'‹Á 3©2ÜÄ‹ôÉŸÊÏÂ4‹'– ÉwQœ|0.ÔÃij~|ʨ<5¬H–Ì ˜ÔFƒÜÆ@ ¶":”“d²ÐÊz J;Ë´ ¿KSÆÇ¨=p‰ <›’‰‹3TÌCi`Ån«J«Ä ¬<È—TAÝ‚ŒÔ­Ï€È ÃA4¤Dµ¼>ÇÌÄ!ô¨^ ±ŽÉ/üÈ£ŒKTãB~ì½&¬Ëk{J‹Ó¸¾ôË»€IþY|Iγ!~Ú5ΪAõI¦@ ŸÔHÈlÌ ô>É„½ l‘ß”°¢û¨·ÜœÍ\5°ÑK<„ÂUÄ•“ôCª\ÉÓ”•mT‰¦ˆÅ˜ÇB¡"B‘ $‰µÒ˜KÇPíM6TdäS9TZ 䬶=¼ŒÂU›Ud-ÈÔt>’Iuú³?â./mä8ŽÆauÌ€Ó>bĹŠHUi%¨ ÊMÅS|VY}SuÓë¬T•¸V(Jœ„þl‘Ð%0ê8õÒT*Æ-µÈ²$ªc¤×QD€©kWQ\áËymXAÐ'=­ÜeI+ý‚ø×‘•¸‡Å¾ÌÍÍ»v4­Øù# E²‹]J%üLú„W”ÜË‹V™-ÑŒ Ð’«SÚÊ×Щ8‡ûV’u(VxÌÒŠ|¶_cÀ„]ÆPDÐ2åY‡]ÎVX“ÌYåÚÙ«½ &µVj¥“Á,[~5¥¨¸¢Y†BÚ…ZËžlZ”¥[/•ÛÙ:Ê¡ó;°]¬¯aÖ|W”Dµ¯å[»Óƒ8ÜÚ°B%¥±cÛ£-Y¤-“¥HÑ:-L|4¦Ý©¹ÚŒ¶œPjâèm½n…«r%¯©Ðø1HîZO¢qOÑå*6ÒNþ¯¦´`Híe s]ÙL'CFäkÛÞÿm75©Më9¼ßh–ctM\¶d˜ã-æÅJÞF݉ ÑPÎáofª:í3úQ²TÆÝU¶a»âÈjF6ÕÁÔÏþ=Ö´Èemö¼. ŽYt6°NÓÛµá¼ìcÜeÖ’‡uèŠëצpçf&b]‚;j¦Ñ ,ÖœÒL¼ÀdPÝ(þH®‚ãdèf¤a÷mfUIh±Yè“v•µ](¢)ZÛ aVÚØâ²|K[Lc²Ü°G+Ùg/ìN€¾d†i‡ç<>hP£—Nê,™Ïš–éªvhT\éwÖŠ–ÓMÓIk$|ê±é£þ £ݨ蔆WFÅ6§† ¨VkùxØ j`‹šÎ^£¥è&"äª!àKæóMWÄ¢äîÊ}¾Ð¹žÙ¥ædæU?>gÆNç©.ž‡Åë¿á¥è”A­@¯þI‘c“¾³9>jQìL¦l”vì¿…ls&æÕ²©¦3v‹Žƒç½þе­åÑîíŽÄÃ]ÐElñIÙÉåUiÎ.縞lä#Ë.žµ½múÌêUè²n Ìüѽ…îäžàwæ6=¨çþîÜqè³°kĨn!¾nŽËltögL.i^>ïuÕZ`nÛ–Ö¹¾o»@Œà›nön ›®è~Ø“Ön³^’ÿï=ìÀ›=Ò§6oGêVïoïÍ~Ûøh€^pÒ¶ðÜIÔegæ¥ðØñÊ(»Nð‡Ü÷Þí¤^ð2½Éã^ñ&5,Þcl“lÏq‚Jo´pq_‹–qÛNþj´Îç ×q vV‡ûñ¹pòÅÂp"¿ò¼6p­¶#gèoO3­ò8Ýñ(÷d)qn sÊr³˜q·8dÖ^µ¦ïö\ó'ÇYøÕ¥æ.¨ ¿sºð {ñ¶˜hÝÎ]Æqÿóé,ó›=s¤¢%?_t/t"tï_.× /Wð¶ïI•QãñG?,—–tP_™f 3Žl´@€ÆXçlN‡éæòe&ãÜÍöyŸôz÷ä{?}ß÷!‡ /vExdx‚_sƒ¯3çsùPø…¯t/v÷L?pd§x`·x=oÎÄ:÷‘‡ó‡–êWïö—x•õ’?q^Aùi—ù*yèd¿JXÿø€gfÏù?§ùgw•Ÿw‡oywy ßô¡¿ó¶÷‹ö2Jy¨¿íŽ·«Öê_(¬¯r©?xª÷uœûªÛù®?ô³ÏñÒ%wŸ•«gûæ’iú¹_q·Ÿz¸Ïw¹Ç{öÝöWwhŸ¿ô¿wp½{€{³7üÆwüd%Rª?ù¾güÇ·ü˦|{m£|þ*ÇüÏ}„ÑüôQøë1ÏýÔW}OÓíÍÚ:«üÕ—ýÙW‹ö•úÏx«}Úç}ÚÏZ¥kÞ…ñûÞ'~¼×üÑWNžo¼á/þæ?{Û'h4¿ ¤wþê÷ßM›Ÿ~æ·þîÏyšE~~ÜþÝ÷þò|æÔ6°± ê7ÿöŸô‚™ºWÅ÷áã~÷·yW¿ÑLhö¿ÿþ¯x½ˆ `ð ÂHèð!Ĉ'R¬hñ"ÆŒ7rìèñ#È"G’,iò$Ê”*I$Xà%Ì–6\ió&Μ:wòìéó'РBSfAˆ4‡2mêô)Ô¨R§R­ ²èQ”2´þêõ+ذbÇ’-ë³åѤ —šmëö-ܸrçî,J€Úƒléòíë÷/àÀa[æUØU0âÄŠ3n¼Q¦ÞÃŽ'S®lù2ܽ˜7sîìù³MÍ G“.mÚ´èÓªW³ný7µëزgÓŽ »6îܺw—¼Íû7ðàÂ#/nü8òÚ¾“3oîœòòçÒ§SŸ½:öìÚ«^ßîý;xžÝÓ/o>äøóê׳çZ¼=üøò×Jžoÿ~ùôø÷ó7®¿?€âöŸ€¨*¸ g 2ø „Œ9!…ö5¡…jh†zø!wõ8"‰euX"Š)êt¢Š-ºh‹/Ê8#G1Òx#Žþ3‰˜#=zd£AΤEªH¤‘IŽˆ¤’MjȤ“QF¥”U*H¥•Yˆ¥–]âÇ¥—aƦ˜eªG¦™i†‡¦šmjǦ›qN§œu2G§y‡§ž}òƧŸ*·£ …š¨¡‰"H¨¢f‡¨£‘v©¤•ZF©¥™6†©¦"Æ©§¡úª¨¥ÊEª©©¶…ªª­ŠÅª«±Z«¬µÚƨ­¹bF«®½Å«¯Áņ†«±ÉŽŠ¬²ÍžÊ¬³Ñ® ­´Õ¾J­µÙΊ­¶ÝÞúž·á‚E¬¸åW“¹é~‹®ºí2E®»ÝÂo¶óÒ[­½÷F›¯¾ÍòÛo²ÿ\¬þÀ[°Á½"œp® 3\«ÃDZĭR\qªc\ªÆ‡Ú±Ç‚r¦#“\©É'Gš²Ê²Ür¢/Ã\¨Ì3Z³Í}âœsž;ó\§Ï?Ç´Ðm]tšG#]¦ÒK‡Ù´Ó]Bu–SS]¥ÕWG™µÖMrÝu’_ƒ]¤ØcY¶Ù=¢vŽk³}£ÛoÉ­ÜòÒ]w½wã¯Þ{ïÛ·ßþxÀƒN°á‡œ¸â 3ÞxÃC±ä“O\¹åcžyÆ›sα矺è"“^zɧ£Ž²ê«¯Üºë.Ã{̳ÓN³í·ßœ»î:óÞ{Ï¿´ðÃ]¼ñF#Ÿ|ÒË3ÏW´óÏ?½ôRS_}Õ×cµöÛoݽ÷^Ó4>ùå›>úé«¿>ûí»ÿ>üñË??ýõÛ?þùë¿?ÿýûÿ?(À°€< ¨À2°| Õ;°Kajiki-0.8.2/docs/media/icon.png0000644000076500000240000001425212554436352016460 0ustar amolstaff00000000000000‰PNG  IHDR,,N£~GsRGB®Îé{PLTE™ÌÿÿÿÿÌÌÌf33f™™™3ff33f3f33fff333f™™ff™™ÌÌff3™™3f™33™3™™™Ì3™™ffÌf™Ìÿÿf™Ì3™ÿ3fÌfÌfÌÌf™ÿ3ÌfÿÿfÌÿffÿ3f333Ì™™Õ–ï_tRNS@æØfbKGDˆH pHYs  šœtIMEÚ ½ ÛR›IDATxÚí]‰Ž,7rœ"Y¼Y]Õ=×ÓÆ®aÀþÿ/tF’uôÝ#­ ‰Eê½¹$˜@f0òäÛ[;í´ÓN;í´ÓN;í´ÓN;í´ÓN;í´Sçé?A«ÁÕàú³Žjhý­f]¯;b³­Ÿ¡Õlëh©†ÖxK5_ü€hhý­æ‰ ­?Ï\¯Ã%Z?€K6Åõº‚ÍW³­¨S Õàz™¶dãù—'æjrþõ°úØlë'QuCëåC~(›'¾Ì[Rý›DD´Z'§O]±+j‚ËÿQ´¬vRJ¯­>T¯""Œˆ TÖÊãI1yt;PóFë^…ð*\VFÎ:w"x’UJŽ8~`éwBKõA¾žâeÉçä'F¤¥í‡bv:éša ®ˆ¥ƒHD(³`òb÷ÈÉà˜Û‰åk7,ç2B+rÆ TPSè0ãýö:n"Û"ýIn7Yûq:‘Èú$¯´;`,…ɵÖA‘'ª0Ùü…¢¿’.KÅ_áoOÿV­ò¤'«É´œ&Ä`jSýɇ‰ÇE#Ìtœ»!¨,}£=š‡0T3^¸ɶ´…ºÈdÝ„uN\!‚ËÕk®ÄâA‚$Þt6‹ÍŒÜQY«¹Au<¥÷–Š10mZB˜ȦúÅïèƒFHDÒRJûÅ-mdYz"ã r^ÈÒÁDWl+Ã5MÖª>P=—‘ ^{²3ë">;É“ý$Š?î,-ÜdÖ ¹"9cR®Å€|ñJ.Î4DGzF2!Õ O^'»¬Þ$ý®:]ã2úðåzé%®B:ùÌVFèãOÀ[/¼Ð[ý©ßör´1$“´qƒ0Hÿcºî?{¢tÜ„½ßJ% Ákå@f’´‘ý^À ïïÄU¤¶„íˆÁŒÿøï>Z;öº™²2õÚ–넬V²v7¦5 @KA?ˆÎüoßÿã_=?N–OÛêgªJ²Èøi°IÒݘÖ÷·Ðž¾ëÒ·H}ìø+ÚIi ´(ÀE®É‚Œ`ƒŠET-Ãnlk0vˇ>½÷}G2xÅ”,GÍp·tšY^½£F¨ô¾´¢ø%ÜoIX€Ô þ‡þ…ôä¥D,Ä‘bŸ‘ÓÒã+ R‚8=É} E “1D[ŒƒÔèóÀx…‰ˆ R~}öBäÂúþSÊO½–€ ¢Å‹b]ÙÂÆ/úIØOälÅeŸ?óeIqwrš5Ù>nC1ŒyïLІŒŒOf­® P£«ÑjvDÉzUóå‡#ú‡q)¤½ÛE8M÷ÞÐ è‡`ºqkX"SÄ}œˆê‘„7J´>+ËìEhµóÚ†}¼1$ߣ0ïÄZCF«0|·|ibŒâ‰È‘(Ÿ…)\à͉øÐÖ€šŒG £«âã¸^‘t=ç% êùKs½âµ¶»`-Šu„qF;S@š‰~ÜpØØÅ =²¨rfyÉ ¢Ë&ÔÇvàŠÖ 1k† ’n½Ë7+ƒ‘xå|³TåN„qqì(¥ûð;(~›Ñ@²ÓqÉZ+Sü? ÃÓ÷&»ä4iÙ""8¤–œQímt–Ô–Ý#CPNÞ;±òV¡«"Uøh—‰.æô³DºYë\*;Ë×à ˆa"ìfšZïDȱxÙhs2µHzÄAêKKk]ý¶õmJ0o‘a.´^¬‹QÄEÀÿ‘S檥J†Ì ±|pòXal€òågXIpÒ¡ÇÙÉa,°‘æBacNC€áb°ü‡ü¬Ý´C[ÖÈ~˜‹=$P»"ç³.-¦†lÄ0è’¯‘¨ÃöÁ+Oq¢spÄú•) a¸œUüŒÖØÍØM«9éP*s=³ü±þÌé`²­‘þ C·µ*ÑÍøFÖ7Ù-f h]¢/µ%ª·¬¡ëV¹n–0gføf§°hþ‰AÞ†«=–clÕrçdݤ½0Ûל¤é6Œ5{fþ¹0$AÉœú\îQ\€‡¼<Õ]H1dÓ2f0b–W+8CQõ+Qd=y|YC P}zï\ÝAµ)’ƒkÍÂ}6¬AÌWa7CÄò““91?ÇÕ¨b|¢®o«î€ ß…ÓÖ7¢Án+²²r8wNÃiYʮܪ”¿;bú¢nÓŠÀgŽ Í6]:ûåæS ¯ .—ãin¥TžçŠûh?NUgåG\‰Åz¶1Æ Ž_ò¬_'?Tn%Aâ”*û§SÅžˆpz\ª`¢[¾Ì¹pûšç̈h¯R¥£2³½—²î˜ÚpÅ¢à2Î×_Î=äo8Æîfm:Kí¢,]”þp>ðÓ»ª³òƒ»¬àß"vKR˸Ø*eZe5¯–€Qq¡ºjÛ"Gü¶qdoœ³~Ã|õ­´µ~äº=·œÎ=ƒNÎ-65KùÈú³¨Ra†«qa³M™Œb óî²eÉÒúæq7z§kÎAäü^7#z´ŒÙ<+suÝš—ÈcÎoåIu0×4,ÙVÍ5Œh„¸æHkµlV^Ñä$ô¼ÌÅ Þår<ÖŠ%¢Y¡g°‰¹Zv–4CÎ4g¬$Kú^k®½Z±¡%!Î1Ú~gÖ†þ€BÚ»*—"Œ yÁ€1j_/Z—<%®)Kt³nBEÁ‚ btÎÎ#ê—5 %¯Ü9'¸Dkáõ5…#ÛŠºøaîájwZÖRgÿ:–¨ðܶÄÿ¬QzG˜· ÃçF.–§õΛGQò¢dYl[·ÄCñ¼s Ã¥ÈÚÔçŠ"7B(ô×Ô{%¦‚…óô¾.PKj^˜EŸ.èq©5îɨaæüT­à:°}9ï±iÆ][–¸H:/Ô…°(¸Îíà’Y,Ï × Öp}|Âíæ»î®+Εþ³K±pU6. ¢¶±ZÓúÅÌý%°*,vó•äß’~˜¡1c)B>;bÔõ¶Q¼Â¯O–%³?<0®UvuKC¥F:0çN7$°]¤N´üÁèW?8%ÓÖMOÜ0ØY‘qP…¶ÐÛÌ%Ÿ>Z©kôÄ_ôKˆªø•Ùå™^Å@kx4Š–.Å™æeN"þ©­ÃIJÌNæ‰V:¢{d\KX]3f².§`^èïC´áCW þ¼L¿é5XâFê¦ËÊ«ôp QÎj>wö=Ú(«+'’U}|à ‡J„ç)w#ª^5êÚ‰ºt%Å”%¬îçÄͱº š¬ê­€•2XMk¹ç;1ƒˆ| fœd±NÉÒÿÑVç…oy÷Šƒ58LtÝÝóB]g&g†!H6ª^öž§ª%ö)Úê,‹ÁJÙñÁ‹[)À›ŠkŽWá.œ±Gó©®kÅÀòü•D(“æxZÜj-—-—"æ¬ó~ž_É­oÇS]{ÜË©œÏ ïºg"~[ù_JŒk‘æÉ¶-†¾6Ëb°WwdÄùU@—"$<7öePÐ1VVI?¸<}‘wCê%y³Z›™œžÙôŽë>¾¢¸'» ¾ †'³¢¿‡[&u‰žXË>beüHhÍ ”’h>€åOU¡%}$ [V7Tèõ¥Ø]ôæé•h0[§1zž&Ó6Ô§äµtÜÖ—>¾ÄÃÄÃem!ðU$âê×¹»}”§ú”¼,Ÿ‹¯gÝ·â~¾&÷¥Š•å£á*FßÏãÂ}ж:´æ@ÀuWͬKlWÛcèN-cÂyW…‹s߉š]ëm|ªºuÊs­[—A2£sºìÁ£À§¶!áƒ[-ëmW%θþVgíÉãêÃÁ¢#À±øÇËêj‰©¨þ¦Œþ> -qQu] ìoá&‘¼O&þX[âÔqÂÓÏßž•T ÔÍ@^‰c$;U¥’ ?>VÖb˜Z»††—(~ÖXsWWô–νòø€XÑ¿WfZ<îZõüZ´^‚„ÙiïKit_ÙÌÊç¹’„â6m‰{6g#L4Xk óFpØVªMÉ{P¼Ûdìî·šÞ6±uÚ‹ËÔ\~E†¾?ýWeŸÜE5Ùˆ{éš+ ÅÆó8úòØ~†«2mz`°¶×6¿÷,VÜÁòQëÒýCÅÚž<\°ôé X‰3ã*?¡ Z÷ü„Ï-Íý{mb !â™&…x*6b3ÑÙAA”ʾGIQUVDÐsñK £¸ÑË|Ý qÑf#¸c>è2ƒÎöUZ·v‘b Õ äµt5[¬òäî º¯¬ÃåOÍÚëùÊ‘¥©Ä‰9LìTW÷ø;¤äÕOÇó§Ý*ÎõÄÉ–~æÜ7RÝ•ènuî⬮sscùl6‘OT9¹åójÊÚoþÖΰ–WŸßkë©1f~&ìW—6=Üúé·ÏÊ9Zu7µ}á‰ý²Äs'O[¿˜¶ç—"y¢jk7÷Eq‘œß˜X´º,Mç]ü»AK\ÑúÝlͪ!b4dÖ<½²´Ì·xbXb›ÌzÞÄÈŸ›ånÀšE×ÙæÜ»u9&â ^öScàóà waºEó¥ŠauéüfOÜ‘m½™Ç]§cŠ¥cþPÖºù=Ñ£5¾ùlv—™!,¯MîË´è^|"¸ÄUs³±x¡sÞd³/¸ò½ø„¶Ä¶¯9—1Ê;H;³­¹ƒäyu1“äi(Ûåy,êí°+´†'©@±©ý°ÞÒóŽ$8âá°3´Äk…k1wX­ý¼Ý-¾~^‡¸â2æûÑX”¸l}‹ûsyÑ"vwX¿Ìá`vacfè1 ñ­8wƒ\sIA¾¾ñ€¿»°­²`ñFxxݱ”# ìäUÖ>\‘÷,Ž»"Î÷Í‹(lài(É`ñ1ûë»#ÒÇ‹Çî¶ëæF3Í/}÷–õµ—{qÌbð35âQëîºs׈h³âŸ_{!xªGºÑo4Œ¯jTžÆ¥×<ñ+šÃNÀâUº¼MWŒÃÍѱ³±Ÿ^c„,/Fi}ýÚIH‡|øÝ¿“tÿèζT^2™e%œ‰¾ä{gûñC¼Ç&Ä?ñ¨ÃȲË<"û9GIpq‡nOÏ—ÙMÈ3vó‰ÝÈï‰ÇQuø1–ä|yBþ+þÚZxcŒì Ïù •®—¤¸ÊzyÒò;k\Ÿÿƒâ9a3˜îv—ÒöÙI }Xs¢ù×NTü€'½Ë{Ëä‘#¿èó=Šî~e£®hí„‘( GÜI€X`âÃ`òîfcÎɸ[¹F6”Å´—hz(Oµ Õò³Á|Fˆî^Sj™C7Ææ‚OŸv!2YmZS8â|}ÆÕd'÷BÌ=#‡]¸b^Í9Üaÿ{iˆRä7f š§È¸ŠqØkâ60X"ì¢ì÷Ró!Ó¿ïJ‹]7¥bÊïÜí¤@6Þñ‚¥9{žóz©§±Óíu›&KÇé4¥¤žÈ³Õ¯IÁ?¹0/ªckD~}pëß…pÂÆ3©4v;­uJçùð—œÞ¯ärn”ÈæÍ”)Ù…är§)ð*4–j‡”x®Æk¥µKÿj&f†gÿÁxwÑ5?;‰}#ýOÑ¢ÀæÕ0!bŒ*¨¼´ ®˜—Õ¶¿ßtèÐõ?l<Óðkž–ïÄ×jŠe…™%ïÒÑy d–ý˜@Îiõ·Dkó|ÈU#ë ILß¼ [Ú¼vH3kIXÔ¼ÒWþÏ0¡ýwŒÖ÷£.vCä‡Ày"ãùˆ¦‰¤y†-åmÇ*&^ šô¼üX«¿ô4ÌïE=ö=O»`qº~b[6sýhd1¦ \¶-¶²*æý‡¡¤Uo¬åʽ#áñhqÕQNyèÌ¡I._†«k™öø}tq+}Ê/óŒAOybWO™¢lÖ «UU¶üžA˜+±<Ò©Ã Û‚J \6öºÄ%•u²PUftYÛ®7SÞ,0âìá¨Í{¹úÊùòmÃt\¶ ”XPÄ©Pã+ž#g ;1\l6›ëŠØ{ŠÍ+Tš“TˆlTÙû| Ũ¼{ÿõ^å(j C¢<’~‘ˆ@«îøÓ">½"L<˃@— ù gLåƒ}¯¶ærÙ€$ý÷÷ÙzþnóŠ<2‚AéCòË›=–ÇEæv‚Äò 6߃*Uœ”.¤R~wWÙTüËÐÂåt¦(~â 0^g,KÍR° ¯ªŸ³àƒcIÜ›Íâ:ÚI^§I:1&ˆõ˜¥t¾]þ$³q…·½œaΦšó¢òÍ}ï¡4)Øsã£ÄJAI›÷Øûi7X½™Å-·eÙ,Qñô²TðC–5h>{$W‘ëém‡G\e¹ˆ¸üè4«ͱ ý´@¥§·žñâVÍÁƒ—Ö—‘eas½.· }¹[¨ø\nª4 I¾ÛT tò…ø¶ócÖ÷_-è΄=o>\Š¢Cû¶ûíæi˜W78)£ò5H‘M uuhX½YçӚĔ]€ sí² %nG696¨³ò®¸ ¿r—@[>¥TtCóÁ|èþ“k•j+¿„ª“[ò{ ¥ù"ò¸yÒT,ïÛñ‹¦AO £ o¡z“ÊŽ–Έ”SWèaPÊ6¼@ r=Í"B¦ “æX°¡s 7*ºó¦QTqBSW·ôÒX>ôó&ÏüÖÊÏ œ«° U}bÛŠÚ£‘H‡ÍMÓJ¼'K¬£éœrðkJôÎ}¨jÏŠ—vº Ó¯î¥ÑãgtœEçUÃê^Ì“|B9'Ñ?œ ÑU¾ÿï±,2ªŽw2jèFkë®eé\Nõ¤¸4ú•vÍ ïõ®EÎ=;')ÈÑZ5¬îž_m ìˆ ]ÈIµèùî‰ÞJï}Àƒ4˵¬Ì#íÀ”…Ö°Þ[ù‘( `xèR‡‹±õà ±]Cf)˜—–á½ar÷P“æå!L[Òýa$M’AZto+€55°‘"œ à}”ƒEè ‚ùÅÒÖ#ËÊX^Z°|£¬g`)˜òÛÒ~OÁ" dV¾¥ÞŸ¥éTÜRÚÀz šA¸ÿÖµ¢Îãã2XܧœX/€å3ÇÝŒžs–K2Õ,ë‚wLXV³¬'`ïWí½ö G'àÔÞ#»ìZeçÉQ(…)¾eR ‡nè²t€eh ‡‡D¿/Æ`µæ™gnhù‘ž3l¥'~¨˜ûBZ›Ã3°|yj§õÔ²¼tù6lÖg`iÍûœlu;@þ°¬ Ã` ¬g'†Ä±»aëÉ™¢ò,Õâèg~hÑ÷—ÓÊͲ^«„;m ì9ZèV†Ô"–oh­®˜ÿ{|kÏ’“xÿÿÿÿÿ÷îêþþÿ}++«ûýçÿÿÿûÿÿÿÿÿìèáþþÿÚ€¹º¬ÿÿÿÿþÿÿÿÿôñíÿþÿM/)*$åÿÿÿÿÿÿÿþÿÿÿÿüü÷ÿ'þ ÿ£<œ—›†ÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿ3 ÿ ÿÿ_ &ç fÀÄÃÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿSÿþÿCS 58ÿp12ÿÿÿÿþþþþþÿÿÿÿÿÿÿÿ^+"ÿþÿ˜A™3ÿn03þÿÿÿÿÿÿÿÿÿÿÿÿX&ÿþ ÿÛQ ÿ;þÞ³·ÿþÿÿÿÿÿÿÿV'ÿþÿöÊÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿC(ÿþÿ ÿOÄɧÿòúõþÿÿÿÿÿÿýÿ?ÿÿþÿfe]Ç»¶­ÿÿÿÿÿ³¢ŒÿÿÿþÿYšiÿqSFþ2ÿÿÿþÿ£!5:!ÿÿ÷ñÿÿ,ÿN=vö’)„^ÿ[ÿäMºe7ÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿþÿÿþÿÿþÿÿüÿÿðÿÿáÀÿÿƒÿÿüÿÿøÿÿðÿÿàÿÿ@?ÿþ€ÿþÿüÿÿüÿÿøÿÿøÿÿðÿÿðÿÿðÿÿçÿÿßÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿÿ( @ 4÷çg ¹èàkÿí§|'ÿÿ3Ât ÿo*v’Én ÿS ‡¾iÿ/âÖÎUÿgÿ§ã+|Öñm/ÿTÿHÿçð‡œÕ‹iÅ”~ºk^OÿïælÿvÿQÿÒÛ‰;™é“„†sÿ´µ¦ÿ+ÿËáÊÊ×8å„ ÿYÿG%ÙfßCC-‰ÑãFF=½<=6ÿ þ>ÿ ÿô*Ž×£À§ßб²›ÿ™š‡ºÄŨþ/0-ÿ þ'þÿµ‰å&'ÛÿÿÿÿJJGÿÿe`Yþþÿ½´0Ý«OOEÿþÿÿ,þÿwß…æ°Çô¾NPHÿþÿ##ÿG þ ÿÔè3ËÊÿ‚†oíÿþÿ,0/ÿS)'ÿÿíë:â.Áµþÿþÿ075ÿs;3ÿþÿÑ+–ÿ% 8ÿ‰IIÿþþÿ-40ÿ~KBÿþÿÂä€Iˆ2ÿ‹NPþÿÿ065ÿxF<ÿþ ÿµÜ0õfÿDþ™qtÿÿ066ÿvG>ÿþÿÕì0ÞFH8£557ÿ”‘þÿ272ÿbH7ÿþÿ çû)5àÜá¾ÿþÿ,+%ÿ^=5ÿÿþÿÿ'†ywn¨ÌȾÿ?DCÿpZÿ, ÿÿþÿˆŠ×¡—nÿoRDþ?ÿÿÿþÿÝØ•k;"ÿÿæ áüÿ-ÿ3( ´y1ÉÚÃæxxâ ºhëe"ÿÜ,é¬éÖÀ‘Ö}ÿ‹ÍÈ+„‘ÿÿþÿÿþÿÿüÿÿüÿÿüÿÿü¿ÿÿü?ÿÿü?ÿÿüÿÿøÿÿÀÿý€ÿøÀÿøÿÿðÿÿàÿþÿþÿü?ÿú?ÿøÿøÿÿðÿÿðÿÿàÿÿàÿÿÐÿÿÃÿÿ—‡ÿÿOÿÿÿ?ÿÿÿ?ÿÿÿKajiki-0.8.2/docs/media/Marlin.png0000644000076500000240000003667312554436352016765 0ustar amolstaff00000000000000‰PNG  IHDRo.ïîsRGB®Îé~PLTE‹ÿÿÿÌÌÌf33f™™™3ff33f3f33fff333f™™ff™™ÌÌff3™™3f™33™3™™™Ì3™™ffÌf™Ìÿÿf™Ì™Ìÿ3™ÿ3fÌfÌfÌÌf™ÿ3ÌfÿÿfÌÿffÿ3f333Ì™™¢ŒÀžtRNS@æØfbKGDˆH pHYs  šœtIMEÚ 2^ IDATxÚí}‡bÛº²­ € IQ²\’}Ú}÷ÕÿÿÁ7 …”ìØŽä-ǘ³#'îÇZ^Ó×ÜÝ5kÖìýæÚ Ù§Ù8Ùèœêš]Ýöwãþñ ­ÛO®®Ùµ=i]Ô÷÷ÁÙ cû4»&Úœõ“¸ikõýÁ7‚kvEWº¬ÐÀèñ^7¼5»¹Y nÓúpo'Mx›ÚO¥Ù•ÈÍy¼6…{ð££> ì oÍ®c£÷:€? Ùèßt‹ßš] nGŠÚ~âã£ÃŒáþ|+ˆ4»Ž3áõˆ Tð¦ÚûæN›]nþpï}€G=Q‚ °›´m?šf×HLkR Ô#À®á­Ùå ü'FmÑbNê'ŠÝn­ÜÛììæ©Ôæ-¶üuÀu¨|ûá4»xì†8£$ØÍÚGÀ™á jûñ4»tì†u]î_œO±¼¼oñ[³ËÃ’„é‘ n©þi»û‡¿5»´3ÅŠ›·Ý(·êµ§üA·öB³K[|¤d”+!?1’£úÛáÛ¨Ù% “„Ãá!Z á€ÖîÜd â„o£·f ÞÈqb2й{Ì)øØGç›;mvÙà퀎“ûWž¦È䃞öí‡Ôì‚©)¶KÑÂÿœE/ª‘ä0À7êV~kvI¸¡û´Tîõ‘B¹„ºG÷x8´ò[³K¦¦”…:G©htAKÊ€Å_‡­Ô¶.Óì’¹9Ó‰*¼Óô€j$Ê;È ¤ªm°Ùå¼)™>Óú{€bKš]Ä›2¡ÿô‘µý>"öÆq:Pët ‡†·f—±‘úW#¦ áv€ÔÀc½ ÷f$eÀ±ð§ pÍ~Û°õH=¹ €6QÁÍî÷®åíí#ÂÎOÑN pÍ~3Wˆ4Úf©I?AØ÷(!ÜM÷N«¾gËÛŠV³ßu¦èMÔW¸ÅGPB¹{€ ŽÁÁ+9_m)j³ß¢7„Ñ£‹”18ÔBÂ5Á 2Zœ ô&|GgÛ–}³Ã ûX¤¢¦ Ú9£nœ)œFq¡áf½vl$×ìcÞÔQ)dÿP†Ž žƒ‡Ñ¡¢ƒÛ‹Ÿi ÎòÔäÎ5Ì5û½QU%æDlÑj3Mö¨n ÷÷Ðíeq†ä¹´G|l©j³÷éV:¤4=ÅhŒécÏfàÏ4y¬Âí‹÷îyMËréÞÐ6š½‹ÝhcÁÄ„±„³•Å=O–Ká±.‚±ÀÔ¶êH³wXÜ@L÷)Ž^gè þ¥±Í…9 ÍÑ0ÊùƒŽíH³7Z¡4Cÿá__†^A_¯‹ÓÄm|Þˆ~´¬¢tðm³Ù[Ñð26Ã(c>3‚:a;#¯Àê›,¥òê ­qÇ5{· “-è²Á†ZôôL0’â¯÷#åšZ\n˜kö rC it™ë 6XK &Zc½5 ó`3Ÿ„yúð(™ÃANúøÎ6µ‡› ”úþV¾“ÐH"¬T§±9øÑ^ÀÄÞ¸ƒWX|g‚é4úZÞ²œ*fª8€Þônr3ìRF D†n f-°yT»Ï1›Å$!!˜,±UíãשCsª·†9S•·þFj3®Pk+Dj\í•.?²Ë%<ö©^‚6XýÇj\˜\ô÷÷­"w[3¹Âõ7€.'Ìj¦Ò,€ÌzÒ÷E€LU’ž¢;ü ~5ÚüýÃ[÷÷±N¸—ïñŽ j6–»AÄÕ ûì¯èq.ÚcŸêl\É´-,oR˜‡ñDm>Õ„uHMçèäð%:çÖÊ¿¹ÜДpè“0'_ ¸-PˆÆeÞTŠ£ä4Ÿx,… Š\)A¸=€sÍ] Ú¦Ý#©ÜXÑ­$÷Ý1—¿^˜¤4TëRÖ¥FzUÄvíáíxХщ|i¬0 ¨n­è­FOKð5|[æºÁŒ5¹°+C}FaHlàGƒ©Ã3)ø–¿ æH ÷àhšý­‡˜>„ÇH°.‚½.–3×ÈôŠö,ßbäêá} ô‹6î¬Ì¤±k@ø3%]•ïC þ4ÕAŒêŽ|¬ÇöC0ÔgÕ˜Ìò[©¸âÝ>úTüÅŇ{êbÛȿͲ?Ï«9 ‹¢­j³ @RèȘ`>?‘æŽ=âS$½à•_ÿsUz;ªÞ¤±ôà§#à\kÃÜ-bÎ`#ò ˜ãv{ÄVð›ÑÚžR~'S'ÏÒ¢'hÁ[éÑb§|¥ñ’]`\W&L°ž7Ž€2¼ÜàøÐ.¶¹ÌÄœI¤£MšÐø}ÌñHÑb|ÏÖÈJÓH¥ÂÛ§–Å}BˆÂQb¶ûõ­:E8¶Ä¤FüK[·ocK·f ˆ8ÒˆùMÌeO…6)Ô"t‚ÙLò"°„àŒ.U8ü/TƒIü ä"p›è_©±j­éøÝãt|¤õAÖ8ž›S½EÌ¥  G;õ¯ J–êºež- !…*)Ö DÅàÚ°²ãÔAÞS Ê0ïðØÁÿBú*):€ß™¦øÀ=ý¸oaÜ úU|b¹“ÉO¶¦'\›wa.Åÿ³Å4SÙ'öé«:Hb67Ò9IM)+¾«Ö&MüâwÖgjK‘!jþ‡x2r"ïüèÇ#,áïÍOÈYÁ˶%ÂÛ£8Æ\zÚqÿ­­¶a³ÇriBlÔ¬rvŠU¡!±Z"Ñ*ˆ“ÈQsÛªB^Ð¥uŸ+&x÷ѵÔá61G„Vi$Úã#ñÉ*°ã'ó„Ú;ñ +v”F*|Z²Óä!Ù['I1.u¬dî·§©q]ö¤HRuãxšD¸MW=ÿTé³ãx¤Ão¨*§Q<¢uWošç,…éõSõÇGðTÜoï-ºÏÞ£…÷z㘬—†0$W”Ów½¸Îú½Å¯Eï1W±!zü²1¤Ó§ 4" Óv8Þ>EšðMê(Hë%ìÄI÷‡0¡ ÊÉMðíûÆr7j«€B ?i¦ŸnN-Ý"ŸaV`éA(EWUŒâ 6/°Ôàd J˜hZœè«{±K¯{K×&7]°.Ý·Ú¾„š>ñfq$½çïVÞyr?%˜‹¿©qÜ­>«öÁzÿèÃ>â³§Ó µ™xT£/]žñ¡MÕ(c."WBŒº½¶±—>iÏ› iúC#’,2¨¦‰$ ôê1¹»1íå²qÀßã9¤ÓO­Ó  íÑ>z˜›àÿËÝjÎÚ{3oq±8gmûÐKá£ís¯€£;|ĪX@ä}4L‚šÉ‘ж‘zø{gyDSïÀ:C$öëºtI,ªâ¯øÙUûW*)TF2”Ýiù~4ê-yº®µíØÜ8æÆððtØ=>`ó…° AuCl#XÜí‹Öð%0Y <¬ Y+öΩ×`©Ÿº‡WaîÑØ';¬Þz+ý€Ò'"O¶T%?àB“¶ix _KÉ´ ÙY÷º4iFÃýA¶V¨_µÕos>nxˆÑ‚uŒ¨àh2ò†àà!õ³F³âd¹ žeü§Ë¯ã¹qÜ㛇faw_ã—¤jŽs H4éP7¤ ä8³Ž“ pÈĪɫz–c:G\( øŠýÿiOî ׃ý0 nØ»q?±“)_˜&Äà=7o ÑRA ”Æq†¿Ìã4Ž“wÃÈæè?~ûè¦ÑEü`ÈC€ÿ¨¶GS‡Ôâ(zÕkE)Ýü”ôÊ`Òš¼Š×©MQ‰q2ÔÓ÷ˆcÒ9t‡ÇöÄÞ°Ùxô»Ý8¨A©‘2Ì3<$¡M“Ù==ýë_ÿ6ý„oʦ|G³ƒÄ^ ߎˆ±’‡œh÷Úa‹mß§l<µNµ§‡<Ø”Sãž ˆ:"29¤d@‚Oe –ÕÔ÷S› ¹e¼ÇùÀˆS†þLö_ÿìÀþù?|? Õ;²Í^ulJÕ”Zðÿ:f§qB'»óü±a¤|L(úÜœÐÉ‹RëA꿦¢5«=æºqIŒØO ·àQI«Á(ÑÚ0w«–~Í¥T'Èëÿó¯qûñÿk×÷#ià? ²îøÔ·¥üU>¾‚›éæÑYL9oÑPx‡ãMZ–#4·ÎJ?+½àéàrçŸÜjÀmkš“ã•®ÉîÛEß›¦9‹Ž/Q—P äfûÿ_.îÿóß¾gêb“Çå¨Î€>G'KzotÁãŒ1£Ã¤‚5F€æúˆíÒ>ô: 0i“ú¾}ÙÒï¹PŒ­­äNµ$S¤C˜÷÷v š;¬­Br»}$ħu•ÏÔôøÀÏè_àP;†ÎÊæa 4zDì23â !òg…¯ '$¦$E®úbŠ*å]ݯêtâv{ã´åê²®vÒhÎÏzîiµ —bƒÜ횎)Pò_7 v¦ÆÛø×ÑŒ n*ÿQÝ‚ü5¨ä` c„³A¨ÒÒ—p\C™`νó ä¨åJ­çèÒl°ÖÔ_ UWìHk«äUÇ:Ùw ¥ï="lÍqÖyªu€ ¤£nôÿû'VàÔ?§~`Ð ÊÒßàU2ø'ƒ³JŒ·ò³)–Cй¸÷&Raò¶á+äÁi÷ÊŒfà€â1ôe~™àÆ›„÷Œ·v‰ðÜ'©)xªñV¯v:L_ͳ›»„¸aêÿß3Ný²…Nýø Éi´‰‹Àšg25÷óÓ,“-­XÙïÂN¾%yžöóÛ-Â0‡•WÂÜJùÊRÎí=sºÔÁ=ÿÏçé8MÉ]v5¶0eHï*Ž“=*k‘x¸:µb´aåGÓk‘ÇŠ;M%_q™sÊ,ŠG­!G „JáÜàà?`8I\É[)ôjÉ`u_ô¨ÓJ¿a MÔ:#µ§Ç‘¥¨ãÆtÚ· ·8c#·s¢ÕíD€ƒ¨jÎ)@òŒœ¶–>‚Dp+TåÒÛ¼t¹d§6ÕUõ%¤£s¸øÑCmQpùÄ òÌf"íá"mî~ñ ¥ ÊaÛD—Úlæë!–»û”}k!)”O0©ŒMÕAúU 7ÁeÉå\UHÕì50u9Ž“"Êr8àSÎ!F”§!ÉL\‚FQB]B*‰Þ$ÑÌã¥ÕÕÔï(Bràui0qmùêYƒÚM:—OAܱ´âÇñ8±Š rÜ2º¹ö¡Å™.*§ ˲ŠÌRB JÖ!ëŒ!嫹íų²ŽÇ½ ” s#gŽôŠâÊ­‘JßµZ\D Ô]•ÔUZۘܖÖpîg"IyóIɼŽö¸KmzÎ1q¥A(.Wr»Ê¿&¿ù_Kñ¢™åð¿yI~¬[uÂrDU±÷êyQÑÐÓî}bçë ¦¬›¥L"˜LwVTI²~Oד|ü>¶¾CFpþ4à1Я²Ÿ6˜Oó–ó‘?rø n9ß,U¹Me)b6L–jŠg†®ö¥«8°.¯zûŒxäºå½öGOª6Zj½›~ƒ©z[‚Hö¼2 ÜO(~x€LH½k«È1«EZ~€6ÍhûTêŠs~:9 8ÿS(Ž ¿Å™ ©U°NA æ¸û?œ­¾dõ›(_…/;ÏX–C%LkB5€ž% J»+¥cME{’KzKØ‹À)`†MÚ{´A ËmÃÝãã<ÎàI³´†Dq¹9EÅTÑU¹Ô¶,Û\ ½˜µšQgB¸º×U»ÖT&Á" ï°w!U‚Ó¾ƒÎ2$!÷ö¥p§}U¨’£5B¹gƒÎõ».uíÁŽ8CÜfd|ðïøœçç6 º'z¾!t·Öz-™âJEWHlA‡ºKß0*aÃ\ÈS«ækýiN­¤0òç#ußtÞÖ{ÑA´©d+d§¦¼¦õlxLJÅýU¼M8~ËŠÄlð”Fš\VÐfÿ¦£îÏóŒd6zO×!â"—»ßV§ %m­N­!7«uÛ´ÌÏåÄbíŒ×,XÚûØÛß¹yÀœ&í'nÙ °@WŽA€¿ðYSò‡éñÀǺ&Ô/üfG¹±{ÜÝ5“ÍÛßö‹u!ÀÉ-ìÒ …Á¬!m’SÕ©R Ù¶J•š ,ÕÚ —ŪvWA± ”Èl;`nv)n·+¹´´Oó$Ò3é²®•[ §P³ëþðHç!ôýÃwâ8FzQ\ž|šÄÿóõy–ªVÁxª":šÃ(~TÅ÷É$%qXÕ½_ Èa 73XÁ©I©¥úàÓ®—lâ@ì1;C»‰Ðt–NÕº"Š˜Ž±Â¿lyÜù½¿ÿN©CΰÆ4å¬ôï­¡?å9¢Ñúã?˜âŽ–¦}•o•&-¹e/بK"s™¿Üä™- Ó ÓùV+#ŽjÂn°vÀŽ•Éó#7N$XL"¿ÒòÅ‘ºlh§ËºHößlLn»Ÿ&¹«ýwëÓθ2Ã=p¥ÇxdèÑÔàbÌ•8éx2Àu®°Ñ¥fV™ÉÓL埃'Ÿ@©zž˜Ú«Ôƒ‰æâqæ pf*­Ôñ ‘Pí> à’]ɨ÷¨xîHâÏ?¹Š)é„ûI³/‰‚6û¿û7ÍÍ\ýà1ñHn¦Fºõ¸a(1|…Íu[´Jà U™¸Sª„€%5¨§”Z5¸ºM.Á…¿‘xsæ'ºˆŸ¬IÁ—Kh$÷ “ŸWŠÕ©ƒ‡EpbÉáÈÒÌq8ª€^ÔTþˆ¼ê›˜ 13)í¸ÑàݰÊòTÛ1M ƒì#Ô¼¤ê‘Žú „ÐuMUIªLÑ•™á3Õ¹•å2 uYÑæhµ?j:ÀJª_¹çeêì!7¾¥ªÂ ZªA•Áò5ó@dwÎnß·‚_Ýëê]*©>L›¡+kû`(O‚=þùR4´ uoÊ\0v®“àk ÇÃÃWãF‡ç8‡ò¬æã§gÜâÅlHûp}£%y@UGaàJ—¿N«fy-5‡o«ÑßN—¸î}±•¶SeM¿Œt§i„Z7ÀÔXéá˜@”‰Š@fH÷l¸ œúü4<,§šÐîÿÛÿüÒaܸ§ ‚fweì(MÝXìV(S†[Hsbœt£üTýµðä¥:ãK3âæMú° Á ®ºªÅº‰ñÊ?Ò @•™¨3Ý}¬1cq³‡™O—g ¦¤¡I)«Î×»P]¸ ¨s {øÊZ7ºQ¼†+¸f¤˜˜ŽÙþVozà‡ýqN¼Dˆ[v‹ZAd»C¯¤Â6äØ_mF2×ô4œ”Iºj+L’Šõ`çvˆ‰†[xÁqŽ{@œ¦#}ÐõŠ\Z"¡„` 2p.’ФÜñ‹R‰ë!®¨ É8#-wi+Üì71ÜLƒHãR­,§'˜ã·ì`‡$’€ Ë4gÚøey¦øgUïÙ(¥ê-ˆÒrí†ÿóKyB…uömëÔ‹Ö«‚[ $וäêÊt;ÏÌ󣱃·´­¥4’µ"xª„\qÛ&h¾õ…ˆ¯ºávÍa¬uœênæ‹Ì1 Áaå·¸7E:ªKµ8óW­§: ç7hN «ˆåh‡ú|C– ÎþW‰Ó¦¡¦ÎÔ‚eõÄpŽ~7¢6‹w4B"I*®‰é |³Y:óK Žë ”éR ‰!·¾FIñ™‡Ü<¨¢˜š ©8"W>¨2¼Dl'ª]ë¶Öj}UVÝú=ªÈN­'¢’æD™\u–_ÇŠg }ॠ}uð!„œL ê,ëjÞ>âpúԒӌܜ— ±þk± ‹ àÆY­ P•yq]«{‰ÕY— 93mt–U­Ôµ–óJñY…öZ•î¬wVEk$Ãþèà ˆEý¦ÏKú|㦧µJY}>A|ãx%v#Bã¨-·Ìô…N pGË©ËPö¨§•1…çé¤y~!t{)Z;•‚èÖõ¹:+X«:ÝùÏY j%‰žæsû=¯¡²òzw¿°—oŽk’îÜ “i‚àc=šˆäL‚[ˆ_êâ®mkñÚÂRê¾sÊ:U­ú6¨Ó€M½ ‚/'5Wu+Õê®®Öm¿Ú`DoŒÊr³3tˆZnêÕÉé\˜3½ˆµÞp‡jÛ4ÏÝRq¦f²yéKí<Ž4Ÿ´Œ¬\3Ô”ÁOð\ÜÝ8t¿c'ÝÑM­/R—>ÖSÂU¶°Éx¥ŒqœÃ˜‡îT›¤!‚hÛ‰lk4IléF!‡{C!GkRà5©ðfìñxüZó3exÜÞâ¼A­TDR˜·{±r¦êq¶YðËU[¶Kn3oa¯îy­âÅêÞe3Bî'^æ%B–3u¿‹8ÏVWn13ån)ëÇrŽ` Ü~ì¾ÜDßìf•D’àeµtÅ£I ×–Ö[~(u®ýµRø=¡µjÚ¤îH¹ˆ2ÔtV–$‰·:Tb×4“Ž1Zg™¥ÆÍM%šùÈ»ÝgÅnŽ›óœ*ŽÝ4ï, wÝýØ¿`'˜ÄFù^æTŒS\†c_:/ÛFéËÁ›zoW'¤'»üj­S¢ª{]wÒ[­DLXx‰Ü*Gצ€®:׋(NÈ©Ãë?«ÚÏ"7©»1Ÿñ*Vð·`»ã׿K»ÐYµ·T(àŸã¸”Âÿ ‚¡ºóD¹YQ- $u?b-Å¿)Hé--ÚàF!„zxHÏIDATq69N­K§k½ºšÎ¡¿‚¸¨mvŸÃoÎ<´&¦¼àHu·ãñ«ÎŽºy¡Ušr¯ˆµ-Ò[±Ç;ÒÒóô§^«›œ9U³z\—µfõº¬—ΈBÄž®cdôœš[õ]‘^B<|ã Ì6"Öès~"»e¸I«^fBðÅ—^ªuÔÁga®åÙ ÆtÃr^nü8©€®Ûâ¥ÛÞ¹éªSJ«“-ËÕÕ»¡È=1ìܸ éò`Èü&š$ºÜ9ÇíFt£ ·ÝøO4°òÄmvŸ†iͤÍ?€ß——cwx$u~{žORÍìÉžž>àJ_c@õÂ5¤ív~i9¨,PW’è“Jr©óí8‡sKð E§Õô©d»F”˜8w¤AvOø0âKÞÕñ†—x,O ÙR ^ØÍO“¹Ù}…÷æªg¼[ÞáÚí¼÷»qPoÊÔ‡¹^…¨.Özè©­°ž29;9 Ò­B7ïÝ£nꟖµ‡¬Æ_*Álž²€ÚFmðÿûiÇ·»6ÜP$äF‚ñuý _óG\›pÅm «%€Ú‰R `nxêÞÞføe¸W!|±«VW­\Rënç¨J· ë$sÄ:°ÕYÍ+ŸVâÛÓ"‘P‰àF`¶áéé =+ü¹*Ãa3ÁÇj¤2¯þIìpücŽ›ÄÈ ÔÉ]ÓîI¤ˆé!Ñ©ßk4¼ðVs›+,ªõ]5±w:♆ÖEÂEbÕÖ¦4!]ˆÓeWŸ`7€7à³'ÄqÜH>õšxs“áM˜`©S¯y±9Ån$åðçè(:êßW;-ù‰v8šwêwc¸óW¢Õ‹ëûõªaµ¬­6}þsÞU%Ï:âuHý—QÆûªåa-󅄈·‘ FYÃÓu·‡„Ô’7•Ê.§ !ÇnøMOwƒ:=ÛŒ·£;kèP™äŒß=}¬aÿôÞÓÕË]yds³Ñz\%;¬T$!Õ%\M }Ò‘.#r†}Ò÷êóÙUò§ˆµ¸Ž|êÕ2S`/Üü3\ 1ìF(o±rÈŸ%hçæqQj$ AxZ:ñ:„¢pºû@CáMžô< Õv ©«·§‹¶aµîZ .¢”2±ˆæàv>J>ÊÎTô3l: CÀ+À©þb{’ð  ÷ã*ˆÃØM0Åì&Òn“5:O"™?N•˜ê¼§ ò'Ï3e8m!ª1:ìžÎîð}x«e®3cêEá5Ä­ATã$JäšÊÚuzsºF¡†]¶7ëNWî>ô©™?yOþ”SVÈ®‚7”<òX 1âE…Ö’( [{÷Ç/ª[‰Jv2*Õg¼Ç¿ëGßü6uF³dÃsÝZ0"7¿†®h‚åb0¸Õ)F»éˆ4VáRa®ÜÑI âo”9ü¸BUd… ŸI¹Wš f$ØÅ?Rt½ÜÕªžaÌQýB¨N’Ò¨‚z½zžÑk:)˜ ¬•bzw"íJG{(1˸g ÕoxUº/ûÊU‡¡Ü¥Gм±¨ Τb·ìÿTÉõyœE°8V"8Ÿæ-BÞeß© ¦ §’Á¯¡®Z¬…ÓÏ‘ÝvÍ+]ñrDpX |“¶´(@¤šûU3ùoOO?†KOŠàÅ55#ÍyÖIõã uð]á‘H®æ*ÌQùGb¤—˜n×]ßÔFÆF._oå3U-$QË+¤¿êövÄ•†(;Òi\®×ëúˆ4È¡Râðc¼æöðs%1Ø`e ‹K R á™ò?Ô›V7¬úJO@p|,kóˆO]—½”º$Ý­Ú:ÔU%¥º“ëqy¬¼a@ý}7ÎÈõ¤Lò‡¾>ÎU•ä¦]Šäž.UŠÛ;Ôucu^^ý›ê…S‰ÝnTVð’1Å8”J{TÚ¼õ~Ľ'†S—K,ÔéàeYüª˜Ôé9¯²Ç*+¬Î Çz|†-‰Û„2 G·}¥(G +ÖŸˆæ.Sxó8÷Q6è™ÖDž—º ÃýñWè°¨^ߘ2 / E‰ˆ!ç‡_4èÏ;½!³P¯)G¨È© Ó•µ³µØ¯óòÖ$ÀcÁcÄ1t¬óËÖj¨zû²uÓÊWq~>07–ׇ"Rw#bã8m] ÉŠ÷öî;„ÈåôßÎsÛ>äè_`CU½Ù_Ü»žÆnª^¶)kÕÆàZ¬³–l"ajÁ!1t!“Z¾+‚Á!–æÆÃm÷S³kÜIòú±úÊeUšN+p†:æýæo·ÝîÇø”çjwÒúôP1Üîµèu“ˆúœ:{]œg·º~^µÅÒÙ8Þ,ÜãÙ鼯ª9U é~ Ą̈QÆm®Â-Æ( ºê²’6ÕßåŠðoü ÏÏŽ&'©Ù£ª Åd¿ñêtOÕ—WëÛÀU‰x5p2èhHûLžÃL‰„ÎE`ÄÜø[-Õ‘‡Ç‰Ë8=R q¢…n[úâæ€Ë :¦z÷íéwÎW1$®Oúõré%qx>"Tk ØÕTIG¨ZH¶OHÁèX07î½Çîy¬’Ôý¬LÊý†£÷äM§© Þ¦Ò-Õ¬Ãu+§&?Ç¡>èN"óxŠàHc „‚·É›íöŠ:»Ì|I_ú‹u¯ÓQ¸î$‰­…<»®ÞÒí¸aˆq­V”&õ¸:iÍ<÷ÑÌtG©(ùQ‘¹µ[o‚7ý.p»{»;ÏõtôXÅ\1“~(õz«þrmWÕm÷©Õæ0I%š^uøW¯ÉóÐaþ€ik°–Ž^Ê%#›],·ÿÑVõhS>«lT,³*tˆß†ÞîîèŽ«Ï ˆæ‚T|}®û†àUwö® zýb'ú­0µý‚g¿üPæ6×ju{•j?ëðÏûèìÞš¤B-¢è¹Ùõ’±{E™µÕ$oºÛœt,§o·ÝIö9$ƽ\¬F“tOÖß_ê8}JêzFˆédŵRó_© wÕ]êì^ÇÄs6­&ž+‘Üû ®”¢4Êh¼ÒÌ•¦Èwûï·»4í|NÁ€à|ÎN¯šZªëNµANây¥.ÖôR¿X”P݉¬æÉ¨Ýq•HT5bǽ}ì}9Üô¢‘i7”a¹w ß8k¨0Hcoš,©àT+½}#¼ÝqóáGîNËA®j5ì:õ‹íõNGz¡÷Û«ŸLožÈ»ªµ†ëç>õ¾,^+\ËBôý»ÄÏGhe5¶ÌC*4®„ØT ñÓ÷‚ÛW—Ê4þZÓ{©þ-}·aäŠÜ·á¼“•,eU¼®¾Ý™ƒ#Še‚Óéàê[Õ–ÜÞøèø²œæ_`b4^Zù<–™>K”é¶ø­½j¨¦’´Ù½Z;÷|¯O>_!~{ë;ª“ŒµšRï*Å×®”Jp’)FG½ÖÈ™—„!N2S&„¥^¼šÀ@³¼0ãó…oFooåFË}JO…é¼Rç:êg¸M}•ÿNÖ2~!m·ÚñÏ£M,ÅOßj}ìêÄq¯Kïi-‘èlš Û§2­œRù-LI·nŠÖ~;¼IjZ¥ £×”¤] øÁm›™« \ÝF*ÿØù‘tõêzίç¤Ö d«…þÒ¡@–› …À¿7ÐõyFóµPŽŽÆpðFÞÔæàÍÊ©,“Öé U£¾ÁI®Üd°$™ê½âRýP«½ô¬žïª«W6žß%“ó{ãuj­×TkÞm¦é„éhFd`î'Äs1æýüBx'ävÜ /1åÖoByQ~i!ÐÞ}S¼ÕU‡Ò²gÙ0ëkº¯WáÔ«%7aL]××›_]™ÊZ7`'­¸»¿CQMT9Lx[cÎÚ¢ÅM¬±¢3*Šhªù2Ü81…7âíë¾!ÞÎλI9„iP˦Z<ÞzÖNßÔ‰v͇”o~{¯_½àq×Ê_u ‘›žž] UGòá¸äZãã4ÅÉà•jòTˆ(Ò™ÓO"½Æé+öCéó¥:©ú¢Ò+)Ã¥‡×›~Óß¾¬þª6=¸zµ°ºV—„ùõ1‡,/coY©„Â3t‰ž\*‰WúŠÝLrª6ÞÝ}o‚Û­røú²X£‘ ǘ;UV›Jëæ)ü„nþ»%ÔëQ`EqI!ÛÙ-¸d7:CS«<*ÍÖæñ9™õmv^ÜC©ñì%¤ I2I{¿í½àiµ´W/qÖæujÕ⼔ԻΩWçLºs“›j Kœã9Ž)™ð‡ÓFa’ª¤¦–s‡ì2ìþÛãm¤’Àl®Ãa†zæƒ s«“§NT½6„®6÷–MÞJ]êÕÙTG½”TÔþÒã'²›XLnšøN!÷­8MH:\²¿ðœ^p•O¥òÑèCÆ[ð/4—çaQ/ ©ËÃ' þÓðï+êÊã'+•¦êÿÏ@~5‡u¤"¬ïÞIJsŠ\ü¥é¤Ô©·ñÛ¢m¸‚ª#6\<­@Ë‘ñ3Ìó0¯DÕËU¯­\õ›¯u¢ÔÛ}ê‡HVyíùk‡«í×ú Ä:6%àűä=ϹåUNIÓP¯±Î}s¼À¡Lù.%©¢¯ês–úÊg!Ì-Õ±ÉóD±~.ÕÙJÆ'¤oÒ èNîÐmgìr8"AŠêrÖ0ú¤"ƒ! Úé;Ãm¸ÒKåTSöŸÃ/Ìó²,ƒZ–3ZèJ½4®ÞÔü¼Ò¸Ü¯Ì6ûg*×åxéã‚5–N±ÑN3épÉB€ÑzcïîàNÿ5ÚÀÔ`ÒÅ7|²y¦Ô‰Xžñ fž(-Bcâq±A€Ä¢×}£ÃF.$—+±âwæa*Â#’#¤ÌÏÀ—ÃBn3„¥¢¸ÿÕ-JUóÀ«)‘“¶0–âÞo¶áí½ˆãÆN_+k ïG°C@Š#|Ñsº[](…P³ðÙÛƒÄ%ÝnG7,)|ŒÂçò)‡š5…4IŠuèå2Ôúúy%mÈnv ¸œ pk½ú÷:Õqç+ùò+}•gz©®r¡žäÑ“‡8cgÊ~ðã‰ð¼p-…⻎+ÅkÏ4/¡þ/ÊDUÍqýÔïhúª“<…¢C^æJq Ë8ÞZ5äõ¸ÀšÒÔ„¾–O]ȧRº0¤E0ZïgçG8|£}Õ3§\ãS¹˜Gn£Å×?ÜEZ '<2ÐRJ´ª´äÀÉíè±…êÝ jÃÛGû‚|•G_-Me‰œ…“U†EÞò<¼9VDìœ:ÌÒXCG=Ï¿ú ãÕRñ@R4¼£5îàaLWuðO>½ª à͹VùˆG‹ë[èS¯Vú­Š¸<§ŽÅ¸‹À-År fâ¸rLi)¯ýÇA`´³.XÚ@‹¤ñ€ë‹‹Ð¯%Vàì7q¸Têp„,?\O5@öû:Úº—CòxAç=Ð’fÀòüO2\6²4..ÀTDå_ÑÞ¶XïE½¤¸ßä¹kjsšJÕ0¥æâL©¥?_Ú¢‰"Nõ}Ÿ{?yâBý-”ç-ÓÐR:2ôh-n54¼Ý²Íìé’7­0ñ»©Â _‹:²ïG2ɨҚ)NȱÌ^IQ¯1X\žñ­[ë¶BÚœÒÈË’[ñ߆øP¼ÛÀgcs–:ô¤7è-Åm;ŒðZ¹÷Æn®ðFå}b·kÑéÇyÓ9¬\Ë"ž3ôw” ?¨\ƒÂ"v¿oÏéMÛ³„m x<#r{ß'é ¡!îX‰ þ Ð&Þc°€»Ö®¿y–5Å]¬riÀy\û³$ðÎR\¬QŽȯâùú–/|ŸºÔΔæ,oñÛÜG;òN½n3²cĆÊoðÐê—IS+ÀÝæ·¹§»‚7où¢‰÷"±ñ)Ô£kxû2.5ûÔý6cl‘%|9Ÿ¤ÊIáÒØãîØžÎ/’¦v¹ƒ:Ü*Þf¤µ{I«&°3%Ac©$üc×"¸/”¦ÇݪC%‚3¬± \á{K)Ãñ»¡üº—‚8ZS¸Q¼Å8>¿€X :*—˜xlxû*YCŠâæ[Ť uñ=F|Rä2ºzMë0|¹´á’£!—f8ÌÀ§fá7t¨‘=+§ ±e¨_ân6~£Î:ƒE^@À,&…KjÙ7‚ûrˆ#À · ¸½;9€Ã¸M{'ÊÑ©§ý¾áí‹•F:uËxÛýÁ&„Ñ™0j>6Cà©ùÓ/–§.j¾a xpi9zÊå^’SÅ9çCûz‰Ã<ÜÝ0à€ÄÝÑÒœ¡êhuº¦5ÙFpÍ.Š·qô”'ºð“æ“Õr Á5»lŽêäÄ.ßÙÍ÷ÚøXel÷š]6epÚGÍÉ)ÿ A§)ªÃiß¶„Úì²gÍH"y$Jp|ƒò…cs¨Í.ÁM´ (=Ô˜ô„Ƀiš\Í.Mp;^€ž’¥œ\÷ oÍ. ¸ÝŽ QG÷éAª#Á¶®Ù…S†Ýèo 2z ít®àš]Ø£îS1DŽÏíÚÈ—ÅÛO¨Ùðæ]F—D´ÓíÄL³‹ÛˆE_ÌHsÚàé*5àš]žàˆÉ"%”6ÒøònKš]šàlNˆå„à&’²i-­f—&¸R!õî©ì(¤kµÙ¥gÖÉ)͇𠾺yÔfö¨ÄgäEq0ÍÁ5‚kv‚CÑ$I¸kˆàÞš]…àdÜ^ðÜdÀ[¨¡Ýmvi‚£ŒzôÄr)‚#6‚kvq†ãj¯Iu^žaÚJ"Í.Npd~ÊØ#‚ oÍ.Îo¾@øü¹URVÕíÒs³ Ûž"8cIK•ú ÜÔ"­$Ó2†f—v¨”Úèå!pÞ€r«Þ͇Úì)jÒº ²ˆÕÛ¶‡Úì gR~U‚³M¿ÙRÔ¶q® M-”±¾EpÍ.7Û&“b7?å”Á7%‘f×!87êƒg¼!ð|Óºlvi#‚£°ÍNy]‹=ªñ­×ì)œ-#¿Ü·oC³+xÔJŒ«4µàš’H³Ëã ‹p¤v)g…à|ÓŽnv’º*ï£ Á¡’H\³ËŽDXÄW—.**‰´ µÙÅmå7ž€#$V뢨®á­Ù5B8ÃêªI')\Óºlv §b7]ÄD°&25À5»ÃYÖF2$+b\&¸¦ÍÕì _ps&ër‰Gm?›f× 8˧,X“RTmlûÙ4» àh4d¥“Ô´¹š] oÑÈ|šƒjZ×ìJuʃåyз\³ëØç¨kïWZÍ·ÙunM¬Éƒ¾àš]ÉöãXé$eÚ6Ÿ›]‰áx6‰‘Æ+Ð$iÓ~2Í®8™ö]¥ mÌ·ÙÕ.Oû¦@Õ“šGmvM‚Û¤ ¶e¨Í®Á…’2Áµ µÙU N–S†Á5»àdºNLÃ[³«\¼”@® lv5Ï¥ M»¦Ùu=j}×~.Í®¸’2xIZS«ÙuC8#Ü8ehzåÍ® 8“k"2˜Ôj¾Í®—28»MÞš]5gؤ M¯¼Ù5gEg5§ ­ÇÐìÊÇ)Cžkr¾Í®¸hÒR ×®Ù5òQ{ äàš]7„3´o/Zù­kßìŠ6b_Ë–‹ oÍ®Îp!òH7ZS«Ù5 B8y2 eòMSƒkvU‚-xQÖ ÄžjËš]=†c9ß0M¸©Õ×ìºç_Ö2“7Àrí'Ò캴w$è °3m°¼Ùµ ë–C’Ú"¸fW·ýÄـʹšH³OˆáøÔQ˜¢Ñms¦Ùõ]ªß‘ryœZµÙgPÜÎÑ•{çÞš}Þа¥5íÞš} âö8Ú‘ÊfŸ…8:sß×ìs²7¢ÜªixköYˆ³õ"\³O1ŠáÚÍ™fŸÄM¡®Ù'ζA¸fŸéR±yßÚ¨Í>áâdýØ×ìÕViö™××ì³×~Íš5û®öÿÅ³ÓÌIEND®B`‚Kajiki-0.8.2/docs/media/Logo.xcf0000644000076500000240000005341212554436352016425 0ustar amolstaff00000000000000gimp xcf v001,,)ÿÿÿÌÌÌf33f™™™3ff33f3f33fff333f™™ff™™ÌÌff3™™3f™33™3™™™Ì3™™ffÌf™Ìÿÿf™Ì™Ìÿ3™ÿ3fÌfÌfÌÌf™ÿ3ÌfÿÿfÌÿffÿ3f333Ì™™BBgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  ,  Backgroundÿ     ¹, ÙVæVòVþ, I $äìôüs'Ú0ã3j6ž6ò9-@LKäPP PPUÀV]VeVmVuVÞþ>?>ý=þ;ü<ý;ú;þ:þ:ü:ü:;ü;ý:ú;ý:þ9ø9ù 8ø8û9ù9ú 8÷ 7÷  6ø7ø 6ö 7÷7ø6÷ 4ñ  *ý ùþ  )þ î    þ þ ñ   þüå        ý ú ô   û þø  þ!û ý ð  !ûï   "â   #ä  ' #ð   ö$  $ ì  (! ý $ç    %÷   ù ü%ô  ú(ê  'ð  þþ$ ò   þ'ó  þþ&ð    )ò  þ' öü(ñ  *ø÷, ö )ú  üù )ýø*ê   )ù ý+ø  þú*÷  ú þÿ>ÿ?ÿ>ÿ>ÿ;ÿ=ÿ;ÿ<ÿ;ÿ;ÿ;ÿ;ÿ;ÿ<ÿ:ÿ<ÿ:ÿ9ÿ:ÿ9ÿ9ÿ:ÿ:ÿ8ÿ8ÿ7ÿ8ÿ7ÿ8ÿ8 ÿ6 ÿ4 ÿ+ÿÿ)ÿÿÿÿÿÿÿ ÿÿ ÿÿ!ÿÿ"ÿÿ"ÿÿ$ÿþÿÿ$ÿþÿÿ%ÿ%ÿ&ÿ&ÿ%ÿ%ÿ%ÿ&ÿ&ÿ&ÿ'ÿ(ÿ(ÿ)ÿ)ÿ*ÿ*ÿ*ÿ+ÿ+ÿãõ   1üû ý -ô  ü +ö ü ý 'é &ç   $æ  $æ #é   þ!â ï  ô ý æ üþá  ý ý ñû ýó þì þò   î  ø ö   ñ ß  ú  õ ø õ ü þûúõ ýþø ùù ú ü û  ö  ýõ  üù þ ö ù þþò ü ñ   ê  ýí     û ù ÷ ö ýýù  úö  ä    ÷  æ   þþ  Þ      øø  ú ï  úþð    üô   ûýô   û ø  û ï í   ü÷ ö  õ ûýþø ú  ü ó ÷ö ø ó  ýü õ  ì  ø ð þì   þüøþþüöúûàð    ã ÿ2ÿ.ÿ,ÿ(ÿ'ÿ%ÿ%ÿ$ÿ"ÿ ÿýÿÿ'ÿ*ÿ)ÿ)ÿ)ÿ)ÿ(ÿ(ÿ)ÿ)ÿ*ÿ+ÿ,ÿ-ÿ.ÿ.ÿ/ÿ/ÿ1ÿ 2ÿ 3ÿ 3ÿ 5ÿ 5ÿ 7ÿ7ÿ8ÿ8ÿ:ÿ;ÿ  *÷  þü'ë  &õ  ü þ$í#þ ÷ü!þî   ýñ ù  þé   üþù  üðô ÷  ù ý ûü î   ýù ýö ø  ýúû ô ýø  ñ      õ  ûê   ú  û ó   ê  ú þö   ù ù ð û  ù    ÷  ÷ û üú ý  ö$ þ þ üü ô'ðýþü ÷ ýñð ì (  ü÷ú ù ø   ú  ü÷ö  þ ù üþýúüé   øû÷ê   þüö  ò   ýðù   ï   þüù î   þþûø  í    þõ  í  þþú í  ûþúã      úò  þýõøó   ýôù  ö   þüøû ýò  ùþù ö ö÷õ þøùþ÷  ðö ð   üþ÷   òþþû ÷ö #õ  û ü%õ   ù( ÷  ð þ ô  þ% û ý+ü þþ÷  'û þû 'úô   (þþù  *þ  þ +û ó , ýõ  .ø  0ûù0ñ 0ñ   1û ü 0þû 1üü 1ýý 2ùý 2þý  +ÿ+ÿ,ÿ-ÿ.ÿ.ÿ/ÿ/ÿ1 ÿ1 ÿ2 ÿ3 ÿ3 ÿ4 ÿ5 ÿ5 ÿ6ÿ7ÿ8ÿ8ÿ9ÿ:ÿ:ÿ;ÿ:ÿ:ÿ9ÿÿ9ÿþÿ9ÿþÿ9úÿÿÿ9þÿþÿ8ÿþÿ9þÿþÿ9þÿþÿ9þÿþÿ8þÿÿ9þÿþÿ8ÿþÿ8ÿ>þÿ>þÿÂþüð îô ü ùþýö þ÷ þþý ÷ ñ  í  ý ÷ò÷û ù ýò ñ  ýýûûñ ù ÷ ü û÷ ó ûôô  ýõ þþî÷ è  üûþó þúú þô   ö   û÷ôú þþøþú  ò þ þúüýô üùûþúü  û ûýþþñþ öý÷ ö ûüþþþý õ ðö  þõþûþç      þþöúõ  ûþþþé    þýþì   þþþþþã   ýþùê     ýþýë   þûöüøþõô   þ þþûýø û  ü þ þþ þü û  þ þ öþøø þþþú þ  þûþúû  ü þþ þ÷ù  ý þúüø  þ þþþôúþüþü ú þþ þ  ú þ þùþòþþùò ý þþþþô ú #þû û þûù þ þú þýþ þýü ýû úþþ þ÷  ûûþþ ýþ þþø  ý þþ÷ý þü ûþ û þ þö   ûþ ü þ ýþþýþýý þýþþ þý þø  þüþþû ý þ ü þüö  ù þ ü÷  ü ýþþø þþúþþþûþýùùý  þü þ ô ïü  ù  þ ù þ<ÿ=ÿ>ÿþÿÿÿþÿ=ÿþÿ=ÿ<ÿ<ÿ<ÿ<ÿ;ÿ;ÿ;ÿ;ÿ;ÿ<ÿ>ÿ:ÿúÿÿÿ9ÿþÿÿ/ÿüÿÿÿ-ÿÿ,ÿÿ,ÿÿ+ÿÿ(ÿÿ(ÿÿ'ÿÿ %ÿÿ $ÿ ÿ #ÿ ÿ "ÿ ÿ !ÿ ÿ ÿ ÿ ÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿ)ÿ@þ=þ;ü;û ::ù 8ø 7ø7õ 4ù4÷  3ó 2ö  3ò  1ð  /þù ý.ýø-ûþù  -þñ  ,ýù+í  *ùú þ)é   (ü  þüú ' þüü&÷ ð   $î  ö #ö  õ  !û ì õüù  þù ï   ð   ö ýûó  ï   üúüò Ý     þ ú ê  üýø  ÷ ô÷÷ ø  ü ë úýûþôûùþ ýüà     þ þ÷ú ê    úþþþä     ýï  è   úø  þó  ñ   øõ    õ   þþþýþ×  "  ýþô õ í   ú  ì    þþà       õ øû þô  ý ù  ÷úú ö ó ì   ýþ üöû ú  úøûüöþþû÷ ú ùþýû û þùó þþþþ ú  @þÿ=ÿ<ÿ<ÿ;ÿ:ÿ9ÿ8ÿ8 ÿ5 ÿ5 ÿ4 ÿ3 ÿ3 ÿ2ÿ0ÿ/ÿ.ÿ.ÿ-ÿ,ÿ+ÿ*ÿ)ÿ(ÿ'ÿ&ÿ%ÿ$ÿ$ÿ#ÿ"ÿ!ÿ ÿ ÿ ÿ!ÿ"ÿ"ÿ#ÿ$ÿ%ÿ&ÿ&ÿ'ÿ(ÿ(ÿ)ÿ)ÿ*ÿ*ÿ+ÿ+ÿ-ÿ.ÿ.ÿ/ÿ0ÿ1ÿ  9ù 5ú þ 3÷  þ 1ò  0ó /ö  û,øý ý*ø þû &ô   ü þ $ö   ó    þô  ø ù  ð   û Þ         å   üá      þþô    þ ù ûí î  æ    õ   ûâ é   ë      ð%ø  õ   ö  ÷  ý ò    ñ  ò  õ þ ô   ýó  þ ò   ýó   þ÷  þ ýó   þô  þþ ú  ýò   üñ  ýñ   ü ñüø  þû ûó  ë ó û ö   û ô  ü î    ö   û ò   üþþþù  þ þ þú þ÷ þú  þ ù  þ ù ý ú  ý  û ý !ý û !þ û "÷   " 3þýþ3þþ8þ8þý6ý 6ý7þ>þú ý  þøþù  ö  þý þù  ý þþþø ý þ ý  ý  ûóùþ û þþþü þúý ýþûù ýüú õ  ø þ ù  ý ò ù þ'ý ù  ý 'ü  ú  þ 'ý  ýú  %ü%ý ø 7÷  9ü  å,ÿ-ÿ.ÿ1 ÿ2 ÿ4 ÿ5 ÿ7ÿ8ÿ;ÿ<ÿ=ÿ=ÿ=ÿ €þ ô òþþøí þþþþ÷ ý þþþüüï   þ÷ ûþ þþþþþû ÷ "úø þþþþþì þöý þ#ûò üüö þþþûõ  ø þþþø  ýó  þõ öþþþ þü ý þö û þûã    ñ  üõ þ þþó øù !ö í  þüÞ  þû þÝ   ï   ø ûõ õ  ýüþò þï  þ ýþ ù   ýöþö ýê úþû û   ÷þþ÷ ü þûþþ ú þýýþûúþþû ü þý üüþ þû þþ ý ýþ-þ ù5þ ýþ2þû1ù þ0 ý8ø 9ø 7üú4ö 6ö 6÷ 7ý8ü þ¿2ÿ 3ÿ 3ÿ 5ÿ 5ÿ 6ÿ6ÿ8ÿ8ÿ:ÿýÿ=ÿ€ÿþÿ=ÿþÿ=ÿþÿ=ÿ=ÿ=ÿ=ÿ<ÿ;ÿ;ÿÿ)ÿ ÿ&ÿÿ!ÿÿÿÿÿÿÿÿÿÿÿ þÿÿ ÿÿ-ÿ.ÿ/ÿ0ÿ0ÿ2 ÿ4 ÿ4 ÿ5 ÿ6ÿ7ÿ8ÿ8ÿÀûû  ö  ç  þþýú    ýë   þÝ       ùü é     ùþýì    ø þí     þð     óûù ÷ ÷  þþþþþþüû  øþ þúõ   ùþü þþï   üýõÜ ü÷üñ   ø ø   þë    û  ï    ù  û û  ÷   ú  ó  ü ò    ê    Ý        ñ  ÷  ý!å    "â   "ð ô "ì     ù  á        !á   !â     !ï     ú ü  !ô    ù  û ð  ù þô   ú ü!ô   ö "î  ü!ò  õ   ö  õ "ô  þû  !ô ó ý õ  þú  þüý þü ø   þþó ï    üú  ø  û ùûþùü þü÷ þ ó  ýüüý úýú  þû þ û ý ü ý þþ ö   é      ù þþâ    ÷    õ   ó ý ý ü ü ü üþ÷  ù   ü ü þ þùè      þú þþúõ  ÷   ý  þþñ  û ø  ûþç    þü÷ö ý ýþï    û ú û ÷  ø  û ýô   ö  û ï   ý ÷õ   þù  üû î  õ   ø  ö    #ô  ò  "ê þ Àûÿÿÿ:ÿ7ÿ7ÿ7ÿ7ÿ7ÿ7ÿ6ÿ6ÿ6ÿ6 ÿ5 ÿ3 ÿ3 ÿ2 ÿ2 ÿ1ÿ. ÿþÿ+ÿ0ÿ0ÿ.ÿ-ÿ-ÿ,ÿ(ÿ#ÿ ÿ$ÿ&ÿ*ÿ0ÿ 4ÿ8ÿ]ÿþÿ=ÿ9ÿþÿ7ÿþÿ6ÿ 3ÿ 1ÿ-ÿ*ÿ)ÿ(ÿ&ÿ#ÿ!ÿÿ!ÿ#ÿ#ÿ ú#üþ #ý þ$þ %ü%û&û &û  &û &þ 'ü 'ý(ý(ý(ý(ý (ý(ý(ý(ý(ý(ý(ü 'ü'û&û &û&û&ü  %ú  %ú %ú %úô    ø ø   ö ü å       þ þ ó   ê       þû ü  ó ü ú ý þ÷  û ú ü û  û þúû  ü ú ü ýýü úú ú û ù ø  ø   ô   þ ýü þû  þ÷ þö  ýù þ ö  ý ö  þö  þó ÷   þó ó ô  ó  û û Šÿÿ &ÿ)ÿ*ÿþÿ$ÿüÿÿÿÿÿÿÿÿÿÿ ÿ ÿ!ÿ$ÿ%ÿ&ÿ(þÿó  û  þ %ø  ñ   &è   'ó ø(ð   þ)ë   *ê    )ë    +ì    +û   ô   ,í   +ì    ,í    ,í      ,í    ,î    ,í   -þò   -î     -ï   .õ ü .ï  .ï   .ï      .ï   .ï .ð   /ù   ù0ö ý /õ  ý0ü  ü ý 0ö ý 0ö ý0ö  1ö ý0ö ý0ö ý0ö ý1÷  ý 1ù ý 1ù  þ2ø ý 2ø  þ2÷ þ2÷ þ 2ó  2÷ þ2÷ 5ô 3ô3ø6 û5õ  5õ 4ö   5ö    6÷ 7ø  7÷    7ù  8ù  8û 9ü :úÿ&ÿ'ÿ(ÿ)ÿ*ÿ+ÿ*ÿ,ÿ,ÿ-ÿ,ÿ-ÿ-ÿ-ÿ-ÿ-ÿ.ÿ.ÿ.ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ0ÿ1 ÿ0ÿ1 ÿ1 ÿ1 ÿ1 ÿ1 ÿ1 ÿ1 ÿ1 ÿ2 ÿ2 ÿ2 ÿ3 ÿ3 ÿ3 ÿ3 ÿ3 ÿ3 ÿ3 ÿ5 ÿ4 ÿ4 ÿ6ÿ5 ÿ6 ÿ5ÿ6ÿ7ÿ8ÿ8ÿ8ÿ9ÿ9ÿ:ÿ;ÿõ  "õ   õ   !ö "ö #ú $ú#ý %ù %ù   &ú  &û'û  (ª @@@@@@! ü:û ;ü;û ;ü ;ü <ü  <þ>þ!ÿ;ÿ<ÿ<ÿ<ÿ<ÿ=ÿ=þÿ>þÿŒŒ–„KB%!Kajiki-0.8.2/docs/media/Logo.png0000644000076500000240000004243712554436352016436 0ustar amolstaff00000000000000‰PNG  IHDRo.ïîsRGB®Îé~PLTEÿÿÿÌÌÌf33f™™™3ff33f3f33fff333f™™ff™™ÌÌff3™™3f™33™3™™™Ì3™™ffÌf™Ìÿÿf™Ì™Ìÿ3™ÿ3fÌfÌfÌÌf™ÿ3ÌfÿÿfÌÿffÿ3f333Ì™™½@ÐtRNS@æØfbKGDˆH pHYs  šœtIMEÚ ./\5·1 IDATxÚí}câH³-ênµ:H"‡ÙýÒ}÷Åÿÿ_WUGIc ƒ­Þfc`Ðñ©|j³YÏzÖóù£Ö`=w;m'­Rª]Q·žÅÏ~Óîß\ª}§VÀ­giKj[eùË‹QÒðc»~ ëYmJêN;¸q)ùËA¯·žMéÞaÍͼ}á+ÞÖ³¹ImœßÆùáEvñÖ­ŸÊz"7¥µãµÎ¼8;ÚòÀî°âm=ËœV›nœ=u@“VÎ}ã«ÿ¶ž…àvD¯í/¸}S1¼Œ^"ëYƘZp³üàˆ TgM¹Ö«9]Ï2pÓ‡—­»å¨v—ëG³ž%SƒÎÚ«Ï„8ÔÞ¬ƒÝŠ·õÌœý¯ÍJˆIu‡¾ÀmM÷®g vÓ˜jÓÊ º3uŽë\ zÐ뇳žÙ}7À ŽÝ¤|s8ãFÜ\€º~<ë™Ûwƒ¼.Õ¯¯JßÍýþ²úoë™n$to˜pÓ`Lù_ò°{y]ý·õÌmL!㦥3J¥z®1~àkya=sû†Á(eBþOóo‚›]? õÌy H8^­ÎÑÚËŠ ƒÐá»ÒÛzfuÞÐpB0 ±z‹!ƒ³±oJ¯æt=ó:o0œT¿ÒØEîHîõàAxàÝ~ýÖ3ch åR°Ÿî?%ÁŠr 9 à‹|M¿­gN¸ù”˜îÕ]¹€º7õv8¬é·õÌšbª†¢VîCHþ*(¥®ã2ë™3V@cÚa†·ë^!BµHyß(âBÕup=óYS 2íùŒS»%4Zj_sÐZã…õÌšZt¼Üo†ó×N¾BºWÁð¦}埮g>kêì&Óƒ¤‚‚t1bЧ2@ø°n=sЛÚAïe€ãL0è¶5`S¹¶úÅAq Ö3‹5%BsöS[t×ö{ ØkÛÓÖV¼­gžÓbýª…ÁÜ.4Ðoƒ¹2@Ûˆ³§+àÖóåu¬7¬ ðNuh&Üä~ïÂUGy{ù°Ó•Ý ¸õ|1V°ØÚ&ß°Hß9·ÍîA4Ĺp¯ØÝÛ)Èúè-_G´®<5õƒS°¦¬+8¸Ù7,Gu=tä^¡ ÎÝIñê¢^·qô0zS#ZH ¸¹ˆg ~ ¨d÷àWú‘à¶n7¨c½¢BW2p¥'¸Q¤` ©…€›ÔÜÈvÿàÄrë·.¸b…5U˜ Ù¿¦¦#çϹ›V¢ƒÚ{;Ûbœ¤®O(õ˜˜»ý*Ï oÓô†Y]0– ±YÉE×ÉW¤ºÖ¼¼8‡nïgPž‹k{”F[õ#WŸüÒ½ÞÈO>¨[©€Òxg­¢¶þsîW×iÈÂí‰÷îiLKRêÄ}á'–ÜMdµâmÌn8± ¬Íü QŽÝSg¹ 4äEÀ—s0•˜¹ý:Ÿ†ÕMîØŠ·á±ˆñZÅá}¿`ðoÊ\S8´)lÆV9}àöñ–€|1d˜p+ÞN|†[ð?üñ%ð¼áp?Üg»ŽÊø4ý&IEé Û„· “ÿ>àêߎ6/áÁ&eÄg£γðw@öÍ¥Òè Žq9 ª· À¥;¾Š·_íÏÔæh{tI#AÍjü:’ƒ¤¯Ö-ÆK”~Ì}ñ²ž ¸ p·áíw'ä‰9{ ÿCD)rFX)¤–º@B¼JCÌçÝ<~xó‘à üÕñ´„·¿?嶈aSÖêû‘É£€Û»hˆ6‡$Äšu sBÚ3¸º/9ܹ;$<aÚµú‡·¤tF"Uh@½‡ {xÃ3œ2²·¥Dêúî®üõ¾v!"uDfÔALJÇbhQå>úl‚„€HÇdå¬0¨ªp?Á¨NÙ°o³Ñß…¶D+Yzë©M»æ€Z[ÆJcÀQ£l¯wéâ-™\Äcò%ðHPµìo«4dãL§¬~y‘wÿ÷\f”zV?ØÂ{1Ãõ ï Äjà¦9¤I2©… ï ²$5zwð ÒÙU+ãûw_=¼¼¸ˆµ{…¹| {±Uóž,7.¸kŸåô{ù>¾)Ñpç·â_У”•ÖÚ:äÙ(3iÍJ˜Z7¾ÑùsÎkÓ!'ÌM(:(…+_‚qÞßoלYýÙ·ó±¡HîÐÞ’U 4ä6ƒ.¥yC*ƒSãøÌhÀ›Ã’1ÜC‘2%·Wg\cU§iZõ†*7GøýRr÷¼Òå”íCâí[0_6LbÊyJëb!¬*à ªöîë°С‹ƒ5𻞂†€ú¦ÚVz½U«Qcéͽ†¾Ë0×TR"€ ŽÆuAnƒÂ<ºaÎŽ‘»g>á›þìi0zzr¯š€ÆÉÞjç³á·P äE ÖEræ8ïø&ÀM¦2®z’/Ãrø.)Å›rü »sø`¥Ý;²‡ªâO¤pÕ¿îñÇ1"|¢îõ¨œÕP~0묂Yú*&W´Ú[’¿0øðâœ:»øD~=È4 >Àë>Óëˆðª«3xž“ï¨þVÈÕt±ú¡j…Ô&€|¢#:bóñÖ ˆ8UìwBéíQéà«_c¬Š¿ÁŒªV-j,½êîèpçLë˜;Ë&õçý/ǨãrØg‘}Ì (D.€9*·[(8~œ‹dÃc@JyðìKô-÷U¼•Pip¶Rh]€_—:L Ÿ×¶e°¹AÑ¢7,\¸/s˜ß½)Q{ñ3ÿJÊwÒö³it¸__ÔR[°£1:ºg%²B7RÊðÖ¡¤…~Ÿ'Dtá0°5[õz…V<h["RÃBþ$€¥Ú·wûɽ$ç?ð¯5 ?RF.œ@jÄ|sÑRC¢Í'j:F :yXžàOY8øßdIôþÖq7`_±°*¥OÒÑÃmw|ÃñAlæÐži÷÷27£ä܇=CçÃ%IsÁ‰wÃ[ík€’ļnêg MH& ŠyQ:î øÜ0÷dG¡ƒ$÷(ƒ¸Cƒcçþ3áU‚wà~fŒéì+ÕôíþN¡ÃW`2ëÀÌ9¼mäà…¥J&]lŽœ‹O½×àÿƒÏfCOeاÎò Ù¨ÝˆÇ 5„¬ðPÎEèø…wVGr‰ž¡sÔôrñ|ˉð›nа?7¹˜ÕYÙ%‡ë¯ãmsv\f¸mìÂ\¸lˆ¸ÿæ’KsÅ),V)ÙÙ,Ñáá}µ@¢™ç=GNe« y†§Ò}̘Pã¹/ã×báèÍâæðŒ]÷Ʊ?N+ý $)’{ÒÛfÆâi=Ø6zÀÞñœ*ðÊë7ËðìèýÇÌaÍû½É´ÅÚ‚Ç âÉ·íFŸ Z<¼%Çô›¡G×15ü?÷Ói’Œ­Mý&.†à<Ñ)t.4*D  ¾³î­jï ·ú»àö$`‹˜CÂ1E çí ù¤pìèâB\PÛC%ž`E†Rø ÷Ñi°d­‘“|2.T¬|ßo]ã<Í7ø$IV£nÏm<«ù‡LŸlÛ#.~U9â‹TWÂÛ­h©Ÿ m9ÏItÓÑëÇ<¬sÔßÞœ¥¢z{-Á|Ö ¨{Œ£7òÉjŸØð IåðÂ]íM§5õ^Âkác,Ä*ÒX /ËC<<†¡9§k¼á­ƒ§éÞ$·iµw;aAÒËÁt Err{ûzn–›¼ªó$”®}޲ÊñŒxƒã`e@Há/ìé€ËM¡£„¦[à3ˆ $ÞxJáY#ÙB‚ À ,¹3²%4%tްÕ5·P¥çµDŠ«‘&˜§ê[m\Má¾ð&¡%½¦wëÜ©¿¼3g~ݼW/CoŸBË)œ=Û” \Uù*µ~Ófoáêñ0À‚e&jÕ¨SU &|p‘ʈ‹Ð”c-¯mÍ¥­}´¦I…ÐýÁI”cG’wôò6¹à»íÅ´±Ÿ¡É¥ãOÎCŒCÛ›|ÓÔ0×¹ìfc¹Eèí³ät‚Ôžo, ®˜Ñò [A¯mmjŸ§…Ax+ëX+ ïn!+f9FXm‘ 'rĤ­Åþ^IjáX;ˆNc‘ýj&ÝYò×ÛÙ¢üë3)˜2ô³ÓþýpÐ[Ò¸?8Ιֹfl¦/é/ôÍYÏzjðtód‡0ך×÷ÃöíŠïØ(Yü£r0„2‚„Ù>+uP:&³†šu]Ô µs¬5H¬§îÝŽ0÷pÈ&+ÈÞjéëf@Ÿ€Co_|¾A2d²Ê±yÂã1§m£¶/b8„ !Ê(ìŒtqƒQî&Ô³Œ\Ì ÿãqëÜU†¿ªxýMµí¾äpnT÷9¼„AUgˆ!¦àDðõ¬†dŽEÖÖPá 2²j°ªšä˜‡Ã ܱÿ? d,¾·[ýzެóÃåƒuÓ4ªÙ«vß¡’d1^è:À`g =nZ¸@Ñ ÉA©m{÷‡¾íÚ¶Óªié(üŸ¾Þª®U¾ÙÅ!Žÿ°¶c…TB+zVk‹é«ù!èõI@kþ.§I ÇÚN`M_ŽQçPÞHÍR¸é{g“¿ùH{ÔÛmÛ°†±Òô½» ‚Óubûþþ¯ý[Ô|)ÖÀÅÖ}'|wqêàë€È2yÀ‰rÏ”ØöuˆÐRókA°Qsº‰M14®1È- “\J¤³©$AB²šü¥»½ƒä¼¤Ñ×Ê3F3O7Çqzëa„ÈÉ@ƒ¿:ù¯Vîüóèºk²Òé5«è0–ÿbl·ðÇÆa¶k;0²[íœ?¡œohqŠ:'x°¢Xzðù_‘Ñšäb]C¸DF¬;‚›Ñ ¤ Ùà7hmçƒÛf†²À¢ÉÁç:ÎÁÒF·F=@içnXå‘Wÿç_mÓÖí?þ×¶®[RC¿dÕñ½š>»ôGÿ=îTo•„ñfºwÐÞÄýp§ÒYªg…ߨ;ØšXùG³j`Úûäh¤«Ó‡—6ú27ÒÛdOäfÅ[Is _ .æAÕ ™­ÿý)¹ÿÏ뚨‹8ÌßîŽllø•¿Xâ£Á·=øŒ ‚ Òq4W[(—֦桉‹P÷­Ó”~M‰b(msÊ}ðÐY\„ùò";éÂúÉ ÉxZà¼MU–.~<á±Ú"âÓªÌf6¬{{¥+ú·3¨A§8}S ˆÝõ„¸Dˆô¬îu\@AÁŠ)ù¤e}!Dõé]^y:ovk¡¸¤ì2ÏfÒ°ÏOjm^p´ —ìõ«OJ¬}1S;3:~Ž·!`þÿªìt¯„·öï£hÜXüŪðWÂEŒ!ÎDØ¿^BQ¥SsZð­öþ˜‡–\ñy]è æë«&«êÃlql­jûŠë/Õ-p»½Ûlér瓦|µÖ€°’ã¤Ò˜ëp§AxU­þßAŽý³«  ,ü .@…ãþŠÎ`Ïãv6„³ŽåtÊîµ°Dˆ8í…ø2±ñÄ—{}¦¡'À£©Sÿ2Â& _o×l"¬OOÛ}­20;2žSjТš‚Æov·r¡Cçü«¾W}×tõÿûp€cÿpÑBå-d•#ÎE¢žÃ¢«æƒÔ~G¾ˬpÂ%…À-BÎ+Ÿº}õÉ¡µ‰’Àœz29ÕóC/“L¥X?ß•|ÙúàÁhœÏ¿´‹ðL~¦JÔjP7 2¯ˆ¹BùJbNí5q˜ÔF}üÏîØuÁ\V9¶ dõ†“,ª»ucYl1Œ)¼'oÎîÒƒŽË¶šâT"7ʼ™LÝ‹gârT&Ë4-„s pŸùXî@ ü7dµnÄÍ­CϬ¥Ê÷‚wZwPÍÊ̪»^MóÞ·ªñhi;ØØÑ6,F•=‰¹v;Oiɉ£Çx‹šÅ³%ì&-F=šV¨Ý’%5¾§3Ò8]-DÒƒ£]ØaêÔ×"À˜« =Hýê8î\ðpn”êÓWwÙNµ'×î•k Ò.œ Ì'%s¦ŽŒÖv4Ü <–ÌiHùz“Ù‡È"YÔr@°àÎ5ÊýïNZWÒÒ'z¹`yô¨ÃH¿ ŽÔ<"´§Û–¤¨í+øt\zÃíÈYÏ®í®Ó±¥R‚Ü×j¶²CÀ9¯ª!@°Œ¶¦:‚÷à TÅÔ[¿«bÊŽ ²),«Kø ÌuÎÄ·Ú,‹:“ONœGžÌ@„9D¤ŒÕ/Ú¡t A9(; èRwSNn–Òç3Î}:wy”B!âÀ‘ù2ÀPTm|} Ëá¸ìb:—eb9{5D`Uôã|¥„Îñ)Å-ÈÓ d& Aƒ(!Ï!™ŠD-‚hfôñÂèj¨÷[!9и´6¸îÕ'¯íƒÄBxs.´ê:0.wAÜ1•âÛöØ‘Š pÜ®U}nC“1ݱ2ìv…gR÷+Eþ¶ŒB¼Ë^Ô+àBÖö¸—Æ Ra,¤BÏ/(.íÉô]³ÁE8««>t•Ö'_,=;Þ€ÓЪ tPwGnåqÊ xÍ!pÅÁS\ÌäV™} vó¿vÉŠF–ƒÿû]°ÃÀ`UQ ‹y–ùvTh°æuEC³÷¡‰¶ƒˆ4n" #"ÝI¯Jõ{tØž¤­ÃïÛgê?oÀiði¸[ƒ?ÊÒª{­•Â~ËþH9¸ƒJŽovYºE1d6vj’emš*·¥…˜'‹Ú>!¸®y`ÍõQ£ª ÷¹ÞA½Adµ-H²¼¾¸î@ýðê"qGr`]»gÜL¬f5hù9´qBÛ]©ßQœÒÝñxDÈ9ŠÓyŠÃÄo2¦HC¬Ê4aŽªÿÍdöm9ä_ÂxÕ½lßCZ”0¥0Yz”€J宨”9®±I.è-A-º€ n¸6éÉÍê hsN²óX:Chû†½ÇǾí%=ö¾ìÔŠ‹Å)L~„Œ.‹©¶Ýn „ßú+zEØ„ —׺rÓÒ$$¡ÖãÖ„Lp˜wàQ†ÄÄÚ¾OÜq%êÉá¡ßgÆUµ¿l{gG[èÎAn¾}ð;~ûþcç6Gtïx½ë.¥jÑõÚEŠK]Ob;0¨Xøš–y6Œ‰i€™º´ ÂÙ 8}üнhYWú…¿Œã06r³»¢“Ñqû¶€à’,dÔkP;C{.€hɦ }t!xG7^l©æÖtIà:¸G(÷¨Ÿ6Õ!Á,i—ië}7#÷ôCÕ·>@…ñç,_FW¶oü04Ä}ðïÇ)Z÷íÉ Ñ@•U(ª¦Êb ò%UQmHD5îwÊSum´"zå0×HŽ8~|•{eô:ˆ ›%k¼,ýˆ’ q³¸F‘ïæk dLýÂ=TœcÔî’ác,K¼a£%kXj,/™ÇyvS&pøØ ~y­«B4V©©$û66ÕC—ÆöÝy¨)Ðç‹Nœá>Ô6äµH}ÁP¹‚K¤n¯ÏîÆµ ÖP ¥IÍGwÁÏHà.ìƒñpŒvÁ²Ü s¦t÷÷8kÇR£ûV´þV,™Ä²öEVÔ‡°Kcú©= ‡¬,€±6ÓÃ50õ™&쳡,p¨ócó°_Õçå¿õ_OíÆµ{t*°w×·…î£óÝÅAÈÐC ©LnŸ²¿wÔyÉ&liD\?†.XÂU••X>^úKèÈ"6Q݇3$ç zèiuy”` š²ò¸½ Ô…Sƒ:…°­žÙ–’¿#¸¢EŸ ™ŽØÞ>èO’ÜNA} í/!âv»+ 2œ¡g>B§‰¾?´d–ôÔŒÒ$U6惊²±sØÄ„Í-4àØÛ½CÇ%µáùˆß´„B%Aƒià˜$ÁN¹ã“RŠë®0!I8C-w_VxØ7î|¸‘Ú]6².0ùoÑÀ6A:$ÁÓL”ñÓðL²Ï,Ÿ³aŒåS©äZ5±•dž+Ú6ƒò—r?.G ó6ÆëÊa¥5l87±ªšÁ¤6Mê ®õqÿŒ€Û»(á¡UJjrÓnÌÛªñ…TÕç!f,¾7~8«ššÍê'€V«²Œ+X°©J}Ì\¬ÉºFr«ÊXµ+S&XõMj_FkRÖç¼.†§CÕ`âNb‘?®­~Jcм¦Ðƒ£–ŒpÝ Óö ‰$)–‹8$ª>&̪êï]4¦ŠMNd±jª1œœ‰ Êb9¿¢L]5R½)Ÿž•EV/úµ•Úl›£tÖ5ӕ˳Â~ôÆKrý¾¡éé§ÔÀ%|moE2¦òÁ)#P™jûLº´v¬9™–H*•‚÷Æ&ãJç͇þôlæ°èib'Òp£ _ ÛºmiŠö±ÆáA¨®†¡V9çîvL?àíðöSZÊ»E¸é‡ïŸïUï§ezV•¥ÎÐìA™Ûž¹Šž :‰ªªAÔ:Ls ð’L”ÍpcƒL­ùèÿVDœ’û­Æ¦`i|ëHö«úiT̤Æá:µÊ=Ü:ƒ¾fTÄ4ïC4¼]QNÅÒVß´}æç“‚Èhb>:ÿý©8!C ›üZù—|кH¸%G²Ì$gHÝíÔ_Ð÷­µB6ZâT4÷©‘¨A]%(à Ó6†Ó®/(D<“ëÓ Ø‡Õ’ÖqÈ»‰'écö™ßdÞê¨î²Á™¿s=Õ¦™ž  ¿0´M¾¾!ÊGû˼Ó  Æ&rÁ~ôÅpŽzÛ‚6‹VØlLh" *®éœû&£tæS Žò ñ” ±&–ž#¥ø€G®oXRL‰‰ñ[>0Òœ"¶‘jWYÖ*ºÑ‹ô0«ÊGdž+;¢‚æDê\ñêþ$¿ä +¬1Ô†† )ØÔÙÂcb0¨“¤«ùøˆƒîS‰FÓRqÞoˆÕÏÅn@pØ,€k{V@ Kó¸Võá%V{6-2Ñm4É,Wê*异–¡=W¥›´Î, £SޤÙ•»6©ßÔqHŸvÜÔ8vƒ!«Ž+ˆo­÷ÝÐÈk‹eÑ©ç™ "‡SwM:Ä3 IDATš;ÀšVÄü™º“úþ„ëvÊ[KATe~. Jbeã™ÿhYà IôÐ0G˜Ûïi •”Ï(Ñk¨ú9¸¸sDHtç˜äPvûÖ£IN¸«ži ƶkÑØÂ.å}ûu²\õ­ac‡]ÁÓÁEÎUU¡Z]åÙºá ±aÆëaZ®WQû…¼X9s¢öb­ìÇÚ6MSµÔSÑÉØôT3-ö'íZR®irÊ  Ü's×6ÕWΨ::¨ñ—ú"yê£ì΢…AÄëÁàÇ)ðypOµrÆxM`d;/ÛjE[zPÈÁ܉ޚOðŠxòx<>WÿA•·(n`…ŠHpÓÅ­N¦B&²“Å‚‹ßʆlÌfœÂ.öyþb¶o£‡ ÷l¦!B’y½ 9Of[12¥j)éÇRŒ ÜþlŸ®£¯W= "Iî÷lèŠZ“v”wØo¹(6Uþ*~G´–u›ä‰$‘šš&eI‚x«%v+aL3(àÁy”Y2¡Ý\d¢™W@®Ýnïå»)*ÎS¨ Èwã4³Öuûg{|ÂJ0Š=´Øò½ëC2ŽQŽli¿JO;oì³~\ŽfùY©S²}U5ª­f"&$¼„f•¼k‘@—­Š«½(މ¡ÃùÏj çϽÈÍç݈ÏhËh7#Ûãs6ó…Yè¨Ú›2î¯m»K‰ÿ‚·PÝ4QFT“I^(¥ø-!¼ÅA˜(tnœ †“óTé*GWÃ:ô3ˆkµ5Íö>ü¦ÔñH] Dk~”1ïv<>kï¨êw8J“ö‘¶eƒºq{|",¦?v.o2±ª¦¸-Ë\³ºLë…u#^!b[€Á‹3¾õ‹[ù^‘Ú»xðÅÌÖÖð9ïÈnn¾Tï{B`ÅSÕ*¬à“0×îCµ;ðéšÝ´Üø 8±@W ñR ÷ÜTÙ*¥¢ÇdÈryö®IrO;ÕnMØÂ®kÞŸ½ÖãZ´©KâMu‚&aŒÄJ=§Áæà»¡”ÃÏÑQTX¿ÏfZâ…n¶8šO8nÙW}¸é-Ñìäø~>j˜ k³Aʺ²`Y[Øn# ªÿÊh^5-#Ìe¾`‚ðÖ"Ô0jx_p{J´¦>³K!ƒ‰¾¼énóƒNÛ°ñÚf ¸-îYƒJ$'ôöý¶‚ý)è]éÓåÃ]±es0Ñ:.ó3¬˜$AÕ%M5umÂ’.áå ë ïUǵ«hOkã:´©‹E¦Ž½`òOP&D^y‹”C~– êÛc…“ä BãЉæÆ$…Óí …«,é4 Ù°¡©Ê§§“¶a6îš.^)¥#ÍFmµõñ(S¯ŸéÁƃ0„»ÃÕ?ŽØÞ½ûæ ÷gÄïæ1Eìæ¥Ý:)xìD?N•ó¼ãù»¦ž2è¶ðª1Ülß'gøn^1Ì5Ѧž^cK\±"k'a^®)]‡/‡m¬±Ð%kQVºbõ¡ÅüNk´§²ºØa¼ä‘†LˆðVÔÓZ¥ÁvK!7?îàÒñ¤º¨d«]¤€©úˆ7ÇqíWíèÕ_cš%ž«JÁˆXüjª¤ “ÁάvÖʽ K¤! si·bÐyÃÈáÏY‘½ æù̧{}‘A´;û#E×Ó^­ì CŒª;cL¶’[Øùrè,0œÐk%LV¡˜^¤]ñûpîÄ!zß.GQƒ!õ•®Óü¹rÇ+77âP‘×&µq3Ÿ ŠJö?Ur½o{¯?˜ +œý&βoÙŒaÃX2ø겑Á\8}Šì†c^a‹—B‚ƒ‰¡˜8åÀ½DÈÉ‘]Þ:çíýýO3w§l\Ó¾8O:©º-P×ýÜ5&-’\ÎU£ÒG"|".0ݶZþ°Œ _å3Y.$‘µû;|}Uíe # ÖÏH‡v¹š—ù_x@ƒŠÃŸv>ÌíÝçŠb°Fú!,JøLõ”ÿPkšQ\SÔ•ÞÁÑn°¨Íãmj™öblNº›ÌÚ êHU‰±j´=.Ž‚¥/4 ¿¯ÚÞ9r5*S‡ø¡Î—se)¹n<¹÷¹Rq{ºn¤ÎK£]>pê}·•œÓ§h›”é"‹Š“·Zœ¸Ïøpl¾À‚/ÓàWÞÀÄÆë¼Ò«aUª9ZSÖ(ncRƒîöõI9 X!üŽ47OâMCßGš 'Zóò¼XU@îÇo¡ƒ¤zæ|CȶÔ$%"‚œn.è§zß®ˆ,Ø9å6‚0];+Å–hœ¿ñ_ üÐÜZhC‡<¿ŸZ5YmßOÝÔãUèqßâ0צë&ÏÕÝØÈO+3!Qñ^n~Ãq.rZý·ÕT¶7Ñ{£ß  ÊNzö³[×±ïÆòa›4&‘M –b¹d S{CWÎ¥#R‹{E@ ØÄÅÒTxxÇé~,vµ[¼Þ–@©¨JcÂjŠPÛ8ßü+ð¶Ýþißc_í\Zn2†Ûž+€.D ÔçØäto<«bûyV kãh²pk§ã¼*§PÕ„ý5´dÄ!a†…2*sÝ7‹ÃhÔð¬vJZH~±)ÿ-[„ÿ¼j¡}¶ôˆ¤F‹Êfòɾð lÜ„ÇòÍ«ùnà,E\4œ4:lÒ„ÀÚû0C Ác0×~©¤ÚRó8r…ÆgB”×B2­ =ûѯŽËœwŒù8ªÛãÏœÎ|8¸¾Wìòpéœ8œöY©[t•äqË…dSòü›ŠÑæÚ½ÖP=·Yj¢õr_0tí­i×eÎ[—ª¥œt¸eÕä} ê+ßB'’3ïMƒj “ðÖi1œ^a“ÃÌsÚÒ ã^ãV¸jÄæBžU•ÏF4aw\ÓX»‡R+H£z\´Fž»52Ýb(ŠvÔËÜ{µ™O:kú[à¶y5¯Û¦|:ØÈ yŘn.Š/ÕÏWveÕpžš “d¢éY…¿x –·qĶ)qé¥ß$"üdÉíßZªneˆGmz˨ m쯡·Í÷¸êXÀqÞœñ_ó¾ÆhVMîd×ÑÑ…™èk alø‚“/ߤ¾ÍR­.a/Sí'þ~o•ÜKT¨½(z,vÝ@r­Ò-T¯022ëä {›ƒŽe÷‹à¶}…%É:ºÄ07ã³Ö$nÚÑøû©ŠÓ]B× !¦Ñˆk¦æ_¨ WÙ^êh^ÛÀs2ŒžKžÜç çL)zi+ Ðh¤™2!&t‘;ÜíÜ6°ÛËè‚9‚Ó1::+j±ªkƒŒüyÆf+z± ƒ¬ÉjŽZíˆËD¢²;ªíCíKÁ¤¶”ørCj–û¤ð’ËÑœ4²¦AÁN¹ÒÛ/ÂÛ†Ò˜¯buÚ1 ä²Röb¦cØ' éL«º7Gò®¬ÔÐ!½àX‡ÀÚ—„m…¥,D]Jü¼•GæAcKtÖ„D“¡Lˆ ™Ýý.¸m(»ôúšº!àÇÒJˆˆXKÕ×Ô®ÃÈ‚Ü7à¼Ñ€ ‹ –¢*^•ïÁDŒ"Áñ°põZµ%µÚ*Ú,Çé†L\%º{‰2=¿å€sŽ…«j²®$.¶gcS×»\ù¼€ÿvíÙ(bͺԫLñµJ©èd²Va­59râ”0Ä(2•¦¸aèE£ 4I3:.Xøeô–ð–~аµ\‡ðÔ3flª¢>ÁmìNT6NþÆ2.HÛ3þ±µ‰¤ørζJmk!½uà¸óÒÀ{KD:ë:ícš GN1ýfº [×Y)Þ|hš… ­æ¤ ž ø Á ‹™Å®j •;_hIggÇs.÷I• dÅ@ªPËu.„€ ¿èÐÕ±Góœ+‡KcÈyCk*£ó&ýª,Æéf£~Áù<\"¸N@J2ä{½IÕM®jtêªNWÕÙ™‰çOÉä|­½Ž•zM¹æÝ ›Î3öˆt-s˜ûËùsÖÆùüDx#r;n‚’—ŠRé 7OyÖÿã@ ÜüR¼åç,*7©dO³¦mÊmºç³pìlJã*Œ±emq>ùU¥®¬²Ë(h…Ùý½; ª *‡o%æ”C›•0 96ƒt†IŽ9_‚¦î‹°»Dª_ˆ·)Àid7Ÿ¡Aвɇ–µbÓþi×ܤ|óå¹~vÂâ–Ê_y›êî•mU[aââ¸`Zmgm×ÙNÀ–,RWˆW¤¾O?ˆôRO¹°›ß‹7²¸?.¸Õûp$ýòºÙ¼÷(6]¨°žLˆª·Žž{»AÔd´y•±aOg>ž&!’ª¦…âðœMÅ.ßaR ²œ¯ú¨¢Ü.zp)!ò é­\º†Ÿ±ÖÀ£ð¢Øn×ìXÒ¬M·wJÀMãŽ}„ãx#ÚÒ¼g8„-‰”`éKJá-k-êXŒ‰{IÞZSïÆÑd–Ÿü3AëWâmÚ¢n5*ŠÄeœ:c?>ße+UO*! &”Î56}ÑÞžVeƒ\>Z˜íËS´ƒz˜–s¿ÛZ’R ºgnp=šT¯Ô»‰`T¥Ýl~7Ám‹˜Á}€:MæhD龮 Àli\Â;Tó?­(ÁÎ{Å…t*CÄ£pÀÕ»ášìZ¥Vi2°2¶‡ø•Y¿ffáà^S>ˆz/]Ø$“¸ÖÃÚ l‘f… =;ÅYƒûXQâœJìSë¿ØÙ>“jª`-¡d‰RäÒÇá"%a |pÐmd:_@õ¡©¤Ø!š ¹ÿõx+ƒT˜y8ˆP'¾1Wì˜Qv® *ŸM›\K]l ‰l2Ôa§‚Š\Àß×ø‘ì:“ë:ÚSHu+ ‚—Ÿ_xƧK.³©˜>jµ‰x3úDq¹ovìä²<=<*ðÝ¿OŽ8°…ÛO •¦ìßÓ ]nª3Àƒ½76͜ %±;)Tê¥ýµh.¡ê#Ð~ŽHŸ|†¾oúb@”Îz åªØ·8*C!ihêR©_Ž·8)߆ Õë«ê¥žyÄÜ.[69Måµd“™Œ;„WéT£=tû˜ «H€âœ=U1jhuPñ!.@•Ýo†Ûp©–J©"Í?›‹æ~·Û5l·›ÐBgìTO8»ªø¹P»Ü¥³Á¼ÆDæ:-À$pœ‘Bâ*6œiF.?åÀ(µ›Í ¸ñßZi¨’jDظsÅ“õ=ÆMÃF#ÃÞ!v¾}“]»w5cXv¢yU£®—ñÏÇ©y –—ñ‚ž eÂQËUBópXßòE‡?øéí6›q}JàÙܤ }½0Æ;ÆØ`І•=hçþSŽßèæD²˜ÝH€ì𿔼ìU•²M ÆRß[ªjaNÿlmÁë7©”Œ&ÕМ÷á>õ¬}C›X«Ý.ÏÒ±ƒªìvÉØÙ,Ú'jZ§.;Û'•oij1ŒÛd’ö›Ñzod§V¼RœÂf$A¨óë¯oxîæ,ìn°Ü(›?£^êbŸ®(êNÙÖ]-›&ñ6$Ôˆ¸&njoQ%Ø Õ ö›p†vÌØ_ZɺîtÆýHêl\Ë|ÁùÀÖQ®›Þy‘Ò“Ñçþ}ÆCê™–y=`Ò»Òeœˆb«™#àÀ‹ãÚg{ÐÜ4θ®ôvæ¥æ…¨¯î¾4UÔ|ÀÍŽßAH±clrÀåì,Øc™˜ ¬;;XƪñèÃhìlØ\ì÷òõ‡–öxч@ƒTˆüÁRä3ZlR¥±6qƒwÞÐö‘ô²6ÛrLž•¹‡*_»• %•aé$i±‰XcŠýØ”‚̲‘…fùŽô½89Åau–ŽÜ¨ˆªW¼] ¸7á»|CæwæAðïš =Hß¹KµcekIÕ”#þþº6éz7S1—³9mÙåˆâ‚‚Ä ó%D fëù^!ÃhÖê¾]8íôt(験¯—Ôu˜C3ûñå±eSv¨ˆ˜d„ÈØß`‡û]ȸx<4ø+é5”b~š¾ðY΢,<ýôÐþÅž–›ußÜv5µü  1R®ôvÅùnÁªë¿7‡7‡¥ ö;o‹Ðé‘··ƒ·oXÿQƼî÷ÆýÖïØD€Êªr>¡š ,Ççe蜭·›d;VÐhþPeÁ"¾„$ÕÚvÅÛ5^œÔ²•qnk©Ý=2™C\±¾ÂÈî a•¬o°ñ®3|¡ÁËúQìØîc‡j2ÓÛ a•Ð1d©+$bµ ™YiŸ¥gŸè,HòKHq·Ӡâ*d»‚éªãâRìÈ÷3B,ó:'@äKÀCžC 6~;Û®Ib•¾éhÑ‘ÜGßïþ‡A 4È;$FÖ„ 6Å^ø¢£%Êè—a#¬!Ìš2‹ #ôpfïð‚,®ôvíùÓm‰à¼TþBeÀþ—³õ=ò‹°CB£ßwÔ‰‚lç‘ã8ϻٳ„?Gš;Û 7ÐÈâ°‰OÞßÎèwxîi«XÂe•ŠME ™Rk…û Ç#a¨JçX-õZ\ø\CT7è¥ä}°±û€ L<ç ´ó4æ #ÌO6ðW°ºWlàB4¹Þ÷üöÔL…xrt!ó‡ãËf‡f"€%C¿þVíËú‹.‘QYRq@oorÅÛgG…-_*j@뇰@$ŠC|á5Ý¡YÝaÁzÏg×;‰»°ÀW;ªfÜ7‡1DxŸž²ÉYÓ“&J±6µß Un?Ϥ ÉÌv†SÜÖZýgj»Õ™|ùB¯ò³qÎTî°&ù_xñgdLÉÞ÷;Ê¥ W‘qEíûÅ«!M¤@ÕÆOõ»¯*§ wHÃ\Á$G‡·5rC>Φ4¡—²©;´©.4a ÇûÉø!¯´ §QÝSèA9>“yhfÁ[<ÿíÊâ`8*Àz‡@¢•…! n[ %T­: þd¼}eÀYÀá¼ måá‹…©$‘³£`•`‘€·»WûŠ€Ý†B‡ÞÖÀP÷ý¥Wh÷ – ’¬ ­ÎáÎÝ4>Òe•û+­^åÂáM©öy±4ºg€´Ë’³7£ñxuHÆÍ·à˘‘ãŒE ¤Å¸öǹ8@p%•‘8êŽEìè à%dàäÓŠ8Œ±TÜQ_…·úkü·Ý]”o–SÍCýM¶Žœ¶*ùå.xœÑx7´ °ûø„¥.iI Ü/PDòÊ¿^{[B¾ô’î ¸zt&ïþÄ3¾çЧ«ëúË÷x\Ró˜ÂT̆1Ö'cŠ%ý~Vh{MoT?÷ÜûNƒèo}ÙÞ6Þm À£‘Ç{ŸŽàPoÐàŽ”¸Ü/ZGs ÒáΪGÁÛ×âÓúŠ{ˆîqš]Iq³eB朆±?‰ï$ÅEå°aí*¬¯—€·[®úeŽ\<r?›ºË)öY>âÛÜ[ÙÒL½ôÜ&üŒ=(¿¹›»ÔDt'Gñ9Oß ÷˜os;v=Þ´¤F(Þ ÄF«Pê»ñ¶(~Þ6eB„±}›J¶ÐŽ"¾”Rå¨p)äq{ü^¼-†‰Ÿ„·¯Ð‡ jó¨xS‘ÐîE­CƄĔðŸ­úN¼-‰…·¦"Ç=ªAE‚謑5”¡{‰!ÃñÎK(K\™±¨O|ñÜ=Wáí™Ù'ÇoÖDŽÖ/Ö ‚Ó%¿oÁv*Ó1Už¿ä(†»êº~6ì£×?*Þ\È A_cbDE.Á³{Ô7ÚÓÓ—{›“èº oåcžo)l˜³5dn†ƒhÁÙÔ(üÕ’e¥ÁÞ7B^ô+Qy¾÷ã ¼ÆèS%Fvœ!N*I^‡,3.±dÿ 7 ®ëƒŠÏV&ÅÏ&„q¸æq·WÇ#9pà·q­¼rtÈÃq½ÿ&¼Õñ¶9…·O#ðL“À³°8ýÈxÛþ1F„ážÓrZ6ƒ àî{ì陋}Ê\žÁÛæ¼GõóÄ©;Ö?°Euxsàâ~é)¥{QNZä”6ú[øí,»\lõø$Þ¦_êytMßlpŽÄîÑâ¡r+yئÕÉû\} àfÆÛ‰úQ áÂ[ÛjŒ nø€NóNr¿ nîJpõÕ·™o›ow‹Q•_±K{vã¾6ZViïºaà¿]u½¿ˆ·sŠoK„ ŠkË)8¥?è8zuÐí{Ï!Ô1Þê+¿ãV¼]°Ú+Þ–H‰EòP:¤àh¯‹Žß0¤ue?÷ù’Öõx[ùí®\‡‚¾†jà ï xwÕ䚪a^xì×ìééYñ¶Ámiº VSp~«¸þn¼]²v+ÞžpÛ- ÷âÏŽyGnºh~ sØÓ5rßaÛj7Þàô Wõ-x;iQOÔÖ¿†·zÅÛ=-ê>$C<ÁѺ]ii³ø7ã­>‹„9ò!?§žõLxÓ*¢ŽR"\ñû®˜™nÛ˜–wXñö´§…¤/D¤1lи ÷Ü5mhõ"õ¬K,ºžy ™Ìb€€aƒGmÞm¿ oWesgª×Uµd=Ÿ#8d9OpJÙt¿oõŠ·û\Ê€ z ÕTìÐ¥Sß„·),,Õÿvé[~ù™ù£P˜ É‚SìAáA¸»ý&¼G˜oWa?ý¯øÄ·ZTqüýÅŸ? 3fÈþŇoÿòË·hP9ZQ ‡}pw#¸3ƒ§f[êðv†F—ÂÛ‰öõË*:—¾06ª¿o—^žD“|°@U{ƒ÷x;7PzBûù† š“/²”é9Ñ#pûSGß`ó xÿéâËÁȨ¼ ©È»P½+ÜNnZÒw¹ÓFù²•>C›Ž·ÜŽbå¤üÓ}ñvùå)bÀ=²\ðà‚Ë\}º·÷,à&8îä¼óøñÓ>\ý5wê´m?9¦=Euá™oì䫦ͧð6ø$ÊêPø›o›–²½"äy©?„,êò)‘úl/ùYÿ¾>;‘z%Þò§™oÃÙì x¤k28m³/½¸À«ñV_é _ƒ·Ë/¯Èt±‡gÄ=»Ê¯…çTxö©ŒÜSÆî’=-]žœ¸.‚æF¼•/›¿Ûzò•OüÀ~ o­N Zÿ„f•Uù3mz~$¼M»Kþ[aÙJâ:û¯^úð}WûoåËÄʧñvñå÷èÁ ‰ZªXW ¢j% »âíV׺®§’bcÌ"Ø\o…Ÿúù´=½üò Riµ¿17€Üªv¿âí þÛp²ú¿\¨+"Ø¡=Øåkü·Yñvùå=Á‘T’ñ3`Qµϳ›²~ ¼¯á¹lØWñ¶¹oõäï€7 NÑ–)GpR<ͶÀÇÂÛ¯µ§câºT±z~›+ñvÆ»o—_^E·b_Ô9©ísámó xÛÜ€·+â…Q¾÷TpG¼]|yEn['‚僚2èn¿âí{šaçò!þ;Ê|H=Õ³.\ð©tÒ”ÿ6ñÂ3âÍ€Œ õFÞxZíW¸}%^¸(6Ù“0.ŒNãçôÕjó;³‚qˆ·ó½g_>$8tÛdǵȢ Ý>Üo›POaìl=k3J¢ÔƒäÈ(Å}Ú=œ¸àSÝÌ“ötðµÙñ†!œL-¿T·†ˆ¡þ-}’_û'>ÎäÛDÄ ¨wT+ÚV¼Í7H¡ڥ'8é NK¥žn›nO7ª2xuUšGõJ"êáñ¶ù%ççàmC "$âËS”DÔ~³žõÌ{ö~£8ÔI"µ.ôêV¼­g NºjÐI wW­ËõüšÓv&øn<‰‰@N¤[·žN’6’@Y¡"ÁYµ~8ë™ÿXAÜ”ˆº\Þ¢®ôq3fõIDATŸÍz– 8Aƒ§$XBT.äúÙ¬gÀakH¡“tg1¸ßwæJ‹Í”ô¾g–NY Ó¡Î[T±zp߃·O\ü«Š,W­¸¯Eíbcylô] nI^˜”­þô“^GnçÔ¸¿o­#8…U{]œYs¾ß‚·¹_þôÜÎ÷àÍ\׊ X}W‚ûYxÛL)³ Þ6û¶Ít’¢E•kÊ÷:K5p¥rYŽb,p8 sJbüøImáw¯>·ÁX~þ’ãÛL½yŽz“i4’6+¤®ÅÛ´lëI-×ñœ1Þ.j{Œ¾y:<˜šŠ¼ç3²Sõ"†*tû!ƒ\ ê•m£Í°¼œ§ò·ãïx’Íæ´¶Gþꃇ^ÆÛf(ÝVÎüL½ .vûGÔ“V‹z¥k45YwâΓS“=¯í±)Á8985’5ù’ƒ«'ÿ1óÜ dk„ú9Wü2ÞFè«ëkð¶9‹·©§žô2Oh0]õNg÷àL <Á­êÕü6žë»|§çöÂÛæ¡ðæ Î#-† «· Þ¦Å<ÀÛð¯Ó´|_¼Áög3 ÄŠ·Ï§¶®ÇÛõþÛOÄ[&xé¹»® üx«—ÀÛñÂæDní›â… è–O„ Ú®¨:›€þáÞ½›‰<Æçµ= ŒóxMèO¼ØÄÓ-P‚ ‹šocÀ­¨:¸ñîÁx«G"„õ¤ÎÈ Úõ9}ÃÓx¼äP–n³0Þhˆ´Ö¢ÖeÀ•Ð;ÉocK6¼Ú7k{œŽ;£]²™ÆÛÔÓ-ƒ·4mB±µfuõ¾ÿYh“"!'â“Öœïà­þ‘póÛQËaÅÛ#àm¾ªùc)a àŠá™ôÊ:Þæ ©pÒë¬Æa­1¬ga‚£ÁxžëV‚[Ïr€³" -8r+Á­gIÀ™¸ÔÞ;r+àÖ³¬ 'pÞÞkå¯Uûõ,xZ¨kÉ´dÅÛzg8ci ˆÅGkQk=KçÂIKI “/V5¸õ,Jp­tV”4¡¦ºF ëY܇#9_Óu0©µn=ËRœ6´YKtZ8–[?‘õ,Kq†k…‚¾vbm,_ÏÒ€³‚tË]ºzpëYüì;ŠØÄšYÏ|8Zud:+ø:9³žåMªÞ¢r¹íÖ*êzîAq[…[î•^ñ¶ž;à ”´ºýŠ·õÜq{hƒ3¿¤r=?q¸æ~Üzî5¨äVÅŠ·õÜ q’|¸5 ·ž»ôáÖ3ë¹›×™pë¹#àäÚ·ž{šT(Þ¯eÔõÜál'u»n=w TפÈzîÉq+àÖsoÄ­ÂzÖ³žßzþ?pDz~O$HIEND®B`‚Kajiki-0.8.2/docs/media/icon.xcf0000644000076500000240000015346712554436352016470 0ustar amolstaff00000000000000gimp xcf v001o.)ÿÿÿÌÌÌf33f™™™3ff33f3f33fff333f™™ff™™ÌÌff3™™3f™33™3™™™Ì3™™ffÌf™Ìÿÿf™Ì™Ìÿ3™ÿ3fÌfÌfÌÌf™ÿ3ÌfÿÿfÌÿffÿ3f333Ì™™BBgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) f% 5þÔÑI@Fast Text, XML, and HTML ...ÿ     åØ jgimp-text-layerN(text "Fast Text, XML, and HTML\ntemplating for Python") (font "Verdana") (font-size 22.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 329.000000) (box-height 64.000000) (box-unit pixels) MI@mBNZI@‘æ œõ: ÿ' ÿ ÿÿ ÿÿ!ÿÿÿ!ÿÿÿ ÷€¹äúøà¥.õ#˜ÜùöØ¡Oÿÿ ÿÿ ÿý÷:ý:ôÿÿÿ ÿ ÿöÔs,*¤ÿ¾öÌÿƒ"5vÓÿÿ ÿü ÿóüúÿÿÿÿ ÷4‚²ÑçøÿÿúÔÿ³6ÿÿÿý ­ÿÿ÷DôÿÿõÇ‹'ÿÿÿõ™ÿóŠI+ÿÿ÷{½îÿÿúQÿÿÿüìÿ7ÿû( ÿÛÿþÿÿüúÿ üÿÿü ÿùüøÿÿÿõÍÿ–hÝÿÿöÔu3 €ÿÊúÐÿ¬ÿÿýJýÿÿüÅÿÿÿýô9þ]ÿÿ ÿÿ öFÇùõÆcÿÿ÷H Ú÷úà%ùUÅóýíÈ ÿþÿ=ÿÿ6ÿÿ6ÿÿ6ÿÿ÷ØöòÆaÿð rÉôôÇU}ÏôöÇHÿ÷]½ï÷Ðlÿÿý;íÿÿþšÿþçÿÿýœíÿÿýý?ÿþÌÿÿþžÿÿôëÿš*[íÿKÿïó„' ·ÿÿó…'"¸ÿ¶ÿöè|*qûÿIÿÿüˆÿ‘üUÿ¯ÿþû-ÿøü.ÿíÿþ ü‚ÿ¬ÿÿüÓÿü ÿäÿü ÿþü ÿþÿü&ÿâÿÿþõÿÿþúÿÿÿÿüÿùÿÿþ÷ÿÿÿÿÿÿü ÿòÿÿþüÛÿ ÿÿÿÿü:ÿÎÿüøÿü”ÿ~ ÿÿÿÿü°ÿ€ÿúÐÿ¬ôòÿ¡<9vÐÿÿÿÿöo(3­ÿêÿþ]ÿÿýBìÿÿÿÿÿÿýî;ÿùUÅóýíÈö}ÇïüñËŒ<ÿÿÿÿøkÃñûà•ÿ/ÿ=ÿ=ÿ=ÿQÀÿ1ü«ÿ¹þ·ÿÿÿûêÿ^ýVÿÿûVÿìüåÿÿü«ÿ¦ü’ÿ«÷ØöòÆaû£ÿÍùËÿ ÿÿöëÿK2üêý;íÿÿþšû ÛÿƒùtÿÕ ÿÿøVÿâËÿVôëÿš*[íÿKö3ùü6#öõ+ÿú¬ÿ×ÿ«üˆÿ‘üUÿ¯ørÿØ ½ÿaÿúëÿìüÓÿü ÿäù¶ÿÏÿ¡ÿúëÿ÷&þõÿÿþúúæÿØ ÿù«ÿÇÿÃþ÷ÿÿúãÿéÿøVÿËÐÿküÛÿ ù²ÿÁÿ¹ÿþñëü36ýó”ÿ~ øoÿµÏÿuüøÿü«ÿ‘ï“ÿ·òÿ¡<9vÐö1ùó.ùú4úÐÿ¬ûÿÿà ûVÿå üäÿýBìÿÿû Úÿnû{ÿÛ þ]ÿÿûhÿÿJûêÿUýQÿð}ÇïüñËŒ<¢ÿÇûÊÿ£ùUÅóýíÈü²ÿÑ ü«ÿ¶þ°$ûôÿY:ûGÿÝ:ü‘ÿh;üÛç-ÿ4ÿÿ4ÿ=ÿ0÷€¹äúøà¥.ÿÿÿøV½ñõÄDöŽÜúð½aòÿ ÿý÷:ÿÿÿþºÿÿýü<ý9íÿÿ öÔs,*¤ÿ¾ÿÿÿ÷òƒ''Âÿµôéÿ³6 1wÿÿü ÿóÿÿÿþü4ÿìû„ÿµÿ ÷4‚²Ñçøÿÿÿÿÿü ÿþüÑÿ<ÿ ý ­ÿÿÿÿÿÿüóÿ ÿ õ™ÿóŠI+ÿÿÿÿÿÿüúÿÿ üìÿ7ÿÿþÿÿÿüåÿ#ÿ üúÿ üÿÿüøÿÿÿÿü®ÿyüÿÿ õÍÿ–hÝÿÿúÐÿ¬ÿÿÿôIÿøi#lÜÿÿ ýJýÿÿüÅÿÿþ]ÿÿÿÿÿþ˜ÿÿüÛÿû öFÇùõÆcÿÿõUÅóýíÈÿÿÿÿõdÌöõÐw ÿè;ü;ÿ´4õ×|6ZãÿN4ÿþ5÷‰Ãéû÷àªFLÀýÿªÿþ<û%üÿÿÿ%ýêÿþ¼þŸÿÿÿ%þUÿüáÿ=ú ûàÿÿÿ*ÿühÿ¾ú˜ÿfÿÿÿ*ÿûâÿ?ùùáÿÿÿ÷€¹äúøà¥.ÿûkÿÀù‘ÿgÿÿÿÿý÷:ÿòäÿAöáÿÿÿöÔs,*¤ÿ¾ÿônÿÁŠÿhÿÿÿü ÿóÿôæÿUóâÿÿÿ÷4‚²Ñçøÿÿÿúqÿùÿjÿÿý ­ÿÿÿú èÿãÿÿõ™ÿóŠI+ÿÿÿüsÿkÿÿüìÿ7ÿÿ ÿÿüúÿ üÿÿþ_ÿ ÿÿ ûÿÿÃõÍÿ–hÝÿÿýíÿ ÿ ÿûhÿÿJýJýÿÿüÅÿÿýÿ¬ÿ ÿ ÿü²ÿÑ öFÇùõÆcÿÿ%ûôÿY:ûGÿÝ:ü‘ÿh;üÛçÚúAÅ÷úà8ý7ûÿÿÿúûé¹\û¯ÿ™ ÿý²üéþ!ÿùkòÿvýýò"ÿüVÿÕ ÿø3ªçúç©2ÿúXÉùóÿ÷ ÿ÷ÌÿXú\ÿËÿÿý_üÿÿýû[ÿþ¤ÿÿ ÿ÷ÿïeÿ¸ü»ÿaÿô)ùÿŒ  Œÿø'ÿüòw ÿötÿ· òýûýî ÿü™ÿ”ü•ÿ—ÿþ% ÿù*‡üÿCü—ÿzüzÿÿüÛÿ-ü.ÿÚÿÿýþsü0ÿÙüÙþ'ÿü÷ÿüÿöÿÿûüå«7øÉÿ;9ÿ¼ÿü÷ÿüÿöÿÿ øaÿœ˜ÿSÿüÜÿ/ü0ÿÚÿÿ ø ðòïåÿü™ÿ™üšÿ—ÿÿ ú“ÿ³ÿÿô*ùÿ!!‘ÿø(ÿÿ ú,ÿÿüÿý`üÿÿýû\ÿÿ üÅÿ®ÿø4ªèûèª3ÿÿ ü²ÿE:û*þÚ:ü¡ÿr:ûú÷:üÿ G—ÿ=ÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿÿÿ ÿÿÿÿøV½ñõÄDö‘ÝúñÃmÿÿ ÿÿÿÿþºÿÿýü<ý9íÿÿ ÿÿÿÿ÷òƒ''Âÿµôéÿ°5(jÿÿ ÿÿÿþü4ÿìü‚ÿ³ÿ ÿÿÿü ÿþüÑÿ:ÿ ÿÿÿÿÿüôÿ ÿ ÿÿÿÿÿüùÿÿ ÿÿÿÿÿüâÿ%ÿ ÿÿÿÿÿüªÿü ÿÿ ÿÿÿÿÿôCÿúo'wæÿÿ ÿÿÿÿÿþ‘ÿÿüÐÿÿ ÿÿÿÿÿöaËöôÆgÿÿ ÿÿÿÎÿ=ÿ4ÿÿ4ÿÿ4ÿÿ3ÿÿøV½ñõÄDø3ªçúç©2ÿøV½ñõÄDÿÿþºÿÿýü<ý_üÿÿýû[ÿþºÿÿýü<ÿÿ÷òƒ''Âÿµô)ùÿŒ  Œÿø'ÿ÷òƒ''Âÿµÿÿþü4ÿìü™ÿ”ü•ÿ—ÿþü4ÿìÿÿü ÿþüÛÿ-ü.ÿÚÿü ÿþÿÿÿü÷ÿüÿöÿÿÿÿÿü÷ÿüÿöÿÿÿþÿÿüÜÿ/ü0ÿÚÿÿüøÿÿÿü™ÿ™üšÿ—ÿÿúÐÿ¬ÿÿô*ùÿ!!‘ÿø(ÿÿþ]ÿÿÿÿý`üÿÿýû\ÿÿõUÅóýíÈÿÿÿø4ªèûèª3ÿÿQÀÿÿþ<û%üÿÿÿ&ÿÿþ¼þŸÿÿÿ*ÿüáÿ=ú ûàÿÿÿ*ÿühÿ¾ú˜ÿfÿÿÿ*ÿûâÿ?ùùáÿÿÿ*ÿûkÿÀù‘ÿgÿÿÿ*ÿòäÿAöáÿÿÿ*ÿônÿÁŠÿhÿÿÿ*ÿôæÿUóâÿÿÿ*ÿúqÿùÿjÿÿ*ÿú èÿãÿÿ*ÿüsÿkÿÿ*ÿ ÿÿ*ÿ ÿÿ*ÿ ÿ ÿ"ÿ ÿ ÿ _@@¤ R)ÿq カジキÿ     R  Kgimp-text-layer/(text "カジキ") (font "UnBatang Bold") (font-size 72.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 255.000000) (box-height 113.000000) (box-unit pixels) _ÿq{$ô%ÿq§Ú¬"«#,#õ$Y$å ù&ªÃ§e8þ¾ÿÿüò‚6þžÿÿýÕ&5ýàÿÿýë$5ýØÿÿþÂ6ýõÿÿþ5ýóÿÿýð 5þ=ÿÿþ‡6þ“ÿÿý÷5ýëÿÿþ•6þSÿÿýû6þ¹ÿÿþ ù%bž½Šü/f ý#þÿÿ÷*8Ss¬èÿÿýòKú-øÿÜ& ý—ÿÿüüèþÿ ÿýù?þÿÿýêCù 1\‰¸åÿÿýëþ•ÿÿúѳÅäþÿÿþ¡þVÿ%ÿýúýãÿÿøôÞο¸µÔÿÿþ3þQÿÿúØ[?# þ`ÿÿýôþ‡ÿÿúýÆŒl÷ÿÿþdþjÿÿýý`üþÿÿùÈlPÿÿýì þÿÿýíFú+ޱ.þÁÿÿþ… þ˜ÿÿþ”$þ;ÿÿýö þ»ÿÿþ]$þºÿÿþ“ þâÿÿþ%#þ9ÿÿýø ýþÿÿþí$þ¹ÿÿþ þDÿÿþ·#þGÿÿýó þ{ÿÿþy"ýÕÿÿþz þ»ÿÿþ:"þnÿÿýß ýõÿÿýö!ýóÿÿþP þFÿÿþ½"þ¸ÿÿþ® þ‘ÿÿþy!þhÿÿýî ýáÿÿþ0 ý.÷ÿÿþW þ9ÿÿýæý ×ÿÿþ¢ þÿÿþžý´ÿÿýÓ ýéÿÿþNþŒÿÿýï& þOÿÿýñþrÿÿýù@þ¯ÿÿþ¤þeÿÿýýYþýûÿÿþLýdýÿÿýþ_ú´øœ!þ’ÿÿýäþuÿÿýýaþÿÿüú™ ý/úÿÿþƒ ý;ùDòþà—;8þ¡ÿÿýÄAýý3õÿÿý©÷„üÿ÷×§fý-ÝÿÿýïWþàÿÿüý®8ýÄÿÿþ‡ýjýÿÿý°ÿÿþˆ÷JT51Æÿÿý¦ÿÿþAþ‹ÿÿùð 1aíÿÿý°ÿÿþ®þ®ÿÿû®!½ÿÿý ÐÿÿþÊý+àÿÿû÷l ÿÿ ýãÿÿþ›ý ™ÿÿú¤…þÿ ù±ÿÿÆ ý]ùÿÿû˜A¼"ý ýLúÿÿþ56þlÿÿþ|7þ¢ÿÿþe7ýµÿÿýã8÷kµ‘ö±çéÖ®{5ü²ÿþxÿÿüæ)û³ÿÿý1ðÿÿýÇAý±ÿÿü˜úÿÿýŒý ·ÿÿü £þÿÿþ~ýÆÿÿþÝý6ÒÿÿýøýÔÿÿýï+ý‘ÿÿþ,ý8èÿÿýö;þyÿÿýüýY÷ÿÿýûLùTèÿÿþ|ý‹ÿÿýþ_ ûIZ&ýÁÿÿþs4ýAæÿÿýþp3ü‡ýÿÿýýc3ý$ÊÿÿýûX2ümõÿÿý÷M2ý#Áÿÿýç81ürõÿÿýÌ1ý5Ïÿÿý¨ 0ü“ýÿÿýý{0üdêÿÿýâ@0ý9Ëÿÿýª/ü ¦þÿÿýóa&ú,ÁµVü$—øÿÿýÅ$'þÑÿÿùð§u†Æþÿÿüõpjþ:öE«âþþêŇ+4þoÿÿüþ•2þÇÿÿþŽ2ý/Ýÿÿý÷ 2ü[Ëÿÿþ,4ý™ÿÿþ 5ýËÿÿþ ý©'þ>ÿÿþ+ üÿÝ'þÌÿÿþU ÿþ·'þiÿÿþˆúOwXÿÿþ&ýûÿÿþ¿üeâÿÿþ$'þºÿÿýöükÜÿÿýá'þjÿÿú=c²øÿÿüé·,(þÿÿþíÿ ÿ,ýæÿÿþþ'û8„Ðÿ ÿú÷ÇLûgû"c§ìÿ ÿúï³x; þÃÿÿûçÀ¼èÿ ÿûïn/ýÃQþ¿ÿÿýûýÿíþMÿ ÿûû¹ddÿÿþTýÿÚþ~ÿÿøËc õÿÿþœýÿ]ýXíÿÿý¸Bþ¬ÿÿþãþ³øvÄæÛ˜.þYÿÿþ-üE-ý øÿÿþuû,„àÿ/þ³ÿÿù½5…×ÿÿ0þ`ÿÿüù›æÿÿ0ýûÿ ÿ.ûT¶ýÿ ÿþý+ü3’ëÿ ÿûåT(ü%}Öÿ ÿûÑ€3ûRw9û3Ñÿ ÿþ!þ…ÿÿøè¯ƒp‚°ìÿ ÿýúãÿÿýã þÿÿúø±\Gÿÿþ5 ý(ùÿ ÿûþÁbýôÿÿþ‡!ý_ýÿ ÿüí‰#þ­ÿÿþÚ"ýMêÿÿüép þ^ÿÿþ/"ü’õÿÿüûŒ ýüÿÿþ†$ù\•¬Š$ þÀÿÿþÝ8þqÿÿþ97þ#ÿÿþ•8þÖÿÿýí7þ‰ÿÿþUÀ¡þ<üü:ÿþœ:ÿþÛ:ÿþŽ:üÊhyùK_YF5ü*Ÿ÷ÿÿýÁ'2þ´ÿÿýß1 ÿþ41 ÿýû1ÿýèW2ÿùⳌg=3ûÊ‹N¬ @ ýÿÿýúVþ“ÿÿøû¯W2àÿÿýûý·ÿÿýðEý«ÿÿþýÿÿþ¡ýÖÿÿýÜ+ýÿ ÿýþ)ýÜÿÿý¬ ýÿ ÿþœþ8ÿÿýâUþÿÿýîúgʱ`þ©ÿÿþY3ýëÿÿþ‘5þ|ÿÿý–5ý ËÿÿýåZ8úViC Õ @ýöÿÿýÂ$*þ»ÿ ÿüöp+þBÿ ÿýÉ'.þÿ ÿýž/ý§ÿÿýþy2ý‘ÿÿýý]5ý\ëÿÿýþe7ù|ÓøÚT ] @5þ<ÿÿþ»7ýíÿÿýþ'7þ§ÿÿþ–7þ^ÿÿý÷6þÿÿþˆ7þÔÿÿýñ6þ‘ÿÿþi6þFÿÿþÀ6ýåÿÿþ÷7þoÿÿþó7ýÃÿÿþµ8ùž÷ø½ :ý  øþ 8?ºRKajikiÿ     « Ggimp-text-layer+(text "Kajiki") (font "UnBatang Bold") (font-size 58.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 186.000000) (box-height 82.000000) (box-unit pixels) &þºR'5æ5òºR'>,µ2ý5r5z5ÞBþ"$$þþ$ $þþøÿÿþ¨þ¨ÿ ÿþ¨ýã÷ÿ ÿýó˜ý—ïÿ ÿýüšü Iðÿÿü¹(ý¢ÿÿúí–Nþwÿÿþ ýÎÿÿüýˆ þ:ÿÿþç þ‹ÿÿýéB"þ)ÿÿþÙ þUÿÿýÏ#þ(ÿÿþØý0õÿÿý¹ $þ(ÿÿþØýåÿÿý§%þ(ÿÿþØýÒÿÿý™&þ(ÿÿþØý¼ÿÿþ‘(þ(ÿÿþØþ ÿÿþû  þ(ÿÿþØþÿÿþŽùQ†»çúÿÿúýä¶w"þ(ÿÿþØþ`ÿÿþ‘üE±ùÿ ÿýý¡þ(ÿÿþØúLûÿÿ˜ý"¿ÿÿúÝ{WnÖÿÿþ(ÿÿþØù?÷ÿÿý2îÿÿý¦ý°ÿÿþ(ÿÿöØ4òÿÿ¢ý àÿÿýÎýûÿÿþ(ÿÿûØ)ëÿÿþ„þ\ÿÿþ<þ¾ÿÿþ(ÿÿüØ äÿÿýû4þŠÿÿþÃþ ÿÿþ(ÿÿýæÛÿÿýÕþnÿÿþOþÿÿþ(ÿÿþý ÏÿÿýØþÿÿþ(ÿÿýÜÈÿÿýþ@ù˜óÿï;þÿÿþ(ÿÿüØ1üÿÿýáü ü\áÿÿþ(ÿÿüØÿÿþ¨üsÞÿÿþ(ÿÿûØ åÿÿþ`ûk¾üÿÿþðÿÿþ(ÿÿûØPÿÿýô'û rÅþÿÿûõ™+ÿÿþ(ÿÿþØþ§ÿÿýÑü lËÿÿùÞtÿÿþ(ÿÿþØýêÿÿþ™ýXéÿÿüé\þÿÿþ(ÿÿþØþUÿÿþ] þƒÿÿýØþÿÿþ(ÿÿþØþ£ÿÿýõ- þXÿÿýù'þÿÿþ(ÿÿþØýßÿÿýÜýáÿÿþ«þÿÿþ(ÿÿþØý<üÿÿý¸þ9ÿÿþtþÿÿþ(ÿÿþØþzÿÿþþeÿÿþeþÿÿþ(ÿÿþØý³ÿÿþgþoÿÿþzþ—ÿÿþ(ÿÿþØýÝÿÿýüJþ_ÿÿþ²þÁÿÿþ*ÿÿþÚý*ðÿÿýô5þ1ÿÿýú&ý*þÿÿþ=ÿÿþîý?öÿÿýî/ýâÿÿýÓýÎÿÿþÿÿþ5ýEõÿÿýïDþkÿÿùñ’]_Šìÿÿú /gôÿÿúØL$ý4àÿÿüüŒ ý·ÿ ÿýå”ÿÿþøÿÿþ¨ü ‰ôÿÿýô;ýÊÿÿúû”Åÿÿþøÿÿþ¨û a©àÿÿþPüóÿÿüù£&û!Þÿÿ ø !6BJR÷ U‰¡°™aüt§?·þ6÷:]¤Èë¥ú8‡œ…; ùT’™w ûO¬Ðóÿÿþ´ý§ÿÿý¤ý#ÒÿÿýúbþŒÿÿþ´þ‘ÿÿþzýÖÿÿýû2û4¨óÿÿþ´ýõÿÿýëþEÿÿþ¢þJÿÿþ´þ$ÿÿþþlÿÿþÑý÷ÿÿþ´þÿÿþþgÿÿþÈþæÿÿþ´ýáÿÿþÚþ-ÿÿþŽþäÿÿþ´þ`ÿÿýþQþ¬ÿÿýèþäÿÿþ´ýw÷ÿÿýæRý­ÿÿýÆ(þäÿÿþ´úM`D û%V]1 þäÿÿþ´6þäÿÿþ´6þäÿÿþ´ýþ þäÿÿþ´öEl’¹àýkö*PwÄëþ$þäÿÿþ´þûe«Ñöÿÿþtú¶Ýüÿÿþ,þäÿÿþ´ýÛþ¼ÿÿþtþÿ ÿþ,þäÿÿþ´ü,ÿ·ûKˆ³ýÿÿþtûm—Ðÿÿþ,þäÿÿþ´úáÿÿ&þ‚ÿÿþtýËÿÿþ,þäÿÿþ´ýÄÿÿþ|þ8ÿÿþtþ„ÿÿþ,þäÿÿþ´þÿÿþ¤þ%ÿÿþtþqÿÿþ,þäÿÿþ´þNÿÿþ¼þ$ÿÿþtþpÿÿþ,þäÿÿþ´ýìÿÿþËþ$ÿÿþtþpÿÿþ,þäÿÿú´»ÿÿþÌþ$ÿÿþtþpÿÿþ,þäÿÿû´oÿÿû‡ÿÿÌþ$ÿÿþtþpÿÿþ,þäÿÿû´'öÿÿú‘ÿÿÌþ$ÿÿþtþpÿÿþ,þäÿÿü´ÉÿÿúgÿÿÌþ$ÿÿþtþpÿÿþ,þäÿÿý´xÿÿúó!ÿÿÌþ$ÿÿþtþpÿÿþ,þäÿÿýÚøÿÿûÀÿÿÌþ$ÿÿþtþpÿÿþ,þäÿÿýÏòÿÿþÌþ$ÿÿþtþpÿÿþ,þäÿÿý´uÿÿþÌþ$ÿÿþtþpÿÿþ,þäÿÿü´ØÿÿþÌþ$ÿÿþtþpÿÿþ,þäÿÿü´DÿÿþÌþ$ÿÿþtþpÿÿþ,þäÿÿû´žÿÿþÌþ$ÿÿþtþpÿÿþ,þäÿÿú´äÿÿþÌþ$ÿÿþtþpÿÿþ,þäÿÿþ´þIÿÿþÎþ$ÿÿþtþpÿÿþ,þäÿÿþ´þÿÿþßþ$ÿÿþtþpÿÿþ,þäÿÿþ´ýÉÿÿýø þ$ÿÿþtþpÿÿþ,þäÿÿþ´ýêÿÿþRþ$ÿÿþtþyÿÿþ7þìÿÿþ¿ý9÷ÿÿýà%þ$ÿÿþtþ©ÿÿþmþÿÿýíþVÿÿûùɹuþ$ÿÿþtú0sûÿÿõìX$ @¹ÿÿû¥+ÿþ·þ%ÿÿþsþpÿ ÿü,äÿ ÿþ´ÿûþÍsþ)ÿÿþoþpÿ ÿü,äÿ ÿþ´ú«œ|Qþ-ÿÿþh5þ8ÿÿþX5þFÿÿþ@5þ]ÿÿþ5þÿÿþé6þ¹ÿÿþª*€²ùT’™w 1ý#Òÿÿýúb/ýÖÿÿýû2.þEÿÿþ¢.þlÿÿþÑ.þgÿÿþÈ.þ-ÿÿþŽ/þ¬ÿÿýè/ý­ÿÿýÆ(2û%V]1®þ !ý-ellþ ö*PwÄëþ$ý¸ÿÿø ¶Ýüÿÿþ,þëÿÿùûÄ} ÿ ÿþ,ÿüñ‡ûm—Ðÿÿþ,ÿüþ‘ýËÿÿþ,ÿýÜ> þ„ÿÿþ,ÿý» þqÿÿþ,üÿ þpÿÿþ,þ‡þpÿÿþ,/þpÿÿþ,/þpÿÿþ,/þpÿÿþ,/þpÿÿþ,þþpÿÿþ,þpþpÿÿþ,ýø1 þpÿÿþ,üÿÛ þpÿÿþ,ÿþ¦ þpÿÿþ,ÿþm þpÿÿþ,ÿýûB þpÿÿþ,ÿýì" þpÿÿþ,ÿý×þpÿÿþ,ÿýÉ þpÿÿþ,ÿý¸þpÿÿþ,ÿý¶ þyÿÿþ7þþÿÿýÇþ©ÿÿþmýfþÿÿ÷åH0sûÿÿúìX$ý>Ùÿÿý{pÿ ÿþ,ùK›Òíüÿÿý”pÿ ÿþ,w€€€ ýöÿÿþV5þpÿÿýä4ýìÿÿþa4ý Àÿÿþ§4ý!ÇÿÿýŸ2ü(õÿÿýåZ3þÿÿûñ©T5ù¦ ‡c2³]).o. Backgroundÿ     6¥o.6ÉÔ¡Ô­Ô¹ÔÅo.78³9&@ûJ1JÞJæJîJöJþKK*R`tlyB情ƒ†îжоЯ{— ›²¤Å¯™¸/ôüÃÄÃÌÃÔÃÜÃäÅÅ&ŦϠϨϰϸÏÀÏÈÏÐÏØÏàÏèÓb  7 þ4ü3 0.ý.ý-ü,+þ 'ú (ô,ù0ü÷/ø  þþ2ø   ÿ7 ÿþÿÿ4ÿ3ÿ0ÿ.ÿ.ÿ-ÿ,ÿ+ÿ'ÿ(ÿ,ÿ0ÿ0ÿ3 ÿ€þ=:3 (ý !û ù"  ýý   þ€þÿ=ÿ:ÿ3ÿ(ÿ!%ÿýÿÿ ÿ¿þ<ý:û9ú  8ý 8ü þ6÷ 5ö 4ý û 3ýù2ö 2öþ0ýø  /üö /ý ûý.ï  -ýô ,ûý ú +ì *ýð *ü ö  )õ  ù (ïý 'ý î  'è &õö %ö û û %æ    %æ   #ä   " ùï  "ã !ð ö á    ý é  !þ þ ü ý þþü  þ þ þýô þþý øû þý ù û úü ô   ýó  ô  þï   ýýþð   ø üþï   ù ÷   þþ þü þ  üû ö õ    þ û üñ   øþ ô ú þ  ì       þþþþù üý ñþ þû  ù úþýþó   þ ûôþ  þù þ÷ þï  ù ûù   ùí þý þûüûõø¿þÿ<ÿ;ÿ:ÿ9ÿ8ÿ7ÿ6ÿ5 ÿ4 ÿ3 ÿ2 ÿ1 ÿ0ÿ0ÿ/ÿ.ÿ-ÿ,ÿ+ÿ+ÿ*ÿ)ÿ(ÿ(ÿ'ÿ&ÿ&ÿ&ÿ$ÿ#ÿ#ÿ"ÿ!ÿ!ÿ!ÿÿÿ!ÿ#ÿ%ÿ&ÿ(ÿ*ÿ-ÿ/ÿ0ÿ 2ÿ 5ÿ6ÿ8ÿ:ÿ;ÿþÿ>ÿHþ;û  ý 2ò  0ð     -ð ,ù ü,ô  ü ,ï   ,í  ,ýûú ,ý ó  -ø  ù -ô -û ÷ -ù ø.ó ý -ó ý-þõ-þû-þú û .ï .ùú.ùø  -ï.ï.ð-þüý -ùû -ñ   -ð,ø ÷ ,í  ,ô ü+ýñ  *ï  þ*ú úý) þñ  'ç     $ûú ö  ý  ÷  ý÷    ñøûô  øû â   ùô ú ü ûñû ô  ó  ö  ú úøî   ó  ã  ü ø ýï ý õ ñ  ÷   ú  ç   ÷ þü ù ïø  î  ê ð  û  ó  ì û ù ø þø î æ     þð  ç     õ üõ à  ú æ   øõ    ö ü ô  ú    öýõ ý ç   þôþú é þüý þÖ         Hþÿ;ÿ3ýÿÿ ÿ1ÿ.ÿ-ÿ-ÿ-ÿ-ÿ-ÿ-ÿ.ÿ.ÿ.ÿ.ÿ/ÿ.ÿ.ÿ.ÿ.ÿ/ÿ/ÿ/ÿ.ÿ/ÿ/ÿ.ÿ.ÿ.ÿ.ÿ-ÿ-ÿ-ÿ,ÿ+ÿ+ÿ*ÿ(ÿ%ÿ!ÿ !ÿ!ÿ$ÿ$ÿ(ÿ,ÿ-ÿ/ÿ1ÿ 3ÿ 7ÿ8ÿ;ÿ>ÿþÿ?ÿû :÷6õ4ó 2õ 1 ò  /ø ö +ë *ÿ;ÿ7 ÿ5 ÿ3 ÿ2ÿ0ÿ,ÿ+ À À7÷ :û7ÿ;ÿ€þþö   þ  ò  ù  ù  ý  þå   ýø   î   û ý÷ ú   ü  ü þ ô  ò û ÷Õ        úý ñ ù  ë    í    ùí      úâ      û ñ    ø   ü÷  þþ ù  ø   ò ú þ  þñ'û   ýþø !ú ôú  þý û    üù % û ý ó    ù (ø ý  ù ÷ó   ó   ý ü   ù  ì  ø  ù  ÷  þ ú  ô  üþû  î      ú  ÷ "ø ÷  ý #ù  þ ø &ö  ô & öö  'ô   ÷   (ò  ü  ( ñ  )ð   * î   )ê    *ý  úû *ñ   þ +  ö -ô   -ø  ý þ.ï   .ý  ö 2ò   3ø  ý 3ô   5ö 6ø  7ø 9ù 9ú :û  ;ü =þ =þ¿ÿÿþÿ•ÿ;ÿ9ÿ7ÿ 3ÿ/ÿ+ÿ'ÿ'ÿ$ÿ ÿÿ"ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿÿÿÿÿÿÿ ÿ"ÿ$ÿ&ÿ'ÿ(ÿ)ÿ)ÿ*ÿ*ÿ*ÿ+ÿ+ÿ,ÿ-ÿ-ÿ/ÿ/ÿ1 ÿ3 ÿ4 ÿ6ÿ7ÿ7ÿ9ÿ:ÿ;ÿ<ÿ>þÿ=þÿ¿ûù ýû þå   ù üýô  ð ñþ ï  è  Ë     þû ã      â        Í           ÷    ü  ø   ï   ÷ ÷   ñ    þ ý   ò    û   þ  ú   ò  ñ   ö     ú! ü ýó  $ þüûþþ÷ üþúú !þý  ýú ý÷  þþõþþü ù ûþ üø ô  üûþè #  úþýùýø  ý þîú þ÷úúþü ùýýþþýú ûþüøþþöþúþûúú öüþû ýõ ûþñüøýüþ üýø úüüüþü ÷þùþø ô  þúþü þ úþøþý ñ  þõ  þþý û  ùüùþýüû ñ   ùþúô  úô þü ó   û úþûüù÷  ö ûüö ø ø ýþ þ ùü þú þþþý üþ÷ ýøþþûòþýúþþ þþý ô  þ þýýþþþû þûþö òøüöþõ þé ýüû ú ëøþè üú üø ûò óû ø ãù þû  úþþö ú ûö  ùþö ô  þúþøöó   ýþõþþý ò   üþî ö  úüýúû  ê   þ úò þí  ý û þ ñ  þòþç    öþþþ  ñ  û÷ ûð  ýù þ ü   þí  ýû  ò  þþ  ø   û €ÿþÿ=ÿ=ÿ=ÿ;ÿ9ÿ7ÿ6ÿ 5ÿ 2ÿ/ÿòæ  ì ø üúüõ  þõ õ÷ þú  ï ýþ è   ú þ óä   ûøþé  ú þûâ    þ þ ô   ö ÷Ù      ðû æ   ß  è    ö  ûõ ýüÞ     ìø  þú ï   ùç   ù þðýüñ   þ÷ ü è   ý ýü÷  õ  ï   þõ ú ü þ õ    ú   ûþ üá     þ þþú  ï   üþ÷  î  üþúû   ó   ûú ó    ñ    þ ñ  þþë þ þùþûþþþ üúþöýþþýþ þüýþû ÷øþ ý÷þþ÷ý úü þûûü ÷öûðùõûþüùþþüûüýýþúþþ þîòëõûúýýûþþþüôöúüçþüðýþüþþùþùýùùøüüþõùþúþüûþþ þøúùþøþþùþùþúû þþþþ þûþþ ûööþþûþüþþþþþþþþ÷þþþþ ü4þþ+þþþ  þþ þþþ=þ.þþþ,ÿè   'õ ö %þó   ÷  !ûë    ö÷ö   úòûùþ ñ  ü ÷ ýú ó &ý ý ý ð ú ù þù ô  üî ü ù  ø  ì   ýè   ñûü ö  þñüé  þù  þþú ù ýö ï   ý÷ûæ þ ýâ    þþö ýé øþî    î  ø ç ù ñ  û÷ üýú õüýý ý ûô  þ ûý  þþ û ú  þ÷ ü ù ÷ þ ûüþ þþ û þòûù  ÷ö  öý  ûú ø þù  þþþ þýþ ú ÷   ù þö  ñ    ýû  úñ  í   óüþè   þûû  þþã       ø  û þå      ýýó ù  î  þ ý üüß       û ú  î      þû  þþþþý   ÷   ýôþþ  ø  øüþþø  î ü ý  ç    þþ ú ù  úþþþ÷   û  ýýþþþù ë     üûþöú  ÷   üýþûþýûõüñú   û ô þý ú üü õõ ýþùþýúþþûûþýýûþïþþþüþúþøùüýþüþ þþùúþþóþ ýý þüúûúþþ þþüýþúüþüþþþþþùüý  þ ú þýþ þþùÿ(ÿ%ÿ"ÿ!"ÿ#ÿ&ÿ*ÿ*ÿ-ÿ1ÿ 2ÿ 5ÿ 8ÿ:ÿ<ÿ ÿ@þ=ù 8ü 7÷ 4ô 1õ  þ0ýõ  -ò  ý ,óþþ)é   &è  %ï   "þú  û !þ ýüþþøþô û þõûþþû ü öþþô ÷ ý þó û÷ þ þ ö  ÷  üþþüû  ü óýù üõ  úú  õ ÷  þúö û û ð þó  ûù  ù  î ù  ýù" ýþøî  üø þø ó   þû  ï  ø ñ    ýûö   úî   þî   úö   ü þ ñ  ñ   üõ  þ ï   þýí  ý ò  ýþýþ ò  ü  ò   üþú õ  ô   ýì    ù ù ú  ò ûþø ü  øú   ò þú ñ    þùúþý ï  ý  þþ þúþý õ  ö  þ  ýø  þþü ýø  ý üùýñ    üúþþ ö   ó  úþ ù  ô  ú õù  ô   ý @þÿ=ÿ9ÿ8 ÿ5 ÿ2 ÿ1ÿ.ÿ-ÿ*ÿ'ÿ&ÿ#ÿ"ÿ!ÿ"ÿ%ÿ&ÿ)ÿ+ÿ,ÿ/ÿ0ÿ2ÿ 3ÿ 6ÿ6ÿ9ÿ:ÿ:ÿ<ÿ=ÿÀÿ @=ü;:û86þ3ú2ù /üý-ú!ü ô þþ þ  ú î ø   üþ ü ý þ  þý û  î  ý  @ÿ=ÿ<ÿ:ÿ8ÿ6 ÿ3 ÿ2ÿ/ÿ-ÿ!ÿÿÿÿÿÿ ÿÿ ÿÿÿ¾ý :û 9ú  7ø   5ö 3û û 3ö1ò    0ü ø   /ý ý ü -þò  ,ú õ  ,ø ú  *÷  ý *þü ü þ (ý ý ü ý 'ý û ü ý &þû  ü ü $ þû ü û $ ý ü  ü  ú "ó   û ü "ô  ü û  "õ  üü !÷  ü ó    û ü þü ý û  ý ý ü üü üþü ü üû  ù  ü ü ü ú   ùü üû ú  ¾ÿ;ÿ:ÿ8ÿ6ÿ4 ÿ4 ÿ2 ÿ1 ÿ0ÿ.ÿ-ÿ-ÿ+ÿ*ÿ)ÿ(ÿ'ÿ%ÿ%ÿ#ÿ"ÿ"ÿ!ÿÿ ÿ!ÿ"ÿ#ÿ$ÿÒþ#õ  ô   ù  û  ú  ö    û ÷  û ø ú ú  ð   ú  ù ú  û ñ   ú  ñ    ûò    ü ì     üó    ý üõ   ýý õ   ü ý ÷  û üù   þýù  û ý ú û û û û  ý ü ýýû ý ü ü üþ ú  ýû ûüüý ü  ý ü!þû"ü#û$ý %ý &þ'üþ&ù 'ú(û)þ* ,þ,þ,Òÿþÿÿ# ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ! ÿ" ÿ# ÿ$ÿ%ÿ%ÿ&ÿ'ÿ'ÿ(ÿ)ÿ*ÿ+ÿ,þÿ,þÿ,ø   ùû ù þý  ùý þü üþ  ü üø þö  ó   û ñ  ú ô    ñ ò  û þù   û úø "ù ô "ú þõ  %ü úõ  &þó  )ï   *ú ö *÷ýý *ö ÷ *ú ó   *÷ þ û  +÷ û *üü þ+þü ü+ü,ü þþ+þþ +4ü ü 4û3ü 3ü 2þ24ü 2ü2ü 1ü 1ý1þ 1<<==ü<Å-ÿ,ÿ)ÿ)ÿ&ÿ&ÿ#ÿ"ÿ ÿ ÿ"ÿ#ÿ&ÿ'ÿ*ÿ*ÿ+ÿ+ÿ+ÿ+ÿþÿÿÿ,ÿÿÿ+ÿÿÿ+ÿÿÿ,ÿÿÿ,ÿÿþÿ+ÿÿþÿ+ÿÿ4ÿÿ5ÿÿ4ÿÿ4ÿÿ3ÿÿ3ÿÿ4ÿÿ3ÿÿ3ÿÿ2ÿÿ2ÿÿ2ÿþÿ1ÿ<ÿ<ÿ=ÿ=ÿ=ÿÅþþþý2üþ(ø 7û *þû ü þ"û ü  3þ üþþ ü/þ  ü .þ ýþý þ ýþþþ üþ þú   û þþü þ þþþþù þ ý*þ ýø  þþù  ú úþþþþü  þ û þþþü  öþþþþ û   þ û þûû ýû þ ÷ý ü ü  þûø  ü ý þ þþ÷  ýþþþú üùþû þþõ  ü ýþþþùþþô    þ ýúüø   ô  ýûú ü ûøþþþþù ü ð þõ ú  ýüþûõ   þ þþö  ü   þþú  þþ   õ  ý üõ    ü ü ýó   ý ý úýû  õ ýü ü  ý ó    ý $ü ô  ü+ýú  -ü ü  ü ,ù  ü ý ,ú  ü +ü ýý.ù ý +ô   ü -õ  ý .ö  ý -ú  þ ü .ù   ý / ý0ü þ ý0û ý 2ü ø1÷   ü2ú  þ 6ý  ý 9ÿþÿ=ÿ=ÿ<ÿÿ$ÿÿ ÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ%ÿÿ,ÿ-ÿ-ÿ-ÿ,ÿ.ÿ,ÿ.ÿ/ÿ.ÿ/ÿ0ÿ1ÿ1ÿ3 ÿ2 ÿ3 ÿ7ÿ:ÿþþþþþþ þþ þþùþþþþþþûùþ þþþþþþþ þþþ þþûûþþþþ!þþüþþþþ þ9û%þþ.þþ þþ3þ þAþ.þ$þcþ þ)þþ#þþ9Zþ=þþþû7þ6þþþþþþþþ û øú8þþþþûüþþ þûþþþþþúþ þ ûþ øý ùþþúùü þþþ   ûüü þþ ù þø þô  þþ ûü  ÷ôþñ ûþ ýñ þ-í  3ô  ;ü @ÿÿ9ÿ 5ÿ ÿ-ÿ*ÿ"ÿ ÿÿ-ÿþÿ ÿ4 ÿ<ÿ€ûþ û ì    þþþ í   úþúöþ õ ôþþ   û ö üþþû   ù øôþùî  þøõýøøüùûû ú úþìðþõöôú þûþþþýý û øþþûûþþóø þþõþü þþþþþ÷þþûûþþ þüþùøþ þþúþ#ûþöþøþþþ þ"þþ þþþüþ#þûþ$þþ%þ(þþþ$ þþþþþ*þƒEøþþþþ%þþþ þ  þþDþþ'þþþû!þþþþþúþ&þüþþ#ûûüþþúþþþ þ öþþüýøýþú÷ïùúþþüõ  ü÷ï ýÍ           ó  ü ü ù   ÷ û   ã  ÷ ôþû ø  û  ü ý þúý ù  ñû  ýî     þð  ýû î  ýñ  ÷ ö õ ú ð ý ÷ ÷ ýþþú  ýíü õ  þû !ý üþþü $þþú þ  Àÿþÿ=ÿ=ÿ:ÿ7ÿ0ÿþÿ )ÿ%ÿ$ÿ!ÿÿ ÿ"ÿ%ÿûüúþùô þûò ñ  þ û  õ üð   ýþ ùø  ý þþõ   í    þüù û ûó  þþþúý ÷ û  ÷  úþüþ÷  ùö   ù üû þã     õõ þ ü í   á   ò  ùþýè     üü ù ý ï  õ é      ùù þøù   ýùõ ùí  ù  ûû óüýö  ý ýüûõç     ã þë      üöúû í    þþôõ  îýøþ ô  þð÷þ ÷ øþû ûþýü ûüüþþþþú þüþ ýü þ÷þþ þøøþþ úþþ+þþüþþ þ þþþþþ þ þþ&þþþþ ú5þþþþþþýþþþþþþþþ þ&þþþþþûû þþûþþþþ ûþþþþûþþ þ þþûþþþ þþûûþõþþþìûøüöñýþþþüþúþüþüþÙ  þþüþ þ  ã         ø  ÷  ì  $ù ô+ ñ,û úý/ýú 1û ù 4ýú5ü þ8ý þ :ü;ÿ<ÿ<ÿ=ÿ>ÿþÿ ¿ÿ=ÿþÿþÿÿþÿÿþÿ$ÿ!ÿ%ÿ(ÿ,ÿ0ÿ1 ÿ5 ÿ6ÿ9ÿ;ÿ@þ=þ==û:û:÷   6þú 5ô 3ó     &ð      &þô    û &üü ý ,üûþ /ù-þô ,ù ÷(þþö%ùþý$ù    ö  þý ö  úù   ð ýù  ô üþþï     õüûü û ü  þø ýþý ó     ñ ü ù    ýó ü ü ü úý üô     þ  ûù   þú þó   þü þõ    ù  ýþ  þ  ý úõþ  ö  þþ þùø þþúþþý þþþþþþþû ÷ùüþ ý÷þþþþþþûþþþþþþþûþþþøûþþþþþøþþþþþþûþþþûüûþ þþûôþûþþöüþþù÷þùõýóûìûþþø   ì  ðþþø  þþ þ  ù  òÜ    ß        ñ      ð    æ   '÷  ü  ,î   /ô   1ú  @þÿ=þÿ=ÿ=ÿ;ÿ;ÿ7ÿ6 ÿ4ÿÿ&ÿ&ÿýÿ&ÿ-ÿ0ÿ-ÿ-ÿ(ÿ%ÿ$ÿ "ÿ%ÿ&ÿ)ÿ.ÿ4ÿýÿÿQÿþÿþÿþÿ%ÿ"ÿ#ÿÿÿÿ(ÿ,ÿ0 ÿ2ÿó   üüø  ù  ü ü ü ø  ò      ü ø ò    ü ü ø  ò  û ü ÷ ò   þü ü ýò ü  ý ø  ø  ü ü ü ü ý ù  ýü ü ü ý ó üü ü ü ó   ü ýý ý ü ý ü û  ü ü ý ø   ü ýû  û üñ   ü  ý üþþý ý û  û  ý ý ù   ü ü ü ü ýþ ô  ü üü  ü ð   ü  ü  þ ý ûý ý ü ü û  þø    üû  ü ü ð   ü  üü ú ø  ü õ    üð   ý ö   û ï    ö  û  û ï  ð   û ñ   ð   þí   ñ   ø ð   ñ   ø  ùø  ñ   ø ï     ò    ö   ð  ø  ü ÷   ý ì     û ýò   ø  ü û  ýã     û ý ä      û ý ä    û  ýæ    û  ûì    ö  ü ç    üýê   ü ù  ã      þüýê   ÷  å      ö  ø  ü  ï     ú ê      Ü     ýö  ñ   û ó þýú õ   þ üå    þüó     ý þï  $î    &þñ    ü ð  ò   þøüùøñ      ò ø  ô   õö   þü ó ù   ñ  Ý      Ý    %ÿ%ÿ%ÿ%ÿ&ÿ&ÿ&ÿ'ÿ&ÿ'ÿ'ÿ(ÿ(ÿ(ÿ(ÿ)ÿ*ÿ*ÿ)ÿ*ÿ+ÿ*ÿ+ÿ+ÿ+ÿ,ÿ.ÿ-ÿ,ÿ,ÿ+ÿ+ÿ+ÿ*ÿ)ÿ)ÿ)ÿ'ÿ'ÿ&ÿ%ÿ%ÿ%ÿ%ÿ$ÿ$ÿ$ÿ$ÿ#ÿ#ÿ#ÿ"ÿ"ÿ"ÿ"ÿ!ÿ!ÿ!ÿ!ÿ ÿ!ÿ!ÿ!ÿ!ÿ À À þý (ý  ýþ *ýþú +ý þ  -ý ý .ýþ0 ú þ/ý ú 2þ ü  2ü ü 4ýý 5ü ý 7ý ý 8 û 9ù  ;ü  ÿ)ÿ+ÿ,ÿ-ÿ/ÿ0ÿ0ÿ3 ÿ3 ÿ5 ÿ6ÿ8ÿ9ÿ:ÿ<ÿ <ü ¿<ÿÀý 5ú 7ú 8û 9ú  :û ;þ;==>þ ÿ6ÿ8ÿ9ÿ:ÿ;ÿ<ÿ<ÿ=ÿ=ÿ>þÿ Ý      Ý      Ý       Ü    à    Þ    Û     Û       ó  ê     Û         Ú         Þ      Û    é     ô   ó   ï    ô  ø  ô   ó   ù õ  ü ø  õ   ù ýý ý ý ú  ü ó   õ  ù ý ý ý  ø  üý ý ý ü üû óö   ú ý÷  ü ü ýý ÷ ÷  ýüý ý þýþ þ ý ý ü ü ýò   ü ý û ü ý ü ÷   þò   ü ýþ÷ ü ù ü ý ù  ü ýþ÷  ü ÷ ü ü ü ü ø  ýý ü ü ø  ý ÷  ü ø  ýü ü ü ù   ý ù ü ø   üñ    ù  ü ñ    ù  ýñ   ù  ñ    ü ù ò   ü ù   ñ     ü ù  ò   ü ù  ò    ü ù   ò  ü ú !ý÷  ü ú  !ô üû"ø  üü þ#ó  ü ú !ø  ý üû "ûüû  #ù ý ý û #ô  üû  $õ   ü ü $ô ü ý%õ  ü ý$ô   û  ü $ô   ü ý$ô  û  ü $ô  ü ý%û ü û  ý &ø  û  þ !ÿ!ÿ!ÿ"ÿ"ÿ"ÿ#ÿ#ÿ#ÿ#ÿ$ÿ$ÿ#ÿ#ÿ"ÿ"ÿ"ÿ!ÿ"ÿ!ÿ!ÿ ÿ ÿ ÿÿÿ ÿÿÿ ÿ ÿÿ ÿ ÿ!ÿ!ÿ!ÿ!ÿ ÿ!ÿ!ÿ!ÿ!ÿ!ÿ!ÿ!ÿ!ÿ"ÿ"ÿ#ÿ#ÿ"ÿ#ÿ$ÿ$ÿ%ÿ%ÿ&ÿ%ÿ%ÿ%ÿ%ÿ&ÿ'ÿ À À € € € € € € € € € € € € € € € €÷   ü ý&þü û ü &÷ ü ý&ø  û ý'÷  û  ý'÷   ü ý'ý ü ûü 'õ  ü ý (ø  û þ)ø û  ý (ø ü ý )ø  û ý(õ ü ý*ù û ü *÷  û  ý*ùû  ü *÷   ûý+ø  ü ü +ñ   ý+ñ    ý-ø ø  .ø  ù .ø  ú /ø  ú 1ù  û 2ù  ý 3ù ý 4ù  þ5ö 6÷ 8ù 8þ :ý<=ý ¿ÿ'ÿ'ÿ'ÿ(ÿ(ÿ(ÿ(ÿ)ÿ*ÿ)ÿ*ÿ)ÿ+ÿ+ÿ+ÿ+ÿ,ÿ,ÿ,ÿ.ÿ/ÿ/ÿ0ÿ2 ÿ3 ÿ4 ÿ5 ÿ6ÿ7ÿ9ÿ9ÿ;ÿ=ÿ=ÿÀ¬þ ,ý +ý+ü *ü *û )û)ú (ú  (ù 'ù'û 'û 'ú &÷  %õ    %÷ &÷  &ø'ø 'ø  )þ +,}¬þÿ,ÿ,ÿ,ÿ+ÿ+ÿ*ÿ*ÿ)ÿ)ÿ(ÿ(ÿ(ÿ'ÿ&ÿ& ÿ&ÿ'ÿ'ÿ(ÿ(ÿ*ÿ+ÿ,ÿ}7—›KM%&o.Selection Mask ÕGo.Õk××××+o.Ö?ÖCÖGÖKÖOÖSÖWÖ[Ö_ÖcÖgÖkÖoÖsÖwÖ{ÖÖƒÖ‡Ö‹ÖÖ“Ö—Ö›ÖŸÖ£Ö§Ö«Ö¯Ö³Ö·Ö»Ö¿ÖÃÖÇÖËÖÏÖÓÖ×ÖÛÖßÖãÖçÖëÖïÖóÖ÷ÖûÖÿ×ÿÿÿÿÿÿÿÿÿ Àÿÿÿÿÿÿÿÿÿÿ Àÿÿÿÿÿÿÿÿÿÿ Àÿÿÿÿÿÿÿÿÿÿ Àÿ €ÿ €ÿ €ÿ €ÿ €ÿ €ÿ €ÿ €ÿ €ÿrÿ7—›KM%&Kajiki-0.8.2/docs/xml-templates.rst0000644000076500000240000004024712554436352017274 0ustar amolstaff00000000000000.. testsetup:: * import kajiki ================================== Kajiki XML Templates ================================== Kajiki provides a full-featured XML-based template engine that guarantees well-formed output when generating HTML and XML. This document describes that language. Templates are XML files that include template directives that control how the template is rendered and expressions that are substituted into the generated text at render time. Please see :doc:`templating-basics` for general information on embedding Python code in templates. Output Modes ========================= Although Kajiki XML templates must be well-formed XML documents, Kajiki is capable of rendering HTML or XML. By default, Kajiki will inspect the doctype of the template to determine how to render: >>> tpl_text = ''' ... ... ... ...
... ... ...
... ... ''' >>> Template = kajiki.XMLTemplate(tpl_text) >>> print(Template().render().strip())
>>> # If we want to override the detected type, we can pass a 'mode' param >>> Template = kajiki.XMLTemplate(tpl_text, mode='xml') >>> print(Template().render().strip())
>>> # We can also omit the generated DOCTYPE by specifying the template >>> # is a fragment >>> Template = kajiki.XMLTemplate(tpl_text, mode='xml', is_fragment=True) >>> print(Template().render().strip())
.. note:: In Kajiki, you can use normal XML comments, and the comments will exist in the generated markup. If you wish the comments to be removed before rendering the document, you can begin the comment with the syntax ` ...
''') >>> print(Template().render())
Basic Expressions ========================= Let's start with a hello world template: >>> Template = kajiki.XMLTemplate('
Hello, $name!
') >>> print(Template(dict(name='world')).render())
Hello, world!
By default, the $-syntax picks up any identifiers following it, as well as any periods. If you want something more explicit, use the extended expression form as follows: >>> Template = kajiki.XMLTemplate('
Hello, 2+2 is ${2+2}
') >>> print(Template().render())
Hello, 2+2 is 4
If you wish to include a literal $, simply double it: >>> Template = kajiki.XMLTemplate('
The price is $$${price}
') >>> print(Template(dict(price='5.00')).render())
The price is $5.00
You can also include expressions in template attributes: >>> Template = kajiki.XMLTemplate('
Bar
') >>> print(Template(dict(foo='baz')).render())
Bar
Control Flow ============ Kajiki provides several directives that affect the rendering of a template. This section describes the various directives. Directives in text templates can either appear as special attributes on tags prefixed by `py:` or as standalone tags whose tagname is prefixed by `py:`. py:if, py:else ^^^^^^^^^^^^^^^ Only render the enclosed content if the expression evaluates to a truthy value: >>> Template = kajiki.XMLTemplate('
barbaz
') >>> print(Template(dict(foo=True)).render())
bar
>>> print(Template(dict(foo=False)).render())
baz
>>> Template = kajiki.XMLTemplate('
bar
') >>> print(Template(dict(foo=True)).render())
bar
>>> print(Template(dict(foo=False)).render())
py:switch, py:case, py:else ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Perform multiple tests to render one of several alternatives. The first matching `case` is rendered, and if no `case` matches, the `else` branch is rendered: >>> Template = kajiki.XMLTemplate('''
... $i is ... even ... odd ...
''') >>> print(Template(dict(i=4)).render())
4 is even
>>> print(Template(dict(i=3)).render())
3 is odd
py:for ^^^^^^^^^^^^^ Repeatedly render the content for each item in an iterable: >>> Template = kajiki.XMLTemplate('''
    ...
  • $x
  • ...
''') >>> print(Template(dict(sz=3)).render())
  • 0
  • 1
  • 2
py:def ^^^^^^^^^^^^^^ Defines a function that can be used elsewhere in the template: >>> Template = kajiki.XMLTemplate('''
evenodd
    ...
  • $x is ${evenness(x)}
  • ...
''') >>> print(Template(dict(sz=3)).render())
  • 0 is even
  • 1 is odd
  • 2 is even
py:call ^^^^^^^^^^^^^^^^^^ Call a function, passing a block of template code as a 'lambda' parameter. Note that this is a special case of calling when you wish to insert some templated text in the expansion of a function call. In normal circumstances, you would just use `${my_function(args)}`. >>> Template = kajiki.XMLTemplate('''
    ...
  • Quoth $speaker, ${caller(i)}
  • ...
Nevermore $n
''') >>> print(Template(dict(sz=3)).render())
  • Quoth the raven, Nevermore 0
  • Quoth the raven, Nevermore 1
  • Quoth the raven, Nevermore 2
py:include ^^^^^^^^^^^^^^^^^^^^^^^^ Includes the text of another template verbatim. The precise semantics of this tag depend on the `TemplateLoader` being used, as the `TemplateLoader` is used to parse the name of the template being included and render its contents into the current template. For instance, with the `FileLoader`, you might use the following: .. code-block:: xml whereas in the `PackageLoader` you would use .. code-block:: xml py:import ^^^^^^^^^^^^^^^^^^^^^^ With `py:import`, you can make the functions defined in another template available without expanding the full template in-place. Suppose that we saved the following template in a file `lib.xml`: .. code-block:: xml evenodd Then (using the `FileLoader`) we could write a template using the `evenness` function as follows: .. code-block:: xml
  • $i is ${lib.evenness(i)}
py:with ---------- Using `py:with`, you can temporarily assign variables values for the extent of the block: >>> Template = kajiki.XMLTemplate('''
...
$a
...
$a
...
$a
...
''') >>> print(Template().render())
foo
5
foo
Content Generation ========================= py:attrs ^^^^^^^^^^^^^^ With the `py:attrs` custom attribute, you can include dynamic attributes in an xml/html tag by passing a either a Python dict or a list of pairs: >>> Template = kajiki.XMLTemplate('
') >>> print(Template(dict(attrs={'id':'foo', 'class':'bar'})).render())
>>> print(Template(dict(attrs=[('id', 'foo'), ('class', 'bar')])).render())
Any attribute values that evaluate to `None` will not be emitted in the generated markup: >>> Template = kajiki.XMLTemplate('
') >>> print(Template(dict(attrs={'id':'foo', 'class':None})).render())
py:strip ^^^^^^^^^^^^^^ With ``py:strip``, you can remove the tag to which the attribute is attached without removing the content of the tag: >>> Template = kajiki.XMLTemplate('
Foo
') >>> print(Template().render())
Foo
As a shorthand, if the value of the ``py:strip`` attribute is empty, that has the same effect as using a truth value (i.e. the element is stripped). py:content ^^^^^^^^^^^^^^ With `py:content`, you can remove the tag to which the attribute is attached without removing the content of the tag: >>> Template = kajiki.XMLTemplate('
') >>> print(Template(dict(content="Foo")).render())
Foo
py:replace ^^^^^^^^^^^^^^ With `py:replace`, you can replace the entire tag to which the document is attached and its children: >>> Template = kajiki.XMLTemplate('
') >>> print(Template(dict(content="Foo")).render()) Foo Inheritance (py:extends, py:block) =================================== Kajiki supports a concept of inheritance whereby child templates can extend parent templates, replacing their "methods" (functions) and "blocks" (to be defined below). For instance, consider the following template "parent.xml": .. code-block:: xml
Hello, $name! Sincerely,
$name
${greet(to)}

It was good seeing you last Friday. Thanks for the gift!

${sign(from_)}
This would render to something similar to the following (assuming a context of `dict(to=Mark, from_=Rick)`: .. code-block:: xml
Hello, Mark!

It was good seeing you last friday. Thanks for the gift!

Sincerely,
Rick
Now we can extend "parent.xml" with "child.xml": .. code-block:: xml Dear $name: ${parent_block()}

And don't forget you owe me money!

Rendering this template would then give us: .. code-block:: xml
Dear, Mark:

It was good seeing you last friday. Thanks for the gift!

And don't forget you owe me money!

Sincerely,
Rick
Notice how in the child block, we have overridden both the block "body" and the function "greet." When overriding a block, we always have access to the parent template's block of the same name via the `parent_block()` function. If you ever need to access the parent template itself (perhaps to call another function), kajiki provides access to a special variable in child templates `parent`. Likewise, if a template is being extended, the variable `child` is available. Kajiki also provides the special variables `local` (the template currently being defined) and `self` (the child-most template of an inheritance chain). The following example illustrates these variables in a 3-level inheritance hierarchy: >>> parent = kajiki.XMLTemplate('''

Header name=$name

Footer
... id() = ${id()} ... local.id() = ${local.id()} ... self.id() = ${self.id()} ... child.id() = ${child.id()} ...
parent ... ${header()} ... ${body()} ... ${footer()} ...
''') >>> mid = kajiki.XMLTemplate('''mid''') >>> child=kajiki.XMLTemplate('''child
...

Child Body

... ${parent.body()} ...
''') >>> loader = kajiki.MockLoader({ ... 'parent.html':parent, ... 'mid.html':mid, ... 'child.html':child}) >>> Template = loader.import_('child.html') >>> print(Template(dict(name='Rick')).render())

Header name=Rick

Child Body

id() = child local.id() = parent self.id() = child child.id() = mid
Footer
Built-in functions ================== The following functions are available by default in template code, in addition to the standard built-ins that are available to all Python code. defined(name) ^^^^^^^^^^^^^ This function determines whether a variable of the specified name exists in the context data, and returns True if it does. When would you use it? Well, suppose you tried the following template snippet:

$user.name

If you don't pass, from your python code, a "user" variable to the template, the above code will fail with this exception: ``NameError: global name 'user' is not defined``. This is undesired! Following Genshi, Kajiki offers the ``defined()`` function to make that condition possible, so you can write this:

$user.name

literal(text) ^^^^^^^^^^^^^ All good templating languages escape text by default to avoid certain attacks. But sometimes you have an HTML snippet that you wish to include in a page, and you know the HTML is safe. The literal() function marks a given string as being safe for inclusion, meaning it will not be escaped in the serialization stage. Use this with care, as not escaping a user-provided string may allow malicious users to open your web site to cross-site scripting attacks. Example: ${literal(name_of_the_variable_containing_the_html)} Kajiki is a reimplementation of most of Genshi and, since Genshi has a ``Markup()`` function for the same purpose, we provide ``Markup()`` as a synonym, too. value_of(name, default=None) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This function returns the value of the variable with the specified name if such a variable is defined, and returns the value of the default parameter if no such variable is defined. Genshi has this, too. Example::
${explanation}
In the above example, the div will only appear in the output if the ``explanation`` variable exists in the context and has a truish value. (Remember in Python, None and the empty string are not truish, they are evaluated as False.) Tips on writing your templates ============================== Kajiki takes XML as input, with the exception that it recognizes HTML entities in addition to XML entities. (HTML has many more entities than XML; for instance, XML does not define `` ``). If your template contains complex content in `` This is not necessary when you are writing HTML because HTML defines that the content of ``